묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 고급편
애노테이션 @Transactional의 위치 질문입니다.(AOP 관련)
안녕하세요 김영한님! 강의를 다 듣고나서 트랜잭션 AOP의 동작원리를 알 수있게 되어 정말 감사합니다. 다만 제가 궁금한건 애노테이션 @Transactional입니다. 주로 서비스의 메소드에 적용하는데 클래스에도 붙일 수 있더군요. @Service@Transactional(readOnly = true)public class ProductService { 강의에서는 AOP 적용위치는 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행 이라고 말씀하셨는데 저 애노테이션은 AOP와 관련이 없는건가요? 아님 내부적으로 클래스 단위에 붙일 때는 클래스 하위 메소드에도 전부 적용하도록 내부 코드에 설정이 되어있는건가요? (흑흑 강의를 다시 들어야하는 걸까요?) 질문 읽어주셔서 감사합니다!
-
해결됨스프링 핵심 원리 - 고급편
@Aspect 어드바이저 빌더
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 안녕하세요 영한님! 몇 가지 궁금한 점이 있어 말씀드립니다! 1. 자동 프록시 생성기가 빈 저장소에 있는 어드바이저 빈들을 조회하기 전에 모든 @Aspect 빈을 조회해서 어드바이저를 생성하여 등록하는 것은 이해가 됐습니다. 근데 그렇게 생성된 어드바이저를 왜 빈 저장소에 넣지 않고 굳이 @Aspect 어드바이저 빌더 내부 저장소에서 따로 관리를 하는 것인지 궁금합니다. 2. @Aspect 어드바이저 빌더 내부 저장소에 캐싱이 적용된다고 하셨는데 그렇다는 것은 하나의 @Aspect 빈에서 똑같은 어드바이저를 여러번 생성하는 경우가 발생한다고 이해가 됩니다. 예를 들어 어떤 경우에 캐시에 저장된 어드바이저를 반환하게 되는지 궁금합니다. 혹시나 @Aspect 어드바이저 빌더 내부 저장소의 어드바이저들은 영속성을 가지는 것인지 의문이 드네요. /* 아래 질문은 이후 강의인 "스프링 AOP - 어드바이스 순서" 에서 답변이 되었습니다. 3. 자동 프록시 생성기로 여러 어드바이저를 적용하는 경우에 각 어드바이저들 간의 작동 순서를 임의로 조정할 수 있는 방법은 없는지 궁금합니다. */
-
미해결스프링 핵심 원리 - 고급편
Bean Scope 를 request 로 사용하면 ThreadLocal 의 문제를 해결할 수 있나요?
안녕하세요:) request scope 으로 사용하면 traceIdHolder 에 대한 동시성 이슈를 해결할 수 있을 것으로 보이고 직접해보니 동시성 문제가 발생하지 않았습니다. 혹시 해당 Section 과 관련하여 ThreadLocal 과 request scope 의 큰 차이점에 대해 말씀해주실 수 있으신가요? 답변 미리 감사의 말씀드립니다🙇♂️
-
미해결스프링 핵심 원리 - 고급편
프록시 객체 생성에 질문있습니다.
스프링에서는 모든곳에 프록시 객체를 생성하지 않고 자동 프록시생성기가 스프링 컨테이너에 등록된 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로 하면 순환 참조를 쓸 수 있다는 건데, 실제 순환 참조가 필요한 경우가 있나요?
-
미해결스프링 핵심 원리 - 고급편
하이라이팅
안녕하세요 강사님 강의를 보다가 궁금한 점이 있어 문의 드립니다. 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); } }
-
미해결스프링 핵심 원리 - 고급편
전략패턴과 템플릿 콜백 패턴 차이 관련 질문드립니다.
안녕하세요! 이번에도 좋은 강의 감사합니다. 명쾌하게 설명해주셨는데, 제가 이해한 것이 맞는지 확인받고자 질문드립니다. 전략이란 의도를 동일하게 사용하기 때문에 템플릿 콜백 패턴도 전략패턴의 일종인데 차이를 생각해보자면 전략패턴은 context의 인스턴스 변수로 전략을 참조하고, 템플릿 콜백 패턴은 context의 관련 메서드로 callback 받는 차이가 있다고 이해하였습니다. 이런 차이로 아래 두가지를 생각해보았는데 제대로 이해한 것이 맞을지 궁금하여 질문드립니다. 1. 전략패턴은 템플릿 콜백 패턴보다 context와 전략간 의존성이 더 강하단 단점이 있고, 반면에 자주 사용되는 context라면 템플릿 콜백 패턴은 재사용성이 떨어진다는 단점이 있을 것 같습니다.(매번 callback을 정의해주어야하므로) 2. 전략패턴은 런타임시 객체가 생성될 때 전략이 정해지고, 템플릿 콜백 패턴은 context가 해당 전략을 실행할 시점에 전략이 정해진다고 정의하여도 괜찮을까요? 감사합니다.
-
미해결스프링 핵심 원리 - 고급편
강사님 사소하지만 궁금해서 질문남겼습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링이 지원하는 프록시 섹터를 듣고 어느정도 프록시 팩토리에대해 이해를 한 상태입니다. 조금 더 깊은 이해를 하고싶어서 다른분들의 블로그를 검색해보았는데 프록시 팩토리빈이라는 단어를 선택하더라구요... 차이점을 찾아헤메던중 뭔가 사이다같이 원하는 답이 나오지 않아서 이렇게 질문을 남기게 되었습니다. 프록시 팩토리와 프록시 팩토리빈의 차이점이 정확히 뭔지 궁금합니다.!!
-
미해결스프링 핵심 원리 - 고급편
setter에 @Autowired 쓰는 문법은 이제 막힌건가요?
강의는 스프링 2.5버전대지만 현재 스프링 이니셜라이저에서 기본 지정 버전은 2.6버전입니다. 여기서는 CallServiceV1에서 사용한 setter에 @Autowired 붙이는 문법을 사용 할 시에는 생성자로 주입할 때랑 똑같이 순환참조냐고 묻는 오류가 발생하더라구요. 혹시나 싶어서 2.5.6으로 해보니 잘 되더랍니다...ㅠㅠ 갑자기 2.6.0버전부터 무슨 일이 생긴지는 모르겠지만 여기서는 안되네요 ㅠㅠ
-
미해결스프링 핵심 원리 - 고급편
혹시 스프링시큐리티 강의 계획이 있나요
1. 강의 내용과 관련된 질문인가요? (예/아니오) 아니요2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]안녕하세요. 영한님 강의 잘 정말 잘듣고있습니다. 아쉽게도 이번강의는 개인적인 일로 바빠서 결제만 해놓고 듣지는 못했지만요. 제가 개인프로젝트를 진행하다가, 스프링시큐리티를 도입할 일이 생겼는데, 정말 어렵더군요. 일단은 열심히 구글링해서 어찌어찌 잘 도입했는데, 너무 어려워서 한번 깊게 공부해야겠다는 생각이 들더군요. 본론으로 들어가서 혹시 스프링 시큐리티를 강의로 내실 계획이 있나요 계획이 있다면, 언제쯤 내실 계획인지 알 수 있을까요. 계획이 없다면, 다른 분의 스프링 시큐리티 강의를 수강하려고 문의 드립니다
-
미해결스프링 핵심 원리 - 고급편
강사님 궁금한게 있습니다.
항상 좋은 강의 감사합니다! 덕분에 실력이 많이 오름을 느끼고 있습니다. 궁금한 것은 애초에 boot-starter-aop을 적용하기 전에, 스프링 컨테이너에 빈들을 등록할때 이들을 프록시 처리해서 등록하는 것으로 알고 있습니다. (싱글톤 처리를 위해서) 이때, boot-starter-aop 모듈을 적용하면 이러한 역학 과정(?)에 어떤 과정이 들어가는지 궁금합니다. 일단 포인트컷 대상이 되는 클래스는 한번 프록시에 감싸주고 이후 스프링에서 빈으로 등록할 때 싱글톤 처리를 위해 한번 더 프록시를 감싸주는 식으로 최종 빈 등록이 되는 것일까요?
-
해결됨스프링 핵심 원리 - 고급편
CGLIB
안녕하세요! https://www.inflearn.com/questions/343778 이 부분 질문과 답변 보고 궁금한 점이 생겼습니다. jdk 동적 프록시, CGLib 모두 런타임에 리플렉션을 통해 프록시 객체를 생성하는 걸로 알고 있었습니다. 그런데 CGLIB를 사용해서 컴파일 타임에 바이트 코드를 생성한다는 언급이 있습니다. CGLIB는 런타임과 컴파일타임 모두 바이트코드를 조작할 수 있는건가요??
-
해결됨스프링 핵심 원리 - 고급편
ThreadLocal 동시성 이슈 (ArrayList, HashMap, HashSet)
안녕하세요! 김영한님!!수업 너무 유익하게 잘 듣고있습니다~!! 동시성 이슈를 막기 위해 ThreadLocal을 사용하는 부분 중에서 궁금한 점이 생겨서 질문 드립니다. String, TraceId의 타입에 대해서는 ThreadLocal을 사용해서 동시성 이슈를 해결하였는데, 필드로 ArrayList, HashMap, HashSet을 사용하고 싶은 경우에는 동시성 이슈를 어떻게 해결하면 될까요 ? 구글링을 했었을 때에는 멀티쓰레드 환경에서는 HashMap 대신에 ConcurrentHashMap을 사용해라고 봤었고, ArrayList 대신에 CopyOnWirteArrayList를 사용해라고 봤었고, HashSet에 대해서는 제대로 찾지 못했습니다. 멀티쓰레드 환경에서 Thread-Safe하게 ArrayList, HashMap, HashSet을 사용하려면 어떻게 해야하나요 ?
-
미해결스프링 핵심 원리 - 고급편
이번 장에서 작성했던 코드가 부모 클래스의 기능을 전혀 사용하지 않았다는 말의 의미가 정확이 무엇인가요?
AbastractTemplate 클래스의 책임은 변하지 않는 부분인 log 기능을 자식 클래스에게 제공해주고, 자식 클래스는 변하는 부분인 call 메서드를 구현하는 책임을 가지고 있습니다. 서로 책임을 나누어가지면서 두 객체의 기능이 상호작용 함으로서 템플릿 메서드 패턴이 작동하는 것이 아닌지요. 자식클래스는 부모 클래스가 제공하는 execute라는 기능과 추상화된 call 기능을 사용하는 것처럼 보이는데 강의에서 말하는 "부모 클래스의 기능을 전혀 사용하지 않았다"라는 말의 의미가 무엇인지 잘 모르겠습니다.
-
해결됨스프링 핵심 원리 - 고급편
traceIdHolder.remove()와 traceIdHolder.set(null)의 차이가 있나요?
안녕하세요 강의 잘 보고 있습니다. traceIdHolder.remove()와 traceIdHolder.set(null)의 차이점이 궁금합니다. 실험해보니까 set(null)로 해도 잘 동작합니다만 아무래도 remove()라는 함수가 따로 있는 이유가 있을 것 같아서요.
-
해결됨스프링 핵심 원리 - 고급편
스레드 로컬과 request 스코프
이번 강의도 잘 듣고 있습니다! 스레드 로컬 사용한 것과 Configuration에서 ThreadLocalLogTrace 을 request 스코프로 설정한 방법 모두 스레드 동시성 문제 해결한다는 점에서 같은 효과일 것 같은데 두 방식을 비교했을때 스레드 로컬의 장점이 무엇인지 궁금합니다!
-
해결됨코딩으로 학습하는 GoF의 디자인 패턴
인스턴스 홀더에 관해서 질문이 있습니다.
물론 강의에서 사용하신만큼 로딩과 동시에 올라가지 않는다는 건 알겠는데 홀더 클래스가 가지고 있는 인스턴스는 어째서 바깥메서드에서 호출을 할 때 생성이 되는건가요? 제가 추측한 바로는 SettingsHolder라는 클래스가 innerClass인 동시에 private 이기 때문에 홀더 안의 인스턴스가 생성이 되지 않는 것 같습니다.
-
해결됨Java 디자인 패턴
Notion 엑세스 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! PDF 파일에 Notion관련 하이퍼링크가 있어서 들어갔는데, access 권한이 없어서 글을 읽을 수가 없습니다. 혹시 Notion의 Share 기능을 통해 웹 공유 체크하지 않으셨는지 궁금합니다.