월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 고급편
component 중복초기화 부분 추상클래스로 변경2
이렇게 구조를 바꾸었습니다이러면 프록시 체인이 되어서 잘 실행되던데 문제없는거겠죠?테스크 코드도 프록시 체인으로 똑같이 했습니다
- 미해결스프링 핵심 원리 - 고급편
쓰레드 로컬 vs 프로토타입 빈
결국 traceID가 서로 다른 쓰레드에서 같은 값을 가지게 되니쓰레드로컬을 이용해서 따로 traceId를 관리 하는거잖아요?그런데 그냥 애초에 Trace클래스 자체의 빈스코프를 프로토타입으로 해버리면각각의 쓰레드가 Trace클래스를 DI받을때마다 쓰레드마다 다른 Trace클래스가 생성되니따로 관리를 할 필요가 없지 않나요?이렇게되면 어떠한 오버헤드가 발생하나요?
- 미해결스프링 핵심 원리 - 고급편
쓰레드 로컬 데이터 저장위치 질문
ThreadLocalLogTrace는 싱글톤이잖아요?그러므로 A와 B에서 참고하는 ThreadLocalLogTrace 참조값은 같은 값을 가리킬꺼같은데,여기서 ThreadLocal<TraceId> 필드는각 A쓰레드 B쓰레드 각각의 공유하지 않는고유의 데이터영역에 저장되는것인가요?(JVM에서 STACK과 PC Register처럼)아니면 일종의 해시함수처럼 작용하여A쓰레드에서의 요청이면 알아서 A의 데이터B쓰레드에서의 요청이면 알아서 B의 데이터를 주는것인가요?만약 전자라면 이게 어떻게 가능한것인지?
- 해결됨스프링 핵심 원리 - 고급편
var 사용에 관한 김영한 선생님의 생각이 몹시 궁금합니다
[질문 내용]안녕하세요 스프링부트 프로젝트를 진행중입니다. 김영한님께서는 var를 자주 쓰는 편인지 궁금합니다. 사실 저는 매우 코드 리뷰할 때 불편하다고 생각하는데 회사에서는 어떤가요? 물론 Intellij 에서 setting 변경을 해주면 옆에 hint로 나오긴 하지만 기업에서는 이런 걸 허용하는지 궁금합니다 감사합니다
- 미해결스프링 핵심 원리 - 고급편
ContextV1 은 템플릿 콜백 패턴이 아닌가요?
ContextV2는 템플릿 콜백 패턴이라고 하셨는데ContextV1 은 템플릿 콜백 패턴이 아닌가요?
- 미해결스프링 핵심 원리 - 고급편
aop에서 DB 접근?
안녕하세요 영한님 강의를 토대로 개인프로젝트를 진행하다가 생긴 의문점입니다스프링 시큐리티의 @Preauthorize를 공부하다가 생긴 의문인데, 만일 여러 컨트롤러의 메서드에서 단순히 User의 ROLE_XXX 뿐만이 아니라, 현재 유저에게 이 리소스를 사용할 자격이 있는지? 를 검사하는 공통된 로직이 필요하다면 (리소스 단순 CRUD 뿐만이 아니라 더 세부적인 로직들이 있다면), 여기에 aop를 적용하는 의의가 있을까요?만일 의의가 있다면, 권한이 있는지를 알려면 DB에 다녀와야 하는데 AOP에서 데이터소스에 접근하는별로 좋은 방법이 아니라고 들었습니다.간단한 예시긴 하지만, 대충 이런 로직을 구현하려고 합니다@CheckOwner어노테이션이 붙어있고, postId를 인자로 받은 경우에선 post.Member.id가 현재 세션의 memberId와 같은 경우에만 이후 로직이 진행되게 하려는 의도입니다.@Around("@annotation(CheckOwner) && args(postId,..)") public Object checkPostOwner(ProceedingJoinPoint joinPoint, Long postId) throws Throwable { log.info("test"); //DefaultTransactionDefinition def = new DefaultTransactionDefinition(); //TransactionStatus status = tr.getTransaction(def) MockPrincipal principal = (MockPrincipal)SecurityContextHolder.getContext() .getAuthentication() .getPrincipal(); Post post = postRepository.findById(postId).orElseThrow(NoPostException::new); if (!post.getMember().getId().equals(principal.getId())) { throw new AccessDeniedException("권한이 없다고"); } Object result = joinPoint.proceed(); log.info("test"); //tr.commit(status); return result; }
- 미해결스프링 핵심 원리 - 고급편
동기화와 동시성 차이
동시에 traceId의 공유변수에 접근하니까 문제가 생겨서그걸 동시성 문제라고 하는데동기화에 문제가 있다는건 무슨말일까요?
- 미해결스프링 핵심 원리 - 고급편
멋지지 않나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]우리의 멘토꽤 멋지심
- 미해결스프링 핵심 원리 - 고급편
질문은 아니고 후기는 강의를 다듣고 남길려고 하는데
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)영한님의 강의력에 정말 감탄이 나오는군요 한마리의 백조같은 유려하고 우아한 설명이에요
- 미해결스프링 핵심 원리 - 고급편
콜백 패턴 반환 타입 T가 두번 쓰이는 이유
public class TraceTemplate { private final LogTrace trace; public TraceTemplate(LogTrace trace) { this.trace = trace; } public <T> T excute(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; } } } 위 콜백 템플릿 에서 메서드 반환이 T 제네릭인건 이해가 되는데왜 반환이 T가 2번 쓰이는걸까요?
- 미해결스프링 핵심 원리 - 고급편
ThreadLocal 관련 질문입니다.
traceId = traceId.createPreviousId(); // traceIdHolder.set(traceId.createPreviousId());두 코드의 결과에는 큰 차이가 없는 것 같은데, 굳이 traceIdHolder.set 을 사용해야 하는 이유가 있을까요??
- 미해결스프링 핵심 원리 - 고급편
Logtrace를 main함수에 등록하는 이유가 무엇인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ProxyApplication 메인함수에 @bean을 사용해 @Bean public LogTrace logTrace(){ return new ThreadLocalLogTrace(); } 이런식으로 logTrace를 등록해주는데, InterfaceProxyConfig가 아니라 main함수에 따로 등록해주는 이유가 무엇인가요?
- 해결됨스프링 핵심 원리 - 고급편
콘크리트프록시를 구현시 원본 구체를 파라메터로 받는이유
콘크리드프록시를 생성 할 때 기존 구체를 상속을 받고 오버라이딩 할 때 아래 예시와 같이 부모 메소드를 super를 통해서 호출이 가능한데요public class OrderControllerConcreteProxy extends OrderControllerV2 { private final LogTrace logTrace; public OrderControllerConcreteProxy(OrderServiceV2 orderService, LogTrace logTrace) { super(orderService); this.logTrace = logTrace; } @Override public String request(String itemId) { TraceStatus status = null; try { status = logTrace.begin("OrderController.request()"); //target 호출 String result = super.request(itemId); logTrace.end(status); return result; } catch (Exception e) { logTrace.exception(status, e); throw e; } } @Override public String noLog() { return super.noLog(); } }이렇게 super를 통해서 호출하지 않고 OrderControllerV2를 따로 new 해서 멤버 변수로 받고 그 원본 구현체를 호출하는 이유가 있을까요?
- 해결됨스프링 핵심 원리 - 고급편
execution 강의 듣다가 execution와 관련된건 아니지만 궁금증이 생겨 문의남깁니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요execution 강의 듣다가 execution와 관련된건 아니지만 궁금증이 생겨 문의남깁니다.AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();강의에서는 pointcut을 위 코드와 같이 전역으로 선언하고 사용하고 있더라구요. pointcut을 전역으로 선언 후 테스트에서 사용하는데 beforeEach에서 초기화를 하지 않으면 다른 테스트에 영향이 갈 수 있지 않나? 생각이 들어서 , 한 번에 모든 테스트를 실행시켜 debug point를 찍으며 확인해봤는데요. 그런데 자동으로 테스트마다 pointcut이 초기화 되더라구요 이유가 있을까요??
- 미해결스프링 핵심 원리 - 고급편
스레드 / traceId 구분
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링부트 자체에서 찍어주는 log를 보면 스레드ID로 이미 충분히 구분이 되고 있는데, 선생님께서 진행해주시는 강의에서는 traceId를 추가해서 개발자가 직접 구분을 또 해주는 이유가 뭔지 알 수 있을까요?
- 해결됨스프링 핵심 원리 - 고급편
템플릿 콜백 패턴 V5 실행 관련 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.v5 코드를 작성했을 때, 아래와 같은 에러가 발생해서Description: Parameter 0 of constructor in hello.advanced.app.v5.OrderRepositoryV5 required a bean of type 'hello.advanced.trace.callback.TraceTemplate' that could not be found. Action: Consider defining a bean of type 'hello.advanced.trace.callback.TraceTemplate' in your configuration. Process finished with exit code 1TraceTemplate 클래스에 @Component 애노테이션을 추가했는데요.@Component @RequiredArgsConstructor public class TraceTemplate { private final LogTrace 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; } } }pdf에는 빈 등록과 관련된 부분이 없는 것 같은데, 빈 등록을 하지 않아도 실행이 되어야 하는 것인가요?스프링 부트 3.1.7 버전 사용하고 있습니다.감사합니다.
- 미해결스프링 핵심 원리 - 고급편
invoke에 대해서 궁금한점이 있습니다.
JDK동적 프록시를 도입후에 사용하게되면 내부에 target 메소드를 직접 호출하는 방식에서 invoke형태로 메소드를 호출하는 방식으로 변경이 되는데 해당 프록시객체의 메소드를 사용할때마다 invoke를 사용하는 방식으로 사용이 되는건가요? 만약에 그렇다면 일반적으로 알기론 일반메소드 호출보다 invoke를 사용한 메소드 호출이 속도면에서 안좋다고 들었는데 이런걸 감안하고 사용을 하는건가요?
- 미해결스프링 핵심 원리 - 고급편
InvocationHandler에 대해서 질문이 있습니다.
public class TimeInvocationHandler implements InvocationHandler { private final Object target; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { log.info("TimeProxy실행"); log.info("proxy={},proxyclass={}",proxy,proxy.getClass()); long startTime=System.currentTimeMillis(); Object result=method.invoke(target,args); //파라미터 인자값 넘겨줌 long endTime=System.currentTimeMillis(); long resultTime=endTime-startTime; log.info("TimeProxy종료 resultTime={}",resultTime); return result; } }@Test void dynamicA() { AInterface target=new AImpl();//원객체 TimeInvocationHandler handler=new TimeInvocationHandler(target); //프록시 객체 AInterface proxy=(AInterface) Proxy.newProxyInstance(AInterface.class.getClassLoader(),new Class[]{AInterface.class},handler); proxy.call(); log.info("targetClass={}", target.getClass()); log.info("proxyClass={} proxy={}",proxy, proxy.getClass()); } 해당부분에서 invoke의 파라미터로 넘어오는 proxy의경우 찍어보니우리가 만든 프록시 객체와 동일한 객체로 찍히던데 해당 파라미터를 사용하는경우가 존재하나요?프록시 체인을 사용하더라도 어차피 target을 이용해서 호출하는거기때문에 관련이 없을꺼같고
- 미해결스프링 핵심 원리 - 고급편
자동프록시 생성기와 프록시팩토리
프록시 팩토리가 동작하고 자동 프록시 생성기가 동작하는건가요? 흐름이 어떤 순서인지 궁금해서 질문 남깁니다.
- 미해결스프링 핵심 원리 - 고급편
런타임시점의 AOP조인포인트에 질문이있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]AOP조인포인트에서 static메서드 접근이 안된다고 하셨는데 혹시 그이유가 프록시 객체가 원객체의 메소드를 실행을 할때 반드시 객체를 호출하는 형태로 메소드를 실행하기떄문에 static메소드는 안되는걸까요?