월 18,150원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 고급편
이런 경우에 @RequestScope를 사용하면 어떨까요?
안녕하세요. 초보개발자 명아주입니다! 계속 싱글톤을 강조하면서 말씀해주셔서 이런 문제가 예상되었고 저는 해결책으로 @RequestScope를 이용해서 LogTrace Bean 자체를 request 마다 생성하도록 하는 방법을 생각했었습니다. 실제 테스트해본 결과, 의도한 대로 동작하는 것도 확인하긴 했습니다. 아직 경험이 부족하여 어떤 장단점이 있을지 모르겠어서 이렇게 질문작성하고 마저 다음 강의를 들으러 가겠습니다! 다음 강의에서 그 답이 나올지도 모르겠다는 생각이 들긴 하네요. 감사합니다!
- 미해결스프링 핵심 원리 - 고급편
strategy강의 소스받을수 있나요.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? . 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니요3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니요[질문 내용] 전략패턴 관련 strategy강의 소스받을수 있나요. 전략패턴
- 미해결스프링 핵심 원리 - 고급편
JPA 에선 왜 기본생성자가 필요한가요?
안녕하세요. JPA 도 프록시로 인해서 기본생성자가 필요하다는 점이 생각나서 보았더니 리플레션을 통해서 생성하기 때문에 기본생성자가 필요한 것으로 보였습니다. 추측 근거: org.hibernate.bytecode.internal.javassist.FastClass.newInstance(int index, Object[] args) 메소드를 참고하였습니다. 근데 왜 `objenesis` 를 사용하면 되는데, JPA 에선 왜 POJO 스타일의 리플렉션을 사용하는지 궁금합니다.. JPA 강의에서 질문을 올려야 할지 이곳에서 올려야 할지 고민하다가 이곳에서 질문을 남깁니다.감사합니다.
- 미해결스프링 핵심 원리 - 고급편
안녕하세요 질문있습니다..v3,v4,v5
안녕하세요, 좋은강의 감사합니다. 벌써 몇개째 듣는지 모르겠네요 충분한 값어치 이상의 강의 감사드립니다.ㅎㅎ(영한님꺼 1개인가 2개빼고 전부 구입완료)..ㅎ 영한님 스타일은 항상 태초의?코드를 작성 후 버전을 올리면서 순차적으로 이렇게 이렇게 되서 결국은 이런식 이러한 강의 스타일이라 알고있습니다. 다름아니라 현재 프로젝트는 v2에서 정리단계로 넘어간후 로컬쓰레드로 넘어가는데 커리큘럼을 보니, aop쪽에서 로그를 만질껏 같긴한데 v3,v4, v5 - 에 해당하는 목차를 현재 목차를 만드신 스타일로 보면 3개정도 빼실것같은데..없는것 같아 "누락"인지, 혹은 뒷부분에서 계속 진행되는지 궁금해서 글 남겼습니다. 해당 강의 마지막 부분에서 다음시간에는 이러이러한 문제점을 개선하신다는 말을 듣고 v3,,v4,,v5,,식으로 나와야할 목차같은데 없어서 그러합니다..
- 해결됨스프링 핵심 원리 - 고급편
이번 예제에서 Config 클래스에 @Configuration 을 적용하니, Proxy 래핑/등록이 안되는것 같습니다.
강사님 안녕하세요.저는 지금 예제 구현시 의도와 다르게 약간 틀린 설정으로 생긴예상밖의 결과로 약간 혼동을 겪고있습니다. 이유는 @Configuration 을 실수로 붙였더니, 아래와 같이Proxy 가 적용되지 않은 결과가 나옵니다. Config 클래스에 아래와 같이 @Configuration 선언시 @Configurationstatic class Config { ... ...} child.childMethod(); 실행 후 로그 메세지: child Proxy=class ...AtTargetAtWithinTest$Child(Proxy 적용이 안된 스프링 빈 출력) child.parentMethod(); Parent 는 프록시 처리가 되지 않아 출력되지 않음 관례처럼 사용해오던 @Configuration 을 지우니 강의 예제결과처럼 정상으로 나옵니다.(@Import 를 통해 Config 추가 상태) Aspect 를 빈으로 등록해도 Proxy 변환이 안되는 이 상황이 이해가 되지 않아 부득이하게 질문을 남기게 되었습니다. 질문입니다. 예전 강의에서 @Configuration 은 등록되는 빈 을 대상으로 싱글톤 후처리를 위해 선언되는 것이라 알고있었습니다.( CGLIB 을 통해 프록시 후처리), 그래서 Aspect 가 당연히 적용될 줄 알았는데 @Configuration 을 붙이니,Proxy 처리가 되지 않더라구요. 아래는 두가지 결과 입니다. @Configration Config @Import(Config.class) @Configuration 선언 시, Proxy 후처리가 되지 않는 기묘한 현상에 대한 이해가 잘 되지 않습니다.이런 이유로 Config 클래스에 @Configuration 을 쓰지않고, @Import 로 추가하신 이유가 궁금합니다. 읽어주셔서 감사드립니다.
- 미해결스프링 핵심 원리 - 고급편
여러 개의 빈 후처리기를 등록하면??
안녕하세요. 최종 질문은 마지막 문단에 하였습니다. [빈 후처리기 - 예제코드2] 강의 관련 질문드립니다. 빈 후처리기 자체가 스프링 빈으로 등록이 가능한데, 예제에서 나오는 AtoBPostProcessor 이외에 제가 임의로 C클래스를 작성하고 BtoCPostProcessor 후처리기를 빈으로 등록해봤습니다. 그리고 컨테이너에 1) AtoBPostProcessor 2) BtoCPostProcessor 순서대로 빈을 등록하였습니다. 테스트 코드에서는 A 타입의 빈을 찾고 C 타입으로 캐스팅하여 c.helloC()를 실행한 결과 문제없이 동작하였습니다. 그리고 빈 후처리기 동작 순서또한 빈 후처리 등록 순서와 같았습니다. 이번에는 컨테이너에 등록할 때, 1) BtoCPostProcessor 2) AtoBPostProcessor 순서대로 등록하였더니, 오류가 발생하였습니다. 위에서 말씀드린 것처럼 컨테이너에 빈 후처리기를 빈으로 등록한 순서대로 후처리기를 통과(?)하는 것 같습니다. 질문은 1) 빈 후처리기 순서를 조작할 수 없는지? (그럴 필요는 있는지?) 2) 연쇄적(?)으로 빈후처리기를 등록하는 일이 있는지? => 즉, 첫 번째 후처리기의 결과에 따라 그 다음 후처리기를 호출할 필요가 있는지, (실무에서 여러 개의 빈 후처리기의 순서를 제어할 필요가 발생하는지) 감사합니다.
- 미해결스프링 핵심 원리 - 고급편
@Aspect 안에 여러 어드바이스 작성 시, 어드바이저는 어떻게 구성이 되나요?
안녕하세요! 항상 좋은 강의 및 답변주셔서 감사합니다. 강의를 듣고 복습하던 도중 한 가지 궁금한 부분이 있어 글을 작성하게 되었습니다. @Aspect@Slf4jpublic class AspectV2 { @Pointcut("execution(* hello.aop..*.*(..))") public void allOrder(){} // public java.lang.String hello.aop.order.OrderRepository.save(java.lang.String) @Around("allOrder()") public Object doLog1(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); return joinPoint.proceed(); } @Around("allOrder()") public Object doLog2(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); return joinPoint.proceed(); }} 위의 코드에서 어드바이저는 총 몇개가 생기는지 궁금합니다. @Aspect가 있는 빈이 생길 경우, AutoProxyCreator가 @Aspect를 읽고 어드바이저를 작성해서 @Aspect Advisor 빌더 내부에 저장해두는 것으로 알려주셨는데요... 위의 코드가 실행되면, 어드바이저는 2개가 되는 걸까요? 아니면 1개만 되는 걸까요? 제가 이해하기로는 어드바이저는 주로 Default Advisor를 사용해서 1포인트컷 + 1어드바이저로 구성된다고 이해를 해서 2개가 생길 것으로 생각되긴 한데... 항상 좋은 강의 및 답변 해주셔서 고맙습니다. 감사합니다!
- 해결됨스프링 핵심 원리 - 고급편
예제의 자동 Advisor 구현체 를 `doLog 어드바이저`라고 불러도 되나요?
[질문 내용] 강의내용을 정리하며, AspectV1 에 작성된 코드를 `git commit` 하려고 보니어드바이저 긴 어드바이저 인데, 이름을 어떻게 붙여야 될지 난감했습니다. 난감했던 이유 `Around 어드바이저`..?: @Around 는 Pointcut 을 뜻하므로, 명칭에 맞지않다고 생각합니다. `AspectV1 어드바이저`..?: 다수의 어드바이저가 Aspect클래스 내부에 생성 될수 있어, 맞지않은 표현이라 생각합니다. 그래서 생각해본 것은 이렇습니다. "AspectV1 의 `doLog 어드바이저` 구현" 질문입니다어드바이저가 자동으로 생성된다해도, 고유한 이름을 갖고 있을텐데, 지금에선 알 방법이 없어, 추측해봤습니다.정확한 네이밍 규칙에 따르는 이름이 있다면 알려주세요.이 부분에 대해 질문을 해야될지 고민했지만, 막상 이런것들이 확고히 정해지지 않으면 기억에 오래남지 않더라구요..제가 뭘하고있는지 정의하기위해 도움을 구합니다. 감사드립니다.
- 미해결스프링 핵심 원리 - 고급편
ThreadLocal 참조 질문 드립니다.
안녕하세요. ThreadLocal에 저장한 데이터를 여러 장소에서 참조할 수 있는지 문의드립니다. 예를 들어 controller -> service -> dao 로 구성된 소스의 controller에서 ThreadLocal <String> a = new ThreadLocal(); a.set("abcd"); 위와 같이 값을 세팅 한 경우 service나 dao에서도 ThreadLocal a를 참조해서 "abcd" 값을 꺼내 사용하려면 어떻게 해야 할까요? 답변 부탁드립니다. 감사합니다.
- 미해결스프링 핵심 원리 - 고급편
상속과 위임 관계, 강의 내용과 관련해서 궁금한 내용이 있습니다.
안녕하세요. 항상 좋은 답변, 강의 해주셔서 감사합니다. 이번에는 상속과 위임 관계에 대해서 여쭤보고 싶은 것이 있어 글을 적게 되었습니다. 이번 강의에서는 추상 클래스를 상속 받는 형태로 구현을 했는데, '상속'을 받았기 때문에 부모 클래스의 변경에서 자유로울 수 없다고 하셨습니다. 이 부분까지는 이해가 갑니다! 왜냐하면 부모 클래스에서 변경된 부분이 있다면, 필요하다면 자식 클래스에서 구현을 해줘야 하는 것으로 이해하고 있기 때문입니다. 그런데 뒷쪽의 전략 패턴에서도(강의 듣고 왔어요!), Interface를 활용해 구현체를 만드는 형태였습니다. 크게 보면 결합이 약해졌다라고 이해를 할 수도 있겠는데... 마찬가지로 Interface에서 변경점이 있다면, 구현체에서도 변경점이 발생하는 것이 아닌가요? 예를 들어 interface에서 특정 메서드가 추가된다거나, 혹은 삭제된다거나 하면.. 구체에서 오버라이드 하지 않으면 안되는 상황일텐데요...! 영한님께서 말씀하신.. 내용을 제가 머리가 나빠서 정확히 못 받아들이는 것 같은데.. 혹시 조금만 더 풀어서 설명해주실 수 있으실까요? 질문의 요지는... 상속 관계에서 부모 클래스가 변하면 자식 클래스에 영향을 준다. 인터페이스 - 구체 관계에서 인터페이스가 변하면 구현체에 영향을 준다. 위 두 관계에서 어떻게해서 전략 패턴이 좀 더 상속의 단점을 제거할 수 있다는 말씀이신지, 궁금합니다! 항상 감사합니다. 좋은 하루 되세요!
- 미해결스프링 핵심 원리 - 고급편
전략패턴 질문이요!
안녕하세요 영한님 백엔드 3년차 개발자인데 정말 잘듣고있습니다! 전략 패턴 강의 듣고 궁금증이 생겨서요~ 전략 패턴도 인터페이스안에서 메소드 선언이 추가되거나 하면 해당 인터페이스를 구현하고있는 구현 클래스들도 각각 일일이 찾아가서 강제로 구현해야되는 점이 있는것 같은데 이런것은 실무에서 상관없을까요??
- 미해결스프링 핵심 원리 - 고급편
빈후처리기와 @postconstruct
안녕하세요 빈 생성후에 @postconstruct나 intializing의 afterpropertyset 을 이용해서 후처리를 할 수 있는데 빈후처리기의 차임점은 기본 빈의 가공을 넘어서 객체 변환까지 가능하다고 알고 있으면 될까요?? 항상 좋은 강의 감사드립니다.!
- 미해결스프링 핵심 원리 - 고급편
PointCut 표현식을 컴파일 타임에 에러체크 할 수 있을까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Pointcut Expression 작성 시에 오타가 자주 발생하여 런타임 에러를 자주 만납니다. 쿼리를 자바 컴파일 타임에 검사 할 수 있게 해주는 QueryDSL 처럼 PointCut Expression 도 컴파일 타임에 에러를 발생시켜주는 방법이 있을까요?
- 미해결스프링 핵심 원리 - 고급편
포인트컷 within에 의한 this, target의 필요성
this와 target의 차이는 이해했습니다. 그런데, 이것들이 과연 필요가 있는지에 대해서 의문이 들었습니다.저라면 this 대신 target 쓸 것 같고 target 대신 within을 쓸 것 같습니다. 그러나, 아무 필요성 없이 두 포인트컷이 생기지는 않았을 것 같습니다.within대신 target, target 대신 this를 사용하는 구체적인 경우가 언제인가요? 두 포인트컷은 왜 존재하나요?
- 미해결스프링 핵심 원리 - 고급편
ConcurrentHashMap 사용 질문
https://www.inflearn.com/questions/347336 해당 질문 글에서 ConcurrentHashMap 을 사용하더라도 예제에 발생하는 동시성 이슈를 막을 수 없다고 하셔서 저도 궁금해서 ConcurrentHashMap 을 사용한 LogTrace를 만들어서 테스트를 몇 번 돌려봤는데 정상적으로 처리되는거 같은데 또 다른 이슈가 있는건가요?? package hello.advanced.trace.logtrace; import java.util.concurrent.ConcurrentHashMap; import hello.advanced.trace.TraceId; import hello.advanced.trace.TraceStatus; import lombok.extern.slf4j.Slf4j; @Slf4j public class MapLogTrace implements LogTrace { private static final String START_PREFIX = "-->"; private static final String COMPLETE_PREFIX = "<--"; private static final String EX_PREFIX = "<X-"; private ConcurrentHashMap<Thread, TraceId> map = new ConcurrentHashMap<>(); @Override public TraceStatus begin(String message) { syncTraceId(); Long startTimeMs = getCurrentTimeMillis(); TraceId traceId = map.get(Thread.currentThread()); log.info("[{}] {}{}", traceId.getId(), addSpace(START_PREFIX, traceId.getLevel()), message); return new TraceStatus(traceId, startTimeMs, message); } private void syncTraceId() { Thread thread = Thread.currentThread(); TraceId traceId = map.get(thread); if (traceId == null) { map.put(thread, new TraceId()); } else { map.put(thread, traceId.createNextId()); } } @Override public void end(TraceStatus status) { complete(status, null); } @Override public void exception(TraceStatus status, Exception ex) { complete(status, ex); } private void complete(TraceStatus status, Exception ex) { Long stopTimeMs = getCurrentTimeMillis(); long resultTimeMs = stopTimeMs - status.getStartTimeMs(); TraceId traceId = status.getTraceId(); if (ex == null) { log.info("[{}] {}{} time={}ms", traceId.getId(), addSpace(COMPLETE_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs); } else { log.info("[{}] {}{} time={}ms ex={}", traceId.getId(), addSpace(EX_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs, ex.toString()); } releaseTraceId(); } private void releaseTraceId() { Thread thread = Thread.currentThread(); TraceId traceId = map.get(thread); if (traceId.isFirstLevel()) { map.remove(thread); } else { map.put(thread, traceId.createPreviousId()); } } private String addSpace(String prefix, int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append((i == level - 1) ? "|" + prefix : "| "); } return sb.toString(); } private Long getCurrentTimeMillis() { return System.currentTimeMillis(); } }
- 미해결스프링 핵심 원리 - 고급편
AspectJ의 AOP 구현방식에 대해 질문드립니다.
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 영한님 안녕하세요! Spring AOP는 프록시 기반으로 타겟과 aspect를 weaving해서 프록시 객체가 생성된다고 이해했습니다. 그렇다면 또다른 AOP 프레임워크인 aspectJ는 어떤 방식으로 aspect를 타겟에 적용하고 있나요? AspectJ가 적용된 코드에 final을 붙여 실행시켰을 때 오류가 나는 것으로 보아 아마 프록시로 래핑된 객체를 생성하지 않을까 추측이 되는데 확실치 않아 여쭤봅니다. 짜임새 있는 강의 준비해주셔서 항상 잘 듣고 있습니다. 고맙습니다!
- 미해결스프링 핵심 원리 - 고급편
오타 수정 문의
안녕하세요~~ 영한님! '포인트컷 지시자의 종류 종류' 종류가 2번 들어가있습니다!!
- 미해결스프링 핵심 원리 - 고급편
두 가지 문의 드립니다
안녕하세요. 두 가지 문의 드립니다. 1. execution에서 type이 있는 varargs param 조건을 정의할 수 있을까요? 예를 들면 foo(String... params) 의 조건만을 만족시키는 것 입니다. 2. 그리고 param 조건에도, super type을 지정할 경우 공변성이 있는 하위 타입(Generic, collection 포함)들은 모두 대상이 되는걸까요? 감사합니다!
- 미해결스프링 핵심 원리 - 고급편
@order 문의 드립니다
안녕하세요. @Order가 적용 된 Aspect끼리는 순서가 보장되는 것을 이해 했는데요. @Order가 적용 된 Aspect와 적용되지 않은 Aspect를 섞어서 사용할 때는 순서가 어떻게 적용 되는 지 문의 드립니다. 예) @Order가 붙은 순서대로 먼저 적용 된 후, 안 붙은 Aspect들의 실행 순서는 보장되지 않는다.
- 미해결스프링 핵심 원리 - 고급편
aop 적용 범위 문의
안녕하세요. point cut 적용 범위가 hello.aop.order의 모든 하위 패키지로 지정되었는데요. 조건만 봐서는 AspectV1의 doLog() 또한 AOP 적용 대상이 될 것 같습니다. (AspectV1도 bean으로 등록 되었으므로..) 물론 그렇게 되면 끊임 없이 doLog가 호출될 것이므로, 제외 할 것 같은데요. 어떤 조건을 보고 AOP 적용 대상에서 제외를 하는 걸까요? (@Aspect, @Around 등...)