월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 고급편
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() 를 사용하는 건 아닐꺼 같고... 이유가 무엇인가요?
- 미해결스프링 핵심 원리 - 고급편
doTransaction() 어드바이스의 return 값 의미가 궁금합니다.
안녕하세요. 좋은 강의 제공해주셔서 감사합니다. 문득... 강의를 보다 Object result 를 return 해주고 있어, 이 반환이 어떤 의미가 있는지 그리고 어느곳에서 사용을 하는지 궁금해 문의 드리고 싶습니다. 아래 코드의 7 Line 입니다. @Around("allOrder() && allService()")public Object doTransaction(ProceedingJoinPoint joinPoint) throws Throwable { try { log.info("[트랜잭션 시작] {}", joinPoint.getSignature()); Object result = joinPoint.proceed(); log.info("[트랜잭션 커밋] {}", joinPoint.getSignature()); return result; } catch (Exception e) { log.info("[트랜잭션 롤백] {}", joinPoint.getSignature()); throw e; } finally { log.info("[리소스 릴리즈] {}", joinPoint.getSignature()); }} 감사합니다.
- 해결됨스프링 핵심 원리 - 고급편
스프링 AOP에서 @Aspect 설정과 advisor 객체들의 관계가 궁금합니다.
스프링 AOP에서 @Aspect 설정과 advisor 객체들의 관계가 궁금합니다. 예를 들면 @Aspectpublic class AspectClass { @PointCut("...");private void pointCut1(){} @PointCut("...");private void pointCut2(){} @Before("pointCut1() && pointCut2()")public void doBefore(JoinPoint joinPoint){}@After("pointCut1()")public void doAfter1(JoinPoint joinPoint){}@After("pointCut1()")public void doAfter2(JoinPoint joinPoint){}} 이런 설정이 있다면 빈 후처리기 안에 있는 advisor 객체들은 총 3개가 되는 건가요? 1pointCut1() && pointCut2() 설정으로 생성된 포인트 컷 객체 1개 + doBefore() 설정으로 만들어진 advice 객체 1개= advisor 객체 1개 2pointCut1() 설정으로 만들어진 포인트 컷 객체 1개 + doAfter1() 설정으로 만들어진 advice 객체 1개 = advisor 객체 1개 3ponitCut1() 설정으로 만들어진 포인트 컷 객체 1개 + doAfter2() 설정으로 만들어진 advice 객체 1개 = advisor 객체 1개총 3 개이렇게 결국 advice 설정 함수만큼 advisor가 생성 되는 것인지 궁금합니다. <추가질문>@PointCut 설정으로 서브 포인트 컷 객체들이 만들어져서, 그것들이 조합되는 형식으로 스프링의 pointcut객체들이 만들어지나요? 위의 예로 치면 서브 포인트 컷 객체들이 2개(pointCut1(), pointCut2())이고, 서브 포인트 컷 객체들로 조합해서 만들어진 스프링 포인트 컷 객체가 2개(pointCut1() 서브 포인트 컷으로 만들어진 포인트 컷 객체, pointCut1() 서브 포인트 컷과 pointCut2() 서브 포인트 컷으로 만들어진 포인트 컷 객체)가 되는 것인가요?
- 미해결스프링 핵심 원리 - 고급편
섹션 8. @Aspect AOP의 강의에서 질문
섹션 8. @Aspect AOP의 강의에서 질문드리고 싶은 내용이 있습니다. package hello.proxy.config.v6_aop.aspect; @Slf4j @Aspect public class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* hello.proxy.app..*(..))") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { TraceStatus status = null; try { String message = joinPoint.getSignature().toShortString(); status = logTrace.begin(message); //로직 호출 Object result = joinPoint.proceed(); logTrace.end(status); return result; } catch (Exception e) { logTrace.exception(status, e); throw e; } } } 에서 //로직 호출 Object result = joinPoint.proceed(); 이 부분이 혼동이 되는 부분이 있습니다. 아래의 코드를 봐주십시오. package hello.proxy.app.v3; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController public class OrderControllerV3 { private final OrderServiceV3 orderService; public OrderControllerV3(OrderServiceV3 orderService) { this.orderService = orderService; } @GetMapping("/v3/request") public String request(String itemId) { orderService.orderItem(itemId); return "ok"; } @GetMapping("/v3/no-log") public String noLog() { return "ok"; } } /v3/request에 접속하는 순간 로그가 기록되고, 핵심 로직이 실행되는데요. Object result = joinPoint.proceed(); 에서 joinPoint.proceed()이 실행되면 request 메소드가 실행되고, Object result에는 "ok"라는 문자열이 저장되는 것인가요? 두서없는 질문 죄송합니다. 읽어주셔서 감사합니다.
- 미해결스프링 핵심 원리 - 고급편
AutoProxyCreator와 BeanFactoryAspectJAdvisorsBuilder의 관계
안녕하세요 영한님 강의 잘 수강하고 있습니다. 8. @Aspect AOP 이 부분에 대해서 공부하고 있습니다. 첫번째 질문 5번째 페이지를 보면, @Aspect 를 찾아서 이것을 Advisor 로 만들어준다. 쉽게 이야기해서 지금까지 학습한 기능에 @Aspect 를 Advisor 로 변환해서 저장하는 기능도 한다. 6번째 페이지를 보면, BeanFactoryAspectJAdvisorsBuilder 클래스이다. @Aspect 의 정보를 기반으로 포인트컷, 어드바이스, 어드바이저를 생성하고 보관하는 것을 담당한다. AutoProxyCreator와 AdvisorBuilder 모두 어드바이저를 생성하는 것처럼 이해가 됩니다. @Aspect를 스캔하고 어드바이저를 생성하는게 둘 중 어느것인가요? 어드바이저 빌더가 @Aspect로 생성된 어드바이저를 관리하는건 이해가 되는데, 어드바이저를 생성하는게 어느것인지 궁금합니다. 2번째 질문 + @Aspect로 생성된 어드바이저는 스프링 빈이 아닌가요? 그림 상에서 스프링 컨테이너 외부에 표현되어 있어서 헷갈립니다
- 미해결스프링 핵심 원리 - 고급편
프록시의 필요성
안녕하세요! 프록시 필요성에 대해 궁금해서 질문 합니다. 보통 아키텍처를 구현할때 client 가 있고 프론트를 거쳐서 백단(서버)쪽 으로 가기전에 프록시서버를 두잖아요? 선생님께서 말씀하신 프록시서버의 장점. 캐시, 접근제어 또는 보안 등등이 이미 '프록시서버'에서 필터링이 되는 부분인데. 굳이 자바단에서 까지 코드를 프록시를 써서 코드를 구현해야할까? 라는 생각이 듭니다. 즉슨, 강의에서 처럼 JDK 동적프록시 또는 CGLIB 과같은 것을 이용하여 프록시를 만들어서 코드 구현을 많이하나요?