월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 고급편
private method 포함한 Controller @Aspect로 AOP 적용했을때의 의문점
안녕하세요. Controller에 AOP를 적용하는 과정에서 궁금한점이 있어 질문을 올립니다. 보통 handler method 는 private 으로 지정하진 않겠지만, 만일 private으로 지정해도 handler는 정상 동작하는 것으로 알고 있고 정상 동작도 확인하였습니다. 그런데, @Aspect 이용해서 해당 Controller의 Proxy를 빈으로 등록시켰을때 문제가 발생합니다. 우선, 첫번째 예상했던 것은 CGLIB는 상속을 이용하기에 private메서드는 상속을 못해서 handler가 정상동작하지 못할 것 같았습니다. 하지만 결과는 정상동작하는 것을 보았습니다. 어떻게 정상동작이 수행가능 한걸까요? 혹시, private handler의 경우는 바로 target메서드를 찾아 실행시키나 해서 stack trace를 봐보면 Enhancer객체에서 실행되는 것을 볼 수 있습니다. 물론, 이처럼 간단한 handler라면, 정상적으로 응답이 오지만 만일 해당 handler가 의존성주입된 객체를 사용하려고 한다면 Enhancer 객체는 상태를 갖지않는 proxy객체라 NullPointerException이 발생합니다. 의문점을 정리해보자면, `private handler는 어떻게 Enhancer객체에서 수행할 수 있을까? ` 입니다. 한번 reflection은 private메서드도 수행가능하기에 상속한 슈퍼클래스의 private 메서드를 이용해 정상 동작한다. 로 가정하고 생각해봤습니다. 그러면 또 꼬리의문이 드는데 슈퍼클래스의 private메서드를 이용한다면, 실제 target 메서드이므로 DI된 객체가 null이 되는 것이 의문 입니다.
- 해결됨스프링 핵심 원리 - 고급편
OrderControllerInterfaceProxy 에는 @GetMapping 을 명시하지 않아도 되나요?
안녕하세요. bean 등록 후 테스트 할 때 url 에 아래처럼 입력하는데요. /v1/request?itemId=hello 문득 생각해보니 OrderControllerInterfaceProxy 에는 @GetMapping 이 없는데 동작하는 것을 보니 인터페이스의 구현체에는 @GetMapping 을 명시하지 않아도 되는건가요?
- 미해결스프링 핵심 원리 - 고급편
@Bean 매서드 매개변수 주입
덕분에 강의 잘 듣고 있습니다 수동으로 빈생성시 orderController매서드에 매개변수("LogTrace logTrace")는 @Autowired선언 없이 어떻게 주입이 되는지 이해를 못하겠습니다.....
- 미해결스프링 핵심 원리 - 고급편
빈 후처리 관련 질문
안녕하세요 영한님~아래와 같은 부분이 궁금하여 여쭤봅니다.#. 빈 후처리 - 스프링 컨테이너가 생성한 Bean에 대해서 스프링컨테이너에 저장하기 전에 처리되는 과정#. AnnotationAwareAspectJAutoProxyCreator ( 자동프록시 생성기 ) - implementation 'org.springframework.boot:spring-boot-starter-aop' 라이브러리를 통해서 자동 Bean으로 등록된 AnnotationAwareAspectJAutoProxyCreator 후처리기를 통해서 @AspectJ, Advisor 내 Pointcut을 확인하여 자동 Proxy 등록해줌.#. 정리를 위한 질문 1. AnnotationAwareAspectJAutoProxyCreator - 프록시만 등록해주는 빈 후처리기이므로 프록시 생성 목적이 아닌 다른 목적의 빈 후처리를 하기 위해서는 BeanPostProcessor 구현한 객체를 Bean으로 등록하여 처리하는 것이 맞는지 궁금합니다. 2. 실무에서 자주 사용하는 빈 후처리기는 주로 무엇이 있는지 주제만 알려주시면 찾아보겠습니다.
- 미해결스프링 핵심 원리 - 고급편
Aop와 Filter...
갑자기 궁금한게 생겻는데요... Filter혹은 Interceptor도 공통의 관심 기능 관련해서 처리를 해주는게 아닌가 생각이 들더라고요 어떤것을 시작하기 전에 걸러주는 역할을 하는것인데 Aop의 경우에도 어느곳에 적용할 수 있는지 제어도 가능한데 Filter도 제어가 가능하니 두개를 어떻게 비교해야 좋을지 헷갈립니다.
- 미해결스프링 핵심 원리 - 고급편
Proxy.newProxyInstance 의 두번째 인자가 배열인 이유를 이해하지 못하겠습니다.
예를들어 interface TestInterfaceA { void testA(); } interface TestInterfaceB { void testB(); } 두개가 있다고 가정했을때 publiic TestImpl implements TestInterfaceA, TestInterfaceB { void testA(){ } void testB(){ } } 이렇게 인터페이스를 한개이상 구현할수 있어서 배열로 들어가야 되는건가요??
- 미해결스프링 핵심 원리 - 고급편
lambda 사용관련하여 질문이 있습니다
강의 매우 잘 듣고 있습니다. 전략패턴 강의를 듣다가 V1 ... V4로 리팩토링 하는 과정에서 람다를 사용하신 것을 보았습니다. 저는 강의를 들으면서 코틀린으로 실습을 진행하고 있는데 ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행")); 코틀린 언어를 사용하는 경우 위와 같이 람다를 사용할 수 없게 됩니다. 물론 저의 코틀린 실력이 부족한 탓이지만 간단한 이슈 때문에 신경쓰여서 다음 강의로 넘어가지 못하고 있습니다 ㅠㅠ 코틀린언어 사용시 위와같은 코드에서 람다를 어떻게 써야하는지 궁금합니다.
- 해결됨스프링 핵심 원리 - 고급편
OrderRepositoryInterfaceProxy에서 Log내용
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니요)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요 강의 너무 잘듣고 있습니다. 질문은 아니지만 OrderRepository 의 로그 내용이 "OrderRepository.request()" 가 아닌 .save()로 남겨야 더 의도에 맞는 것이지요?? 항상 좋은 강의 만들어주셔서 감사합니다. 업무에 도움이 많이 되고있습니다.
- 미해결스프링 핵심 원리 - 고급편
static 키워드에 대해 질문드립니다.
HelloTraceV1은 빈입니다. 빈에서 공통적으로 사용할 상수를 private static final로 정의하셨는데요. 이 경우 싱글톤이닌까 private final로 한다면 stack 영역에 저장되니 메모리를 좀더 아낄수있는게 아닌가요?
- 미해결스프링 핵심 원리 - 고급편
createNextId() 메서드에서 항상 새로운 객체를 생성하는 이유가 궁금합니다.
항상 영한선생님 강의 정말 잘 보고 있습니다. 그런데 제가 지식이 부족하여 질문을 하나 올립니다. 5분30초 쯤에 만드는 createNextId()메서드에서 항상 레벨에 1을 더해서 새로운 TraceId를 반환하는데 처음에 만들어진 객체에 1을 계속 더해서 갖고가는 것이 아니라 계속 새로운 객체를 생성하는 이유가 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
ThreadLocal 질문입니다
동시성 이슈를 ThreadLocal을 사용하여 해결하는 내용 잘 들었습니다. 강의를 들으면서 ThreadLocal 관련하여 궁금한 점이 있습니다. 갑자기 트래픽이 몰려서 수 많은 요청이 들어오게 될 경우 ThreadLocal에도 동시에 많은 TraceId를 쓰게 될텐데 메모리의 이슈는 없을까요? 제가 생각한 답변은 "WAS가 제공하고 있는 스레드 풀이 허용하는 범위 내에서의 요청은 문제없다." 인데 만약 아니라면 답변 부탁드립니다. 추가적으로 비동기 서버 환경(ex. Spring Webflux)에서도 수 많은 요청시 동일한 이슈는 없을지 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
ThreadLocal이 내부적으로 map을 구현한것이라면 쓰레드 삭제시 grabage collector가 작동하나요?
ThreadPool을 사용하지 않고 임시 thread를 만들어서 async하게 작동하도록 만든다고 가정할시, 임시 thread가 종료되면 ThreadPool에서 해당 value도 삭제되는지 궁금합니다. remove코드를 놓칠시 메모리누수의 원인이 되는지가 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
스프링 빈 생성 순서에 따라 프록시 객체가 주입되지 않을수도 있는지?
안녕하십니까, 강의 너무 잘 들었고, 실무에도 큰 도움이 될것 같습니다. 실무에 적용해보려고 테스트중인데, 잘 되지 않는 부분이 있어 문의 드립니다. @Aspect 로 어드바이저를 만들어, 특정 빈에 대해 프록시객체가 적용되길 기대하였는데, 그 빈을 주입받는 서비스에 가서 로그를 찍어보니, 프록시 객체가 주입된것이 아니고, 원래의 타겟 객체가 주입되어있었습니다. 표현식이 잘못된거나 한건 아니었습니다. 이것저것 해보다가 빈 생성 순서때문이 아닐까 싶어, 스프링 설정 파일에서 조정을 좀 했더니, 이번엔 잘 되더라구요, @Aspect 로 선언한 class 가 먼저 빈으로 등록이 되고, 원본 타겟이 이후에 빈으로 등록이 되어야만 정상적으로 AOP 가 적용되는것이 맞는걸까요?
- 미해결스프링 핵심 원리 - 고급편
프록시 적용 시 Controller 동작 원리
안녕하세요. 강의를 듣다가 문득 궁금한 점이 생겨 여쭤봅니다. 프록시를 이용하여 로그 추적기 적용 시 실제 Controller가 아닌 프록시 객체가 스프링 빈에 등록되는데 WAS에서 어떻게 실제 Controller에 명시된 @RequestMapping 을 인식하여 호출이 이루어지는지 궁금합니다. dispatcher servlet에서 RequestMappingHandlerMapping을 통하여 스프링 빈이 아닌 직접 @RequestMapping를 가진 실제 Controller를 얻어낸 후에 스프링 빈에서 호출되어서 작동하는 것이 맞을까요? 좋은 강의 항상 감사드립니다.
- 미해결스프링 핵심 원리 - 고급편
다형성 virtual table 성능 이슈
안녕하세요, 다형성을 사용하면서 virtual tabel look up으로 인한 이슈 경험하신 적이 있나요? 웹어플리케이션에서는 신경쓰지 않아도 되겠지만 혹시나 하는 마음에 질문 남깁니다!
- 미해결스프링 핵심 원리 - 고급편
의존관계 주입 가능 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 이번강의에서 CGLIB 는 구체클래스를 상속하여 프록시 객체를 생성하기 때문에 구체클래스로의 의존관계 주입이 가능하다고 말씀해주셨는데요, 이것이 CGLIB 의 장점(?) 인 것처럼 말씀해주셨는데 왜? 인지 궁금합니다. 1. 객체지향 프로그래밍에서는 객체 간 의존에서 인터페이스를 기반으로 의존할텐데 예시처럼 구체클래스를 사용하는 경우가 있어서 일까요? 2. 인터페이스를 기반으로 프록시 객체를 DI 받은 뒤에 구체 클래스(MemberServiceImpl) 로 캐스팅 하여 사용하는 경우가 있어서 일까요? AOP 를 처음 공부하다 보니 궁금한게 많네요 ^_ㅠ 답변 미리 감사드립니다.
- 미해결스프링 핵심 원리 - 고급편
포인트컷 지시자 단독 사용 관련해서 질문 있습니다.
args, @target 등은 실제 객체 인스턴스가 생성되고 실행될 때 어드바이스 적용 여부를 확인할 수 있다는 부분이 잘 이해가 가지 않습니다. 빈 후처리기에서 빈으로 넘어오는 클래스의 메소드 정보를 보면 args랑 매칭시킬수 있을것 같고 @target도 빈으로 넘어오는 클래스를 상속한 자손클래스에서 특정 애노테이션이 있는지 여부를 확인하면 프록시 적용 여부를 판단 할 수 있을것 같은데... 왜 무조건 프록시를 만들어 놓고 런닝타임에 객체 인스턴스가 넘어와야 어드바이스 적용 여부를 판단 할 수 있는것인지 궁금합니다!! 답 주시면 감사하겠습니다!
- 미해결스프링 핵심 원리 - 고급편
어드바이저 종류의 실행 순서 질문입니다.
스프링 AOP 구현6 - 어드바이스의 종류 마지막 내용 질문입니다. 어드바이스 실행 순서에서 - 실행 순서: @Around , @Before , @After , @AfterReturning , @AfterThrowing 위와 같이 나와 있는데 그 바로 아래에는 이런 내용이더라구요. - 어드바이스가 적용되는 순서는 이렇게 적용되지만, 호출 순서와 리턴 순서는 반대라는 점을 알아두자.이게 무슨 의미일까요? 실행 순서랑 호출 순서가 다른건가요?
- 미해결스프링 핵심 원리 - 고급편
영한님 질문드립니다
안녕하세요 영한님 질문 드리겠습니다 스프링 기반에서 유틸성 클래스를 만들때 (1)SomeUtil util = new SomeUtil(); 이런식으로 new 를 사용해 객체를 생성하는 방식 (2)org.apache.commons 의 StringUtils 와 같은 스태틱 메서드로 이루어진 클래스 (3)스프링빈(@Component 등) 위와 같이 세가지 방법으로 생각해볼 수 있을 것 같은데 1, 2, 3 방법을 선택하는 기준이 무엇인지 궁금합니다 질문1 (1)번과 (2), (3)번을 구분하는 방법으로는 해당 클래스가 상태를 가져야하는가 라고 있는데 상태를 가져야한다면 (1)번 그렇지 않다면 (2), (3)에서 고민을 한다고 알고 있습니다 이렇게 구분하는게 맞는지 알고 싶습니다 (결정짓는 요소가 상태뿐인건지 아니면 상태가 아니라 다른 여러 요소로 구분하는 것인지 잘 모르겠습니다) 질문2 (2), (3) 중에서 선택한다고 할때 이것을 나누는 기준에 대해 알고 싶습니다 https://www.facebook.com/devbeginner/posts/1011209305658104/ 이 게시물을 보면 http://kwon37xi.egloos.com/4844149 페이지로 연결이 되는데 내용을 읽어보니 facebook 에 타이틀로 되어있는 "Spring Bean과 Static Class는 언제 사용하는거지?" 라는 내용보다는 앞에서 예시를 들었던 (1)번과 (2)번을 나누는 것에 대한 글이라고 느껴졌습니다 static 함수 모음 클래스와 POJO Bean 을 구분하는 내용의 글인데 POJO Bean 이라는게 정확이 어떤 것인지 잘 모르겠지만 글 내용상으로는 스프링빈을 의미하는 것이 아니라 (1)번처럼 SomeUtil util = new SomeUtil(); 을 의미하는 것 같다고 느껴지는데 타이틀처럼 (2), (3)번을 구분하는 내용으로 받아들여도 되는건지 궁금합니다 (다른 포스팅의 내용에 대해 질문을 드리는게 예의가 아니지만 평소 궁금했던 것에 대한 내용이 많이 포함되어있어 링크를 남겼습니다) 질문3 스프링을 사용하면서 제일 중요한 부분이라 느껴져서 앞서드린 질문과 중복되는 내용의 질문 같지만 따로 구분해서 질문을 드립니다 스프링에서 유틸성 클래스(SMTP, FTP 등의 유틸 클래스)를 만들때 (1), (2), (3) 형식으로 만들 수 있을 것 같은데 이것을 확실히 구분하는 명확한 기준을 잘 모르겠습니다 영한님이 생각하시는 기준은 무엇인지 알고 싶습니다 질문과 관련해서 검색을 해보았는데 의외로 관련된 내용을 찾기가 어려워 질문을 드립니다 스프링을 사용하면서 여러 클래스를 생성하게 되는데 이 부분에 대한 이해가 없어서 고민이 될때가 있습니다 (혹시 이런 내용에 대해 언급하신 강의가 있다면 말씀 부탁드리겠습니다) 좋은 강의 잘 보고 있습니다 감사합니다
- 해결됨스프링 핵심 원리 - 고급편
메서드의 시그니처로 판단하기 때문에 정적이라는 뜻이 무엇인가요?
안녕하세요. 좋은 강의 잘 보고 있습니다 :)다름이 아니라 execution 은 메서드의 시그니처로 매개변수 타입을 판단하기 때문에 완전히 일치해야 하고 부모 타입으로 적용할 수 없다는게 기술적으로 어떤 이유인지 여쭤봐도 될까요. Method someMethod = Class.class.getMethod("someMethod", String.class); 앞서 excution()부분을 설명하실 때, 이렇게 리플렉션을 사용해서 someMethod 객체를 받은 뒤에 출력되는 시그니처들에서 매칭여부를 판단한다고 말씀하셨던 것 같은데요. 물론 여기에는 선언타입과 파라미터타입 모두 있고... 결국 그럼에도 excution에서는 선언타입은 부모 타입으로도 매칭이 되고, 파라미터타입은 완전히 타입이 일치해야 매칭이 된다고 해서, 사실 그냥 넘어가도 되긴 하지만 정확히 무슨 기술적인 차이가 있어서 그런지 궁금해서 여쭤봅니다. 단순히 선언 타입을 검사할 때는 intance of 를 사용하고 파라미터 타입을 검사할 때는 String.equals() 를 사용하는 건 아닐꺼 같고... 이유가 무엇인가요?