묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
복습방법 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요! 항상 친절한 답변 감사드립니다.스프링핵심원리 기본편을 수강완료 했는데요. 다음강의인 http강의를 바로 들어야할지 아니면 다시 기본편 복습을 해야할지 질문드립니다. 복습을 하게된다면 강의를 들으면서 코딩했던 코드들을 전부 날리고 다시 처음부터 코딩하는게 나을까요? 아니면 강의자료만 빠르게 훑고 http강의로 넘어가는게 나을까요?? 물론 사람마다 다르겠지만 어떻게 하는걸 추천하시는지 질문드립니다!
-
미해결스프링 핵심 원리 - 기본편
request scope bean 생성시점
안녕하세요!https://www.inflearn.com/questions/501975 비슷한 내용이 있지만 이해가 되지않아서 질문드립니다.앞서 request빈은 http요청이 오는시점에 생성되는것으로 알고있었는데요.그래서 " 코드에 Provider를 사용하게되면 DI가 일어나는 시점에 일단 의존관계주입으로 주입되는 구현체는 DependencyObjectProvider객체이다. Provider를 사용하게되면 http요청이 오는 시점에 스프링컨테이너에 MyLogger빈을 등록하고나서 나중에 getObject()로 request빈을 가져오는것이다. "이렇게 되는건줄 알았는데,강의에서는 ObjectProvider.getObject()를 호출하는 시점까지 request scope bean의 생성을 지연한다고 설명해주셨는데 그럼 Provider를 사용하면, http요청이 오는시점에 request scope bean이 생성되는것이 아니라, ObjectProvider.getObject()를 호출하는 시점에request scope bean이 스프링컨테이너에 생성되는건가요??
-
미해결스프링 핵심 원리 - 기본편
제가 이해한바가 맞을까요.. ?
이해가 안되서 강의를 돌려보다가 따로 정리해봤는데,1번. CoreApplication의 main메서드를 실행시키면 현재로서는 에러가 나는게 맞지만, 동작순서만 보자면 CoreApplication의 main메서드를 실행시키면 실행될때 스프링컨테이너가 생성되고 컴포넌트스캔이 되서 @Controller, @Service에 의해 각각LogDemoController, LogDemoService 빈 등록이 일어난다.그리고 또, main메서드가 실행되고있는동안(런타임동안=프로그램이 실행되고있는동안) DI가 일어난다. 그리고나서 고객이 localhost:8080/log-demo로 url을 입력하면 http요청이 들어온것이므로 이때 컴포넌트 스캔이되서 @Component에 의해 자동으로 MyLogger빈이 등록되고 초기화메소드가 실행된다. 그러고난후 @RequestMapping("log-demo")로 되어있으므로 logDemo()메소드를 실행하고, return "OK"로 응답을 준 후에 종료 메소드가 실행된다. 2번. 오류가 나는 이유를 3가지로 정리해봤는데 어떤게 더 적절한 이유일까요..?코드가 오류나는 이유는 런타임동안에 DI를 해야되는데 MyLogger가 request빈인데, 아직 http요청이 오지않아서, MyLogger빈이 생성되지않았고 그래서 의존관계주입이 안되니 오류나는것이다.요청이 들어오지않은 상태에서 DI를 하려니 오류가 발생하는거고, main메서드를 실행하고나서 요청이 오더라도 DI를하는시점에는 MyLogger빈이 스프링컨테이너에 없어서 오류나는것이다.스코프 리퀘스트를 붙이면 요청이 들어오는 시점에 빈이 생성되는데 요청이 들어오질않았으니 빈이없고, 없는 빈을 di하려해서 오류가 나는것이다. 이렇게 이해하면 될까요 ..?
-
미해결스프링 핵심 원리 - 기본편
필드주입이 되는 시점에 대해 질문드립니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의를 듣다가 필드주입이 언제 발생하는지에 대해 궁금한점이 있어서 질문드립니다.예를들면, 이 코드에서 필드주입이 있고, 디버깅을 해봤는데 필드주입을 통해 주입되는 구현체는 AnnotationConfigApplicationContext객체라는것을 확인했습니다. 근데 궁금한건 이 필드 주입이 되는 시점이 언제인지 궁금해서 질문드립니다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); 코드에 의해 ClientBean이 스프링빈으로 등록되고나서 필드주입이 발생하는건지 아니면 스프링빈으로 등록되는과정속에서 필드주입이 발생하는건지 질문드립니다.
-
미해결스프링 핵심 원리 - 기본편
주입 이후 초기화 함수 호출
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 강의를 듣다가 앞에 배운 부분과 충돌하는 부분이 있는 것 같이 질문을 남깁니다![8. 빈 생명주기 콜백]의 강의에서 초기화 메서드는 주입 완료 후에 적절히 호출된다는 내용을 배웠습니다. 강의노트 8장 3페이지에도 나온 내용입니다.따라서 hello.core.lifecycle 패키지의 NetworkClient에서는 setUrl로 url이 주입된 이후에 init( ) 메서드가 호출되었습니다.하지만 9장에서 hello.core.common 패키지의 MyLogger에서 soutm으로 메서드 로그를 출력해보니 init( ) 메서드가 먼저 호출되고 이후 setRequestUrl 메서드로 url이 주입되었습니다.주입(set메서드) 이후에 초기화 함수가 호출되는게 아닌가요?강의에서는 그렇게 배운 것 같은데MyLogger에서는 그 반대가 되니 어떤게 맞는건지 모르겠습니다.긴 글 읽어주셔서 감사합니다 :)
-
해결됨스프링 핵심 원리 - 기본편
궁금한 게 있는데요.
후반부에 좀 이해가 안 가는 게 있어서 복습 겸 앞부분 보고 있습니다. 그런데 분명 멤버 리포지토리와 멤버 서비스의 저장요소는 결국 save와 join이 담당을 하게 되는 건데, 굳이 이름을 join이라고 한 이유가 있나요? 사실 save라고 해도 잘 동작을 하는데, 굳이 이름을 join으로 바꿔서 한 이유가 무엇인가요? 사실 초반에 그것때문에 굉장히 햇갈렸거든요. 이제 와서 궁금증이 생겨서 질문드립니다.
-
해결됨스프링 핵심 원리 - 기본편
어떤 객체를 스프링 빈으로 등록해야하는지 잘 모르겠어요.
서포터님 안녕하세요! 항상 자세히 답변해주셔서 감사합니다!강의를 듣다가 문득 이런 의문점이 들었습니다.'어떤 객체를 스프링 빈으로 등록해야하는가?''어떤 객체를 스프링 빈으로 등록하지 말아야 하는가?일단, 강의에서 배웠듯 싱글톤이면 안되는 클래스(상태를 갖는 클래스)는 당연히 스프링 빈으로 등록해서는 안 된다고 생각합니다. 혹시 이 외에 스프링 빈으로 등록하지 않아야 하는 객체가 있을까요? 또, '이것만큼은 반드시 스프링 빈으로 관리해야한다'라는게 있는 지 궁금합니다! 서포터님 의견은 어떠신가요?
-
해결됨PHP 7+ 프로그래밍: 객체지향
csrfmiddelware 에러 질문입니다
Undefined property: stdClass::$csrfToken in /Users/ywkim/StudyPHP/php_blog/app/Middlewares/CsrfTokenMiddleware.php:12 Stack trace: #0 /Users/ywkim/StudyPHP/php_blog/app/Middlewares/CsrfTokenMiddleware.php(12): App\Providers\ErrorServiceProvider::App\Providers\{closure}(8, 'Undefined prope...', '/Users/ywkim/St...', 12, Array) #1 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Routing/RequestContext.php(82): App\Middlewares\CsrfTokenMiddleware::process() #2 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Routing/Route.php(36): Eclair\Routing\RequestContext->runMiddlewares() #3 /Users/ywkim/StudyPHP/php_blog/app/Providers/RouteServiceProvider.php(17): Eclair\Routing\Route::run() #4 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Application.php(32): App\Providers\RouteServiceProvider::boot() #5 [internal function]: Eclair\Application->Eclair\{closure}('App\\Providers\\R...', 4) #6 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Application.php(32): array_walk(Array, Object(Closure)) #7 /Users/ywkim/StudyPHP/php_blog/public/index.php(7): Eclair\Application->boot() #8 {main}<script> const $delete = document.getElementById('delete') $delete.addEventListener('click', () => { alert('/posts/' + '<?=$post->id?>'); fetch('/posts/' + '<?=$post->id?>', { method: 'delete', body: JSON.stringify({ _csrfToken: '<?=$_SESSION['CSRF_TOKEN']?>' }) }).then(() => { window.location = '/' }) }) </script>//delete post Route::add('delete', '/posts/{id}', '\App\Controllers\PostController::destroy', [ AuthMiddleware::class, RequireMiddleware::class, CsrfTokenMiddleware::class ]); script부분도 강사님꺼 복붙해서 똑같은데 라우터에CsrftokenMiddleware::class 만 추가하면 에러가 납니다.csrf 미들웨어 들어가있는 다른 라우터는 문제가 안되는데 delete할 때만 저렇게 에러가 나고 삭제처리가 안되네요..왜그런지 알 수 있을까요
-
미해결스프링 핵심 원리 - 기본편
@Component 가 없는데 @Autowired를 어떻게 쓸 수 있는 거죠?
@Component //<--가 들어가 있어야 Autowired를 쓸 수 있는 거 아닌가요? static class TestBean{ @Autowired(required = false) public void setNoBean1(Member noBean1){ System.out.println("noBean1 = " + noBean1); } @Autowired public void setNoBean2(@Nullable Member noBean2){ System.out.println("noBean2 = " + noBean2); } @Autowired public void setNoBean3(Optional<Member> noBean3){ System.out.println("noBean3 = " + noBean3); } }@Component를 붙여서 빈을 자동등록 하게 되면 수동등록으로 의존관계 주입을 해주는 설정 코드를 쓰지 않기 때문에 Autowired를 붙여서 의존관계 주입을 해주는 걸로 알고 있습니다.그런데 수업 예제에서는 @Component가 없는데 어떻게 Autowired가 붙을 수 있는 건가요?
-
해결됨스프링 핵심 원리 - 기본편
getBeansOfType 자동완성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스프링 빈 조회 - 상속관계에서 코딩 따라하는 중에,getBeansOfType 을 치고 안에 ~.class 를 입력하면 Map<String, ~> ... 와 같은 부분이 자동 입력되는 것을 보았습니다. 하지만 제가 동일하게 작업하면 아무리해도 자동입력이 되지 않아 계속 일일이 손으로 코딩하고 있습니다. 혹시 방법이 있는건지 알고싶습니다.
-
미해결스프링 핵심 원리 - 기본편
면접에서 DI가 뭐냐고 물어보면 어떻게 대답하죠?
어떤 클래스가 인터페이스에 의존하고 있을 때 어떤 구현객체를 주입할지는 오직 외부의 설정에서 결정되는 것을 의미합니다. 라고 대답하면 될까요 ㅠㅠ?코드로는 이해가 어느 정도 된 거 같은데 말로 설명하려 하니 어렵네요 ....
-
미해결스프링 핵심 원리 - 기본편
solid 면접에서 질문 받으면 어떻게 대답해야 하나요
solid 면접에서 질문 받으면 어떻게 대답해야 하나요?저의 언어로 정제하고 싶은데 알랑말랑 어렵네요 다른 분이 설명하신거 참고해서 나름대로 해석해 봤는데 이렇게 말해도 괜찮을까요? *SOLIDSRP: 단일 책임 원칙(single responsibility principle)한 클래스는 하나의 책임만 가져야 한다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 ᄄᆞ른 것SRP원리를 적용하면 책임 영역이 확실해지기 때문에 한 책임의변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로울 수 있습니다. OCP: 개방-폐쇄 원칙(Open/closed principle)소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 새로운 변경사항이 발생했을 때 객체를 직접 수정하지 않고도변경사항을 적용할 수 있도록 설계해야함을 말합니다 DI, IoC가 필요합니다. LSP: 리스코프 치환 원칙(Liksov substitution principle)객체는 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 한다. 클라이언트는 인터페이스 구현객체의 내부를 모르기 때문에 믿고 쓰기 위해선 인터페이스를 구현한 객체가 인터페이스의 사용 의도에 맞게 구현해야 된다는 것을 의미합니다. ISP: 인터페이스 분리 원칙(Interface segregation principle)특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다 특정 클래스에서 다 쓰지 않는 다양한 추상메서드가 들어간 커다란 인터페이스 보 다는 인터페이스를 특정 클라이언트에 맞게 구체적이게 쪼개는 것을 의미합니다. DIP: 의존관계 역전 원칙(Dependency inversion principle) 프로그래머는 추상화에 의존해야지 구체화에 의존하면 안된다. 클라이언트가 구현객체에 의존하는 것이 아닌클라이언트와 구현객체 사이에 인터페이스를 두고 클라이언트와 구현객체가인터페이스에 의존하여 구현객체를 변경해도 클라이언트에 변경이 없음을 의미합 니다.
-
해결됨스프링 핵심 원리 - 기본편
영한님 로드맵 jpa 강의 질문드립니다
현재 영한님의 스프링 완전 정복 로드맵을 따라 학습하고 있는데요.JPA 로드맵도 동시에 학습하려 하고 있습니다.JPA 로드맵 학습 전에 스프링 로드맵을 듣고 학습해야 좋을까요? 아니면 충분히 들을 수 있을만한 내용일까요?
-
미해결스프링 핵심 원리 - 기본편
Test 코드에서 this.memberService 질문
Test Code 부분에서 궁금한점이 생겨 질문 남깁니다.Test Code에서는 this.memberService = appConfig.memberService();로 사용하는 것과 차이점이 있나요? this.memberService = appConfig.memberService();memberService = appConfig.memberService();둘다 실행해봤을 때는 정상적으로 테스트 통과하긴 합니다
-
미해결Java TPC 실전프로젝트 (Java API 활용)
채팅관련 질문입니다
안녕하세요 !! 자바 TPC부터 스프1탄, 2탄 등 좋은 강의 잘 보고 있는 학생입니다 !항상 좋은 가르침 주셔서 감사드려요 ㅎㅎ다름이 아니라 해당 자바 기술을 통해 Spring FrameWork 환경에서 채팅 기능을 구현하고자 하는데요..아직 초보라서 어떤 객체에 어떤 내용을 담아야 하는지,화면에 구현할 때 실시간으로 대화가 진행되게 하려면 감이 안오는 상황입니다.. 명령 프롬프트에서가 아닌 웹 뷰 페이지 내에서도 채팅 기능 구현이 가능할까요 ,,?가능하다면 어떻게 할 수 있을까요 ..? ㅠㅠ주제에 조금 벗어난 질문일지 모르지만 웹 페이지에서도 구현이 하고 싶어 여쭈었습니다..!답변 남겨주시면 정말 감사드리겠습니다 ㅠㅠ
-
해결됨객체 지향 프로그래밍 입문
캡슐화 하는 이유에 대해서
클래스 메서드를 사용하는거랑 클래스선언없이 함수를 만들어서 사용하는거랑 어떤 차이가 있나요?요구사항이 변경됬을 때 클래스선언없이 함수만 사용해도 여러곳의 코드를 일일이 변경하지 않아도 되는 장점이 있다고 생각됩니다.이게 캡슐화랑 어떤 관련이 있나요?
-
해결됨스프링 핵심 원리 - 기본편
Bean Type 이 아닌 이름이 중복시
안녕하세요 강사님. Bean 생성 관련해서 여러가지 Test 를 해보다가 의문점이 생긴 부분이 있습니다. 빈 생성 이름이 중복되는 경우는 어떠한 기준으로 bean 을 생성하는 건가요?? Type 이 중복될 때처럼 실행시에 오류를 발생시키지 않는 것 같아서요!@Bean(name = "discountPolicy") public DiscountPolicy discountPolicy(){ System.out.println("AppSpringConfig.discountPolicy : Rate"); return new RateDiscountPolicy(); } @Bean(name = "discountPolicy") public DiscountPolicy discountPolicy2(){ System.out.println("AppSpringConfig.discountPolicy : Fix"); return new FixDiscountPolicy(); }다음과 같이 시도를 해봤을 때, 실행 창에는 Rate 만 출력이 되고, 만약 단순히 코드 위치를 변경할 경우 Fix 가 출력됩니다. 어떤 것을 먼저 읽었냐에 따라서 먼저 등록된 bean 을 유지시킨다고 봐도 되는 걸까요? 또한, ComponentScan 방법을 사용하여FixDiscountPolicy 에 @Component, RateDiscountPolicy에 @Component 를 달 경우 Bean type 중복된다라는 에러를 호출시켰고, 이에 관련하여 강의해주셨습니다. 그래서 @Primary 를 통해 우선권을 가지는 Bean 을 알려줬습니다. 하지만 위와 같이 Bean 등록을 할 경우 왜 같은 에러가 발생하지 않는지 궁금합니다! 둘다 DiscountPolicy 라는 역할 객체에 대한 구현 객체 두개가 등록되고 있는데, 왜 같은 에러가 발생하지 않는 걸까요? 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
Proxy My Logger 에 대한 간단한 질문
안녕하세요~! 간단한 질문이 있습니다! 혹시 그러면 Proxy 를 사용하게 되면 Bean Container 에는 진짜 MyLogger.class 가 등록될 일은 없는 걸까요? Proxy 를 사용하지 않으면 Request 가 들어오면 어쨌든 잠깐이라도 Bean Container 에 등록이 되었다가 폐기 되는 것으로 이해 했었습니다. 하지만 Proxy 를 사용하면 가짜 Porxy My Logger 가 싱글톤처럼 Bean 등록이 되고, 필요시 호출될 때마다 진짜 My Logger 를 사용하려는 클래스에 넘겨주게 되는 것이 맞을까요? (관리 객체는 클라이언트 객체: Controller, Service ).
-
미해결스프링 핵심 원리 - 기본편
getBean의 타입에 대해 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스프링 컨테이너에있는 스프링 빈을 찾아올때, getBean() 메서드를 통해 찾을수있다고 이해했는데요.메서드를 호출할때 getBean(이름, 타입) 의 형식으로 사용한다고 되어있는데1. 여기서 타입은 어떤 타입을 파라미터로 넣어줘야하는건가요? 예를들면 MemberService memberService = applicationContext.getBean("memberService", MemberService.class); 로 사용할수도있고, MemberServiceImpl memberService = applicationContext.getBean("memberService", MemberServiceImpl.class); 로 사용할수도있는데,어떤 타입을 파라미터로 넣어줘야하는건지 궁금합니다. 스프링빈의 타입인 객체타입(MemberServiceImpl)을 넣어줄수도있고, AppConfig 클래스에있는 memberService메서드의 리턴타입(MemberService) 을 넣어줄수도있는건가요? 일반메소드의 리턴타입처럼 getBean()을 통해서 얻은 객체를 어떤타입으로 받고자한다를 클래스타입으로 적어줘야하는건가요? 2. 그리고 타입을 파라미터로 넣어줄때 .class를 쓰는 이유가 궁급합니다. 예를들면 MemberService의 경우에는 인터페이스라서 MemberService.interface형식으로 넣어줘야할거같은데 .class를 붙여서 넣어주는 이유가 궁급합니다. 3. 1,2번의 질문들을 생각하면서 정리해봤는데, 타입부분에서 파라미터로 넘겨준 MemberService.class는 클래스타입=메서드의 리턴타입 = 역할타입 = 인터페이스타입 이고,MemberServiceImpl.class는 구체타입=객체타입=스프링빈타입이다. 이렇게 정리해봤는데 맞는건가요? 구글링도해보고, 게시판에 비슷한 글이 있나 찾아보기도 했는데 원하는 답변이 없어서 질문드립니다..
-
미해결스프링 핵심 원리 - 기본편
이 강의는 소스코드 파일이 별도로 제공되지 않나요?
다른강의에는 수업자료에 있는데 여기는 없는것 같아 글 남겨봅니다