월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 고급편
강의를 듣다 문득, ThreadLocal과 synchronized의 성능차이?가 궁금하여서 질문했습니다.
안녕하세요. 영한님!! ThreadLocal 쪽강의를 듣다가 궁금하게 생겨 질문하게 되었습니다.java에서 동시성을 해결할 수 있는 방법 중 하나인 synchronized가 있다고 알고 있습니다.ThreadLocal과 비교해볼 때 성능적으로 큰 차이가 있을까요??? 혹은 코드 취향에 따라 선택적으로 사용하면 될지 문득 궁금하여 질문을 남겼습니다.
- 미해결스프링 핵심 원리 - 고급편
강의에서 사실 의미없다고 모니터링툴을 쓰면 된다고 하는데
강의에서 사실 의미 없다고 모니터링 툴을 쓰면 된다고 하는데 어떤 툴을 써야하나요?진입 시점을 알려주는것보면 그냥 오류메시지를 전달하는 형태는 아닌 것 같고,센트리라는 것을 사용하면 저런형태로 커스터마이징 할 수 있는건가요?저번에 제가 도입해보려다가 무료기간이 1주일정도라서, 그냥 err메시지를 슬랙으로 전송해주는 모니터링만 구현했었거든요...말씀하시는 모니터링툴이 무엇인지 알고싶습니다 김영한 선생님!
- 미해결스프링 핵심 원리 - 고급편
private static 메소드의 의미
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]보통 클래스 내부에서 메소드를 사용하기위해 private 을 사용하고 객체를 생성하지 않고 메소드를 사용하기 위해 public static 메소드를 사용한다고 공부했습니다.질문혹시 private static 메소드는 어떤 의미를 가지고 사용하는 것일까요? 구글에 검색도 해보고 했지만 현업에서 사용하는 의미(의도), 영한님이 사용하는 의미(의도)등이 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
프록시를 넣어줘야 하는이유가 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 예제코드4 - 여러 어드바이저 함께 적용3:44 에서ProxyFactory2에 또 프록시를 넣어 주는 이유가연속적으로 적용되기 위함일까요? 번외 질문 아래와 같이 함수를 콜하면 프록시가 적용이 안되는데그이유는 프록시가 @Transaction 을 보고 프록시를 만드는데처음 콜된 함수가 프록시가 없으면 프록시를 안만들어서 그런걸까요?@Transactionpublic void save(Member member) { repository.save(member);}public parentMethod() { Member member = new Member(); save(member);}
- 미해결스프링 핵심 원리 - 고급편
@target 적용 여부가 애플리케이션 로딩 이후에 결정되는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]@target 의 동작 방식 자체는 이해가 되는데, @target 이 적용 여부가 애플리케이션 로딩 이후(빈이 모두 생성된 이후)에 결정되어야 하는 이유가 궁금합니다. 빈으로 등록될 객체가 생성된 직후, Spring 빈 후처리기가 동작할 때, 그 객체 클래스 및 상속 관계에 있는 클래스들에, 어떤 annotation 들이 달려있는지 판단 가능하다고 생각했습니다. 때문에, Spring 이 AspectJ Expression 사용 시 @target 조건만 주고 다른 조건으로 한정하지 않을 때, 모든 빈에 대해 proxy 를 생성하려 시도한다는 점이 잘 이해가 되지 않았습니다. 제가 뭔가 놓치고 있는 지점이 있는 것 같은데, 지적 부탁드립니다. 좋은 강의 감사합니다.
- 미해결스프링 핵심 원리 - 고급편
이번강의에 작성한 템플릿 콜백 패턴과 전략패턴의 차이가뭔가요?
전략패턴에서도 다음과같은 코드ContextV2 contextV2 = new ContextV2(); contextV2.execute(new StrategyLogic1()); contextV2.execute(new StrategyLogic2()); contextV2.execute(() -> log.info("Test 3")); contextV2.execute(() -> log.info("Test 4"));로 축약할수 있는것으로 보입니다. 템플릿콜백 패턴과 전략패턴의 구성이 인터페이스가 아예 동일하고, 전략패턴을 미리 만들어두지않고 그냥 execute 에다 람다로 익명클래스 혹은 람다로 넘기면 그게 템플릿 전략패턴인거같은데 혹시 맞을까요???
- 미해결스프링 핵심 원리 - 고급편
질문은 아닙니다만 오타 발견하여 제보드립니다..!
크게 중요한 부분은 아니지만 오타를 발견하여 제보드립니다. 프록시 패턴과 데코레이터 패턴 자료에서 프록시, 프록시 패턴, 데코레이터 패턴 - 소개 바로 위 구문에서 가장 어려문 문제 -> 가장 어려운 문제 오타가 있는 것 같아 제보드립니다~!
- 미해결스프링 핵심 원리 - 고급편
Spring Test에서 AOP 사용 질문 드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?(아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]src/main이 아닌 src/test 에서AOP를 구현해서 쓰고 싶어서Spring Boot Test에서 AOP 구현해서 사용하려고 하던 중 이슈가 있어서 질문 드립니다. 상황Spring Test에서 @Before 대신에 커스텀 어노테이션 구현하여 사용하고 싶은 상황입니다.증상Src/test에 aop 관련 기능 구현을 한 상태이며, 별도 제가 만든 커스텀 어노테이션은 작동하지 않는 상황입니다.a). query.QueryItemSection()의 @PreAuthorize이 호출되는 시점에 WithTokenAspect.before가 호출 되지만, 제가 만든 어노테이션에 대해서는 호출이 안되는 상황입니다. @Slf4j @Aspect @TestComponent public class WithTokenAspect { @Before("@annotation(com.testsupport.WithToken) || @annotation(org.springframework.security.access.prepost.PreAuthorize)") public void before(JoinPoint joinPoint) {@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface WithToken { String userId() default SysUserTest.GROUP_USER_ID; /** * MockHttpServletRequest * header 추가 설정 */ RequestHeader[] headers() default {}; } @Slf4j @EnableAspectJAutoProxy @Import(WithTokenAspect.class) @WithUserDetails(UserTest.USER_ID) @Transactional @SpringBootTest public class ItemSectionTest { @Test @DisplayName("상품을 검색할 필드값 전달") @WithMBPAuthorize(userId = "testUser") public void QueryItemSection() { ItemSection response = query.QueryItemSection(); 시스템 어노테이션은 작동하고, 커스텀만 안되는 것을 봐서는 Test 자체에서 사용시 추가로 필요한 어노테이션 등록 작업이 필요한 것으로 예상되나, 찾지 못하여 질문 드립니다.
- 미해결스프링 핵심 원리 - 고급편
RequestMapping 설정이 안됩니다
https://drive.google.com/file/d/1ZzF_drL431el08VSflTR0Zldo9mG72n/view?usp=share_linkjava/com/exmple/aop/v2 폴더에 해당 실습 내용이 담겨있습니다.구체 클래스 기반 프록시를 강의와 동일하게 적용해 보았습니다. target에 RequestMapping을 설정했으나 실제로 적용이 되지 않았습니다. (혹시 몰라 proxy에도 설정했었지만 적용되지 않았습니다.)디버깅 해보면 /v2/request가 없는 거까진 확인했습니다.
- 미해결스프링 핵심 원리 - 고급편
aop 적용 순서 질문입니다.
안녕하세요. 영한님.다름이 아니라 스프링 aop 적용 순서에 대해 질문이 있어요. 제가 다양한 실습을 진행하다가 @Retry 어노테이션을 @Transactional 어노테이션 밖으로 씌우고 싶은데 잘 안됩니다.질문을 자세히 하자면, 낙관적 락을 걸어서 commit 시점에 ObjectOptimisticLockingFailureException이 발생한 경우 3번 더 시도하는 @Retry 어노테이션을 만들었는데요, 문제는 @Retry 어드바이스가 @Transactional 이후에 먹힙니다. 즉 @Retry에서 try catch로 해당 exception이 발생했는지 확인해야 하는데 commit을 @Retry 어드바이스 이후에 동작 하니 catch를 하지 못하는 상황인데요. @Order를 이용해서 순서를 바꾸려 해도 @Transactional 우선순위가 최하위인건지 잘 안됩니다..물론 새로운 메서드를 만들어서 해당 메서드에서 @Retry 적용하고 @Transactional 붙인 메서드를 호출하게 하는 방식이 있겠지만 다른 풀이도 궁금해서 질문을 남겨요. 감사합니다!
- 해결됨스프링 핵심 원리 - 고급편
내부 호출에서 자기 자신 주입해도 여전히 오류가 뜹니다
프록시와 내부 호출 - 대안1 자기 자신 주입 파트 진행중입니다. 코드를 그대로 따라 쳤는데도 순환참조 오류가 계속 발생합니다. 뭔가 빠진걸까요..
- 해결됨스프링 핵심 원리 - 고급편
동시성 이슈 - 전략패턴
전략 패턴 - 예제 3 7:50초까지 듣고 질문 남깁니다.문맥(Context)에 로직(Strategy)을 담기 위해 두가지 방법을 알려주셨습니다.Context 필드에 Strategy 생성자 주입Context 메소드에 Strategy 위임(?) 1번 방식에서 생성자 주입시 Setter를 이용하여 필드의 전략을 바꿔서 실행하는 경우 '동시성 이슈'가 발생할 수 있다고 말씀하셨는데, 동시성 측면에서 2번과 차이가 있을까요?
- 해결됨스프링 핵심 원리 - 고급편
템플릿 콜백 패턴 - OrderControllerV5에 제네릭이 잘 적용이 안됩니다
템플릿 콜백 패턴으로 애플리케이션에 적용하는 부분에서 제네릭으로 타입 지정을 하고, 컨트롤러에서 String을 리턴 받도록 지정했는 데, 자꾸 결과는 Object가 리턴된다고 toString()을 하라고 하네요.아래 이부분에서 call()함수를 String으로 리턴받도록 했으나 인텔리제이에서는 계속 Object가 리턴된다고 나옵니다 @GetMapping("/v5/request") public String request(String itemId) { return template.execute("OrderControllerV5.request", new TraceCallback<>() { @Override public String call() { orderService.orderItem(itemId); return "ok"; } }); }제가 빼먹은게 있을까요?문제 생긴 오더 컨트롤러 v5 코드package hello.advanced.app.v5; import hello.advanced.trace.callback.TraceCallback; import hello.advanced.trace.callback.TraceTemplate; import hello.advanced.trace.logtrace.LogTrace; import hello.advanced.trace.template.AbstractTemplate; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class OrderControllerV5 { // template method pattern 적용 private final OrderServiceV5 orderService; private final TraceTemplate template; public OrderControllerV5(OrderServiceV5 orderService, LogTrace trace) { this.orderService = orderService; this.template = new TraceTemplate(trace); } @GetMapping("/v5/request") public String request(String itemId) { return template.execute("OrderControllerV5.request", new TraceCallback<>() { @Override public String call() { orderService.orderItem(itemId); return "ok"; } }); } }트레이스 템플릿 코드 package hello.advanced.trace.callback; import hello.advanced.trace.TraceStatus; import hello.advanced.trace.logtrace.LogTrace; public class TraceTemplate<T> { private final LogTrace trace; public TraceTemplate(LogTrace trace) { this.trace = trace; } public <T> T execute(String message, TraceCallback<T> callback) { TraceStatus status = null; try { status = trace.begin(message); // 로직 호츌 T result = callback.call(); trace.end(status); return result; } catch (Exception e) { trace.exception(status, e); throw e; } } }
- 미해결스프링 핵심 원리 - 고급편
원본객체와 프록시 객체는 스프링 컨테이너에 동시에 등록될 수 없나요?
[질문 내용]"컴포넌트 스캔은 원본 객체를 스프링 빈으로 자동으로 등록하기 때문에 프록시 적용이 불가능하다." 에서 파생된 질문입니다.1) 원본객체와 프록시 객체는 스프링 컨테이너에 동시에 등록될 수 없나요?2) 등록이 된다면 둘의 인터페이스가 같아서 충돌이 나면 @Primary와 같은 annotation으로 프록시 객체가 우선 호출되도록 하면 안되나요?
- 미해결스프링 핵심 원리 - 고급편
AOP 의 joinPoint.proceed() 는 꼭 return 해야되나요?
//hello.aop.order 패키지와 하위 패키지 @Around("execution(* hello.aop.order..*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); //join point 시그니처 return joinPoint.proceed(); }위는 강의의 샘플 코드 입니다.그런데 저는 이상하게 계속 에러가 나더라구요.. //hello.aop.order 패키지와 하위 패키지 @Around("execution(* hello.aop.order..*(..))") public void doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); //join point 시그니처 joinPoint.proceed(); }그래서 위와 같이 return 을 없앴더니 정상 성공했습니다. 학습한 내용으로는 joinPoint.proceed(); 만 해주면 타겟을 실행할 수 있다고 이해했습니다.그렇다면 return 을 하고 안하고가 어떤 차이가 있는 것 일까요?
- 해결됨스프링 핵심 원리 - 고급편
ThreadLocalMap.Entry 에 관한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 이번 챕터에서 소개된 ThreadLocal 에 대해 공부하면서 소스코드를 따라가다가 보니 ThreadLocalMap 과 ThreadLocalMap.Entry 까지 찾아보게 되었는데요 ^^;ThreadLocalMap.Entry 가 WeakReference 를 상속받아 사용하는 이유가 별도로 있는지가 궁금합니다.제가 생각해 보았을때..만일 Entry가 WeakReference가 아닌 경우 Thread가 살아있는 한은 해당 ThreadLocal 객체에 Strong Reference가 존재하기 때문에GC에 의한 메모리 회수가 이루어지지 않는 문제가 있어 그런것이 아닐까 싶습니다만, 일반적으로 ThreadLocal을 사용할 때에는private static final ThreadLocal<MyClass> myClassHolder = new ThreadLocal<>();과 같은 형태로 항상 ThreadLocal 인스턴스에 Strong Reference 가 존재하는 형태로 사용하므로Entry가 WeakReference 를 상속받은 의미가 크게 없지 않나 하는 생각이 들어 질문드립니다.
- 미해결스프링 핵심 원리 - 고급편
콜백질문입니다. !
궁금한게 콜백 패턴을쓰면메서드안에 또 메서드를 살펴봐야 하고 (타고 타고 ..)이런 단점도 있지않나요 ??
- 미해결스프링 핵심 원리 - 고급편
ThreadLocal
스레드풀은 10개가 디폴트로 설정되어있고ThreadLocal 의 수는 따로 안정해져있는건가요?(무한정으로 ThreadLocal의 내부 저장소를 갖고있는건가요?)
- 미해결스프링 핵심 원리 - 고급편
클래스 기반 프록시에서
클래스 기반 프록시를 만들 때,프록시는 프록시 대상 클래스를 상속 받고, target을 주입 받아서 호출하는데어차피 프록시 대상 클래스를 상속 받아야한다면, 그냥 super.로직()을 호출하면 안되나요?그럼 target을 주입 받을 필요도 없어질텐데 혹시 이 방법은 왜 안되는지 궁금해서 질문 드립니다.
- 해결됨스프링 핵심 원리 - 고급편
Advisor 빈 등록 시점
Advisor 빈의 등록 시점이 궁금합니다.강의에 나온 설명 그림의 흐름대로라면, 빈 후처리기에서 스프링 컨테이너와 @Aspect 어드바이저 빌더에 있는 Advisor들을 조회하기 위해서는 이미 Advisor 빈이 스프링 컨테이너에 등록되어 있는 상태여야 하는 걸로 이해했습니다.그렇다면 Advisor 빈들은 가장 먼저 스프링 컨테이너에 등록되도록 설정 되어 있는 것 일까요??