월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 고급편
오타 정정
안녕하세요, 강의자료를 보다가 오타를 발견해서 제보합니다! 🙋♂️ '쉽게 기억하기' 의 2번째 줄 조언을 해야할지 할지 알고 있다. 할지 2번 나옵니다!! 👀
- 미해결스프링 핵심 원리 - 고급편
execution 색이 안들어오는 경우
안녕하세요! 코드를 따라치다보니 강의 화면처럼 execution에 주황색 색깔이 안들어오는데 다르게 설정을 해야하나요?? 실행은 잘 됩니다. main에서는 execution에 주황색으로 색칠이 되는데 Test 코드쪽에서는 안먹히네요..
- 미해결스프링 핵심 원리 - 고급편
구체 클래스 기반 프록시 예제2
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오)[질문 내용 : 2분11초~] 이 케이스에서는 TimeProxy가 ConcreteLogic를 상속했기 때문에 이미 ConcreteLogic에 대한 정보(super)를 갖고 있는 것으로 보이는데, 멤버변수에 ConcreteLogic를 추가하신 의도가 있으신 건가요? 인터페이스를 사용할 때에는 손뼉을 쳤지만 구체 클래스 기반 프록시를 보니까 갑자기 위화감이 들어서 질문 드립니다....
- 미해결스프링 핵심 원리 - 고급편
setProxyTargetClass(true) 사용하는 상황이 궁금합니다.
안녕하세요 영한님. 강의 너무 잘보고 있습니다. 다름이 아니라 실무에서 setProxyTargetClass(true)을 가끔 사용한다고 하셨는데. 아직 취업준비생의 입장인 저로써는 어떤 상황에서 사용하는지 가늠이 잘 안가더라고요 어느 특정 라이브러리가 JDK 동적 프록시말고, CGLIB만을 지원해서 그런건지 아니면 다른 어떠한 상황이 있는건지 궁금해서 질문을 남겼습니다 :) 오늘 크리스마스 이브인데, 메리크리스마스 보내세요!
- 미해결스프링 핵심 원리 - 고급편
강의자료 누락 수정 요청
안녕하세요, 강의 내용에서는 v3/no-log 메서드를 추가하는데 강의 자료에는 빠진 것 같아서 글 남깁니다.
- 해결됨스프링 핵심 원리 - 고급편
애노테이션 @Transactional의 위치 질문입니다.(AOP 관련)
안녕하세요 김영한님! 강의를 다 듣고나서 트랜잭션 AOP의 동작원리를 알 수있게 되어 정말 감사합니다. 다만 제가 궁금한건 애노테이션 @Transactional입니다. 주로 서비스의 메소드에 적용하는데 클래스에도 붙일 수 있더군요. @Service@Transactional(readOnly = true)public class ProductService { 강의에서는 AOP 적용위치는 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행 이라고 말씀하셨는데 저 애노테이션은 AOP와 관련이 없는건가요? 아님 내부적으로 클래스 단위에 붙일 때는 클래스 하위 메소드에도 전부 적용하도록 내부 코드에 설정이 되어있는건가요? (흑흑 강의를 다시 들어야하는 걸까요?) 질문 읽어주셔서 감사합니다!
- 미해결스프링 핵심 원리 - 고급편
advisor적용 순서가 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 빈후처리기까지 강의를 들었습니다. 여러개의 advisor에 대해서 프록시를 각각 만들지 않고 하나의 프록시에 여러 advisor를 사용한다고 배웠습니다. 그렇다면 여러 advisor들 사이에 적용되는 순서가 있을까요?
- 해결됨스프링 핵심 원리 - 고급편
requestsParam관련 오류
동적 프록시를 적용하고 돌려봤는데 , 틀린데가 없는데도 자꾸 오류가 났습니다. 원인을 구글링하다가 글을 하나 봤는데 , @RequestParam(value="itemId") 까지 넣어줘야 동작한다는군요 .. 원인은 모르겠으나 , 저 처럼 오류나시는분들 이렇게 한번 해보시길 ..
- 해결됨스프링 핵심 원리 - 고급편
@Aspect 어드바이저 빌더
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 안녕하세요 영한님! 몇 가지 궁금한 점이 있어 말씀드립니다! 1. 자동 프록시 생성기가 빈 저장소에 있는 어드바이저 빈들을 조회하기 전에 모든 @Aspect 빈을 조회해서 어드바이저를 생성하여 등록하는 것은 이해가 됐습니다. 근데 그렇게 생성된 어드바이저를 왜 빈 저장소에 넣지 않고 굳이 @Aspect 어드바이저 빌더 내부 저장소에서 따로 관리를 하는 것인지 궁금합니다. 2. @Aspect 어드바이저 빌더 내부 저장소에 캐싱이 적용된다고 하셨는데 그렇다는 것은 하나의 @Aspect 빈에서 똑같은 어드바이저를 여러번 생성하는 경우가 발생한다고 이해가 됩니다. 예를 들어 어떤 경우에 캐시에 저장된 어드바이저를 반환하게 되는지 궁금합니다. 혹시나 @Aspect 어드바이저 빌더 내부 저장소의 어드바이저들은 영속성을 가지는 것인지 의문이 드네요. /* 아래 질문은 이후 강의인 "스프링 AOP - 어드바이스 순서" 에서 답변이 되었습니다. 3. 자동 프록시 생성기로 여러 어드바이저를 적용하는 경우에 각 어드바이저들 간의 작동 순서를 임의로 조정할 수 있는 방법은 없는지 궁금합니다. */
- 미해결스프링 핵심 원리 - 고급편
rest docs 와 swagger
안녕하세요. 영한님이 올려주신 강의들 정말 유익하게 보고 있습니다. 정말 영상과는 관련이 없는 질문입니다. 실무에서 rest docs를 사용하는 기업이 많은 지 swagger를 사용하는 기업이 많은 지 궁금합니다... 가령 주변은 어떤 걸 사용하시는지... 인터넷에 서칭해 본 결과 배민은 spring rest docs로 api 문서화를 작성하는 거 같은데, 그 외 기업들에게서는 별 다른 정보가 없네요 ㅠ 강의 내용과는 별 접점이 없지만 답변해주시면 정말 감사하겠습니다.
- 미해결스프링 핵심 원리 - 고급편
Bean Scope 를 request 로 사용하면 ThreadLocal 의 문제를 해결할 수 있나요?
안녕하세요:) request scope 으로 사용하면 traceIdHolder 에 대한 동시성 이슈를 해결할 수 있을 것으로 보이고 직접해보니 동시성 문제가 발생하지 않았습니다. 혹시 해당 Section 과 관련하여 ThreadLocal 과 request scope 의 큰 차이점에 대해 말씀해주실 수 있으신가요? 답변 미리 감사의 말씀드립니다🙇♂️
- 미해결스프링 핵심 원리 - 고급편
강의에서 설명해주시는 말이 헷갈리는부분이 있습니다.
강의에서 실제로 개발할때, 인터페이스가 있으면 인터페이스를 기반으로 의존관계 주입을 받는것이 좋다고 설명해주셨습니다. 인터페이스를 기반으로 의존관계를 주입받는다는것이 MemberService와 MemberServiceImpl이 있을때 DI주입을 MemberService에 하라는 의미인거죠??
- 미해결스프링 핵심 원리 - 고급편
회사일중에 딱 이런상황에 마주쳐서 질문드립니다.
이번 강의에서 내부메소드를 사용할 경우 그 메소드를 클래스로 만들어서 실행하게되면 AOP가 적용된다고 알려주셔서 실제 일하는곳에서 한번 적용을 해보았습니다. [컨트롤러 - consultSave] 컨트롤러에서 insertConsult를 합니다. [서비스 - ConsultService] 원래 서비스클래스안에 4개의 로직이 있었으나 Transactional이 적용되지 않아서 각각의 로직을 클래스로 만들어서 적용하였습니다. [분리된 서비스클래스] 총4개의 분리된 서비스가 있지만, 너무길어질것 같아서 1개의 로직만 업로드하였습니다!! 물론 분리된 서비스는 스프링빈에 등록될 수 있도록 @Service를 붙여놓은 상태입니다. 간략히 정리하여 저의 생각을 말씀드리면 tranSave.insertConsult()메서드를 통하여 저장을 한 후에 그 다음 로직에서 고의적으로 Exception이 발생시키면 @Transactional이 동작하여 rollback이 되어야한다고 생각하는데 rollback이 동작하지 않아 DB에 1개의 로우가 insert되어있는 현상입니다. 클래스를 나누어서 구조변경하였음에도 불구하고 @Transactional이 동작하지 않는 이유가 궁금합니다. 혹시 try catch문가 연관이 되어있을까요??
- 미해결스프링 핵심 원리 - 고급편
프록시 객체 생성에 질문있습니다.
스프링에서는 모든곳에 프록시 객체를 생성하지 않고 자동 프록시생성기가 스프링 컨테이너에 등록된 Advisor를 조회하여 포인트컷을 기준으로 프록시객체 생성여부를 정한다고 개념정리를 하였습니다. 그렇다면 자동 프록시 생성기를 등록하는 implementation 'org.springframework.boot:spring-boot-starter-aop'라이브러리를 등록하지 않는다면 스프링은 프록시 객체를 못만드는 건가요?? 저 라이브러리가 없는데 @Transactional이 동작해서 궁금하여 물어보았습니다.
- 해결됨스프링 핵심 원리 - 고급편
내부호출 : 자기자신 주입
안녕하세요! 강의 정말 만족하며 듣고 있습니다 ㅎㅎ 프록시와 내부 호출 - 자기자신 주입 강의를 듣고 있던 중 강사님과 똑같은 코드인데 세터 주입을 하여도 계속 순환 참조 에러가 나는 현상을 목격했습니다. Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'callServiceV1': Requested bean is currently in creation: Is there an unresolvable circular reference? 제가 스프링부트 2.6.1 로 프로젝트를 실행했는데, 이 에러가 자꾸 나서 확인해보니 2.6 이후에서는 순환참조를 기본적으로 허용하지 않도록 한다고 하네요. https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes 그래서 applicaton.properties에 spring.main.allow-circular-references=true 설정을 하여 해결했습니다. 저 옵션을 true로 하면 순환 참조를 쓸 수 있다는 건데, 실제 순환 참조가 필요한 경우가 있나요?
- 미해결스프링 핵심 원리 - 고급편
@AfterReturning 에서 메서드 시그니처 파라미터의 result 타입이 다를 경우
안녕하세요, 강사님! 알기 쉽게 차근차근 빌드업 해주셔서.. 강의 커리큘럼에도 놀랍고...이해가 쏙쏙 되어 감사히 듣고있습니다. 한가지 질문이 있어서 남깁니다. 강의자료 23페이지 하단의 "returning 절에 지정된 타입의 값을 반환하는 메서드만 대상으로 실행된다" 부분을 테스트 해보았습니다. (다른 어드바이스는 제외하고 @AfterReturning 만으로 테스트) Orderservice의 save는 String을 리턴하게 하고 어드바이스의 returning 타입은 Integer로 선언하여 테스트를 해보았고, 어드바이스가 적용되지 않는 것을 확인하였습니다. @AfterReturning(value = "hello.aop.order.aop.Pointcuts.orderAndService()", returning = "result")public void doReturn(JoinPoint joinPoint, Integer result) { 그래서 OrderService에 적용되는 어드바이스가 하나도 없는데 프록시는 생성되었을까 하여 aopInfo() 테스트로 확인해보니 OrderService에 여전히 프록시가 적용된 것을 확인하였습니다. 이전 강의에서 말씀해주신 포인트컷의 2가지 역할 중 첫번째 역할이 "빈 대상 객체가 포인트컷들 중에 하나라도 해당되면 프록시를 생성한다" 와 연결지어 생각해 보았을때, 포인트컷에 만족되기 때문에(모든 리턴타입에 대해 허용) 어드바이스 메서드 시그니처와는 관계없이 프록시를 생성한 것으로 추측됩니다. 이런 경우에 실제로는 사용할 어드바이스가 없지만 프록시를 생성하는 비용이 발생되는데, 실무에서는 조금 더 효율적으로 사용하기 위해서 포인트컷에 리턴타입을 명시해주는 것이 좋을까요? 그런데 또 생각해보면... 이 어드바이스 하나만 놓고 보았을때는 프록시만 생성되고 실제로 사용되지 않을 것 같은데, Aspect가 여러개 적용되어 중간에 다른 Aspect의 @Around에서 리턴타입이 변경된 후 넘어오게 된다면 이 어드바이스가 적용되는 일이 생길수도 있을 것 같습니다. 이렇게 생각하니 생각보다 고려할게 굉장히 많게 느껴지네요... 잘못 사용하면 예상치 못한 일들도 발생할 수 있을 것 같습니다.^^;; 정해진 답은 없고 위와 같은 것들을 잘 고려해서 주어진 상황에 따라 설계하는 것이 답일까요?? 감사합니다!
- 미해결스프링 핵심 원리 - 고급편
질문 드립니다!
강의를 보다가 궁금한 점이 생겨서 질문드립니다! 전략 패턴(클라이언트에서 직접 Strategy를 실행하지 않고 클라이언트가 Context.execute()를 실행할 때 Strategy를 넘겨서 Context에서 Strategy가 실행되는 흐름)에서 혹시 클라이언트에서 직접 Strategy 구현체 실행을 컴파일 타임에 "강제적으로 막고" Context에서 Strategy가 실행되는것만 허용할 수 있는 방법이 있을까 궁금증이 생겨 질문드립니다!
- 미해결스프링 핵심 원리 - 고급편
하이라이팅
안녕하세요 강사님 강의를 보다가 궁금한 점이 있어 문의 드립니다. Aspect Expression 관련 하이라이팅이 제 인텔리제이에서는 안먹히던데 별도로 설치해야할 플러그인이 있나요?
- 미해결스프링 핵심 원리 - 고급편
동적 proxy에서 핸들러 참조
안녕하세요. 동적프록시 관련 내용 흥미롭게 잘 들었습니다. Proxy.newProxyInstance(OrderRepositoryV1.class.getClassLoader(), new Class[] {OrderRepositoryV1.class}, new LogTraceBasicHandler(orderRepository, logTrace)); 위 코드에서 생성되는 OrderRepositoryV1의 프록시 클래스가 아래와 같을까 추측해보았는데 맞을까요? 1. newProxyInstance의 두번째 인자로 전달한 인터페이스들을 implements 2. InvocationHandler를 인스턴스 멤버변수로 가지고 생성자에서 주입 3. implements한 인터페이스들의 메소드들을 Overriding하여 handler를 invoke 4. Proxy 클래스의 패키지는 java.lang.reflect 이고, 생성된 Proxy 객체의 패키지는 com.sun.proxy 패키지여서 생성자가 public 접근제어자여야할 것 같은데 이런 추론이 맞는 걸까요? OrderRepositoryV1Proxy implement OrderRepositoryV1{ private InvocationHandler handler; public OrderRepositoryV1Proxy(InvocationHandler handler){ this.handler = handler; // LogTraceBasicHandler 주입 } @Override String call(){ Class class = this.getClass(); handler.invoke(this, class.getMethod("call"),null); } }
- 미해결스프링 핵심 원리 - 고급편
자동 프록시 생성기 동작원리에대해 질문드립니다.
강의초반에 스프링은 객체를 생성하여 빈후 처리기를 거친 후에 스프링컨테이너에 빈객체를 등록한다고 알려주셨습니다. 그런데 위 이미지에서 스프링이 객체를 생성하고 빈후처리기에 전달한 후에 빈후처리기는 모든 Advisor 빈을 스프링 컨테이너에서 조회한다고 했습니다. 그런데, 스프링컨테이너에는 아직 빈들을 등록하기 전이라 Advisor 빈들이 등록이 되어있지 않는데, 어떻게 스프링컨테이너에서 모든 Advisor빈들을 조회를 할 수 있는지 이해가 안됩니다.