월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 핵심 원리 - 고급편
[전략 패턴 - 예제 2] 코틀린으로 연습하는 중에 변환이 되지 않아 문의 드립니다.
// ContextV1Test.java @Test void strategyV3() { ContextV1 context1 = new ContextV1(new Strategy() { @Override public void call() { log.info("비즈니스 로직1 실행"); } }); context1.execute(); ContextV1 context2 = new ContextV1(new Strategy() { @Override public void call() { log.info("비즈니스 로직2 실행"); } }); context2.execute(); } @Test void strategyV4() { ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행")); context1.execute(); ContextV1 context2 = new ContextV1(() -> log.info("비즈니스 로직2 실행")); context2.execute(); }// ContextV1Test @Test fun strategyV3() { val context1 = ContextV1(object : Strategy { override fun call() { log.info("비즈니스 로직1 실행") } }) context1.execute() val context2 = ContextV1(object : Strategy { override fun call() { log.info("비즈니스 로직2 실행") } }) context2.execute() } @Test fun strategyV4() { val context1 = ContextV1({ log.info("비즈니스 로직1 실행") }) context1.execute() val context2 = ContextV1({ log.info("비즈니스 로직2 실행") }) context2.execute() }interface 에 메서드가 하나만 있는 경우 람다를 활용할 수 있다. java 코드를 코틀린으로 변환하면서 v3 는 정상적으로 변환에 성공했습니다.하지만 v4 는 정상적으로 되지 않습니다.코틀린에 아직 익숙하지 않다보니 생긴 문제인거 같기도 한데..혹시 강의 범위를 벗어나긴 하지만 도움을 주실 수 있을까요?
- 미해결스프링 핵심 원리 - 고급편
강의와는 상관없는 질문입니다만..!!
선생님 강의 정말 잘 듣고 있습니다.다름이 아니라 외부 db와 연동하여 이미지 파일을 다운로드해야 하는데 데이터가 많아서 실행 속도에 문제가 있을 때, mvc와 webflux를 적용하여 두 개의 속도를 보고 싶습니다. 메서드 호출과 종료에 직접 자바 코드로 시간 측정하는 것 말고는 방법이 없을까요?
- 미해결스프링 핵심 원리 - 고급편
안녕하세요 강사님! 강의 너무너무 도움 되고 잘 들었습니다!! 질문이 있습니다! JDBCTemplate로 batchUpdate시에 동시성문제가 생기나요?
JPA에선 아이디 체번방식에따라서 bulkInsert/update를 지원하지않다보니 JDBCTemplate에 batchUpdate를 통해 로직을 작성하게됐습니다. 이때 동시성 문제를 고민하지않을수가 없어서 찾아보니 JDBCTemplate도 내부적으로 ThreadLocal을 사용하고 있었습니다. 그렇다면 JDBCTemplate도 동시성문제를 고민하지 않아도 되는 부분일까요?궁금해서 JDBCTemplate의 코드를 뒤져보다가 DataSourceUtils.getConnection(ds) 내부에서TransactionSynchronizationManager.getResource(ds)를 통해 ConnectionHolder를 가져오는데TransactionSynchronizationManager.getResource(ds)를 더 들어가 보면ThreadLocal <Map <Object, Object>>로 되어있는 resources를 가져와 ds를 키로 ConnectionHolder를 가져오는 것을 볼 수 있었습니다. 그래서 운영단계로 넘어가도 동시성문제가 없을것 같은데 강사님 생각은 어떠신지 궁금합니다!
- 미해결스프링 핵심 원리 - 고급편
프록시 객체
영한님, 서포터즈님들 안녕하세요CGLIB는 구체 클래스의 프록시 객체를 생성하기 때문에 기본 생성자가 필요하게 되는데, 이와 마찬가지로 JPA에서도 proxy 객체를 생성하기 위해서(ex 지연로딩) 기본 생성자를 만들어야하잖아요?그러면 스프링에서는 CGLIB용 proxy , JPA 용 proxy 이렇게 하나의 클래스가 여러 개의 proxy를 가지고 있게 되나요?
- 미해결스프링 핵심 원리 - 고급편
블로그 정리
안녕하세요. 영한님디자인 패턴 내용에 대해서 블로그에 정리하고자 하는데 영한님이 제공해주신 문서랑 영상 참고해서 작성해도 될까요? 출저는 남기겟습니다
- 미해결스프링 핵심 원리 - 고급편
PostProcessor로 생성된 bean 의 type 은 Proxy 객체가 아닌가요?
[질문 내용]BeanPostProcessorTest.java 를 조금 수정하였는데요.AToBPostProcessor 에 if (bean instanceof A) 이면 ProxyFactory를 사용하여 proxy 객체를 리턴하도록 하였습니다. 그 후 테스트코드에서 applicationContext.getBean("beanA") 를 찍어보았더니, class.com.sun.proxy$Proxyxx 가 아닌 helloA 실제 객체가 찍혀있는걸 확인하였습니다. A a = applicationContext.getBean("beanA");a.helloA(); 하면 프록시가 잘 적용되서 부가기능이 찍히는걸 확인하였는데요. a 를 찍었을 때 Porxy 객체가 리턴될줄 알았는데 실 객체가 리턴되어서요. 왜 그런 것 일까요?
- 미해결스프링 핵심 원리 - 고급편
LogTrace, AopConfig 순환 참조..
안녕하세요. 제가 아래 코드 처럼 개인 프로젝트에 로그를 추가해보고 싶어 빈으로 등록 했습니다.@Configuration public class LogConfig { @Bean public LogTrace logTrace() { return new ThreadLocalLogTrace(); } }@Slf4j @Aspect//ㅇㅓ드바이저로 변환하여 저장(어드바이저 빌더) public class LogTraceAspect { //어드바이스 로직 private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } }@Configuration public class AopConfig { @Bean public LogTraceAspect logTraceAspect(LogTrace logTrace) { return new LogTraceAspect(logTrace); } }┌─────┐| logTraceAspect defined in class path resource [co/kr/***/cofig/aop/AopConfig.class]↑ ↓| logTrace defined in class path resource [co/kr/****/cofig/log/LogConfig.class]└─────┘이렇게 순환 참조 에러가 나더라구요..log와 aop에서 서로 참조하고 있는데 어떻게 설계를 해야 할지 감이 잘 안옵니다.빈을 아래와 같이 한 곳에 모아두면 잘 동작 하지만 왜 동작 하는지 이해가 안되며 이렇게 해도 되는지 모르겠습니다.@Configuration public class AopConfig { @Bean public LogTraceAspect logTraceAspect(LogTrace logTrace) { return new LogTraceAspect(logTrace); } @Bean public LogTrace logTrace() { return new ThreadLocalLogTrace(); } }혹시 더 좋은 방법이 있을까요??감사합니다.
- 미해결스프링 핵심 원리 - 고급편
TraceId 관련하여 질문 드립니다
안녕하세요 수업 잘듣고 있습니다!다름이 아니라 수업 도중 TraceId 와 Status 관련하여 개념이 헷갈려서 질문 드립니다.제가 아는 Id 의 경우는 식별자여서 오로지 uuid 만 보관하고 사용해야 한다고 생각하는데 수업에서는 level을 두고 그곳에서 +1 -1 을 진행하신점이 왜 그런 방식으로 하시는 것인지 궁금합니다. 제 생각으로는 Status 쪽에서 level 을 관리해야하는 것이 아닌가 생각이 들어 여쭈어 봅니다. 질문의 핵심은 어떤 필드를 TraceId에 넣어야 하고 어떤 필드를 Status 에 넣어야하는지 명확한 기준이 있는지 이고 그 기준은 어떤 것인지 궁금합니다. 추가적으로 spring 을 공부하면서 Holder라는 관용구를 상당히 많이 보는데 이 holder 라는 객체들의 역할이 무엇인지 궁금합니다. 감사합니다
- 미해결스프링 핵심 원리 - 고급편
모든 api 엔드포인트에 로그를 위해 포인트컷 적용
Api가 많은 단일 프로젝트 내에 로그를 남기기 위해 모든 컨트롤러 메소드에 포인트컷을 적용하면 성능에 대한 이슈가 있을 것 같은데요.로그 예제처럼 aop를 사용해서 로그를 남기는게 일반적인가요?
- 해결됨스프링 핵심 원리 - 고급편
HelloTraceV1 주입하는이유
안녕하세요 제가 뭔가 기초가 부족한것 같긴한데 질문드립니다HelloTraceV1 구현체는 빈으로 등록해서 OrderControllerV1에 주입하는 이유가 무엇인가요??인터페이스라면 OCP원칙을 지킨다는이점으로 이해할수있는데 new로 생성하지않고 구현체를 직접 등록하는이유는 따로 있나요??이부분에선 OCP원칙이 아닌 스프링빈의 싱글톤,생명주기 관리 등의 이점을 얻기위해 인가요?? 혹은 훗날 HelloTraceV1이 변경될수있는 가능성을 염두하는건가요??
- 미해결스프링 핵심 원리 - 고급편
혹시 TraceId를 만들때 setter를 안만드는 이유가 있을까요 ?
혹시 TraceId를 만들때 setter를 안만드는 이유가 있을까요 ?
- 미해결스프링 핵심 원리 - 고급편
interface만 있는 경우 JDK 적용 가능성
안녕하세요 영한님 강의를 들으며 토이 프로젝트에도 적용해보고 있습니다.jdk 동적 프록시를 적용하고 있는데 제가 이해한 영한님의 DynamicPorxyBasicConfig 파일에서는 interface + 구현체 이렇게 두개 있어야 적용할 수 있는 것 같습니다.하지만 보통(?) Repository같은 경우 JPA를 상속 받아 interface만 구현하여 놓고 만 사용하는 경우가 있습니다.이 경우에는 구현체가 없어 orderRepository를 따로 생성하지 못하는 경우가 생깁니다.이런 interface만 있는 경우는 jdk를 적용하지 못하는걸까요? 감사합니다.
- 해결됨스프링 핵심 원리 - 고급편
프록시가 적용되면 원본 빈은 등록이 안되는건가요?
A라는 빈이 컴포넌트 스캔에 대상이라고 가정해보겠습니다.그리고 A의 특정 메서드에 대해서 @Aspect 어노테이션이 붙은 어드바이저도 만들었다고 가정해보겠습니다. 그럼 A에 대한 프록시가 만들어지고 빈 후처리기에 의해 등록될텐데 그럼 원본 A는 스프링 빈으로 등록이 되는건가요 안되는건가요??
- 미해결스프링 핵심 원리 - 고급편
@AfterReturning : result 질문입니다.
@Slf4j @Repository public class OrderRepository { public String save(String itemId) { log.info("[orderRepository] 실행"); //저장 로직 if (itemId.equals("ex")) { throw new IllegalStateException("예외 발생!"); } return "ok"; } } @AfterReturning(value = "hello.aop.order.aop.Pointcuts.allOrder()", returning = "result") public void doReturn2(JoinPoint joinPoint, Integer result) { log.info("[return] {} return = {}", joinPoint.getSignature(), result); }@AfterReturning에 result 타입은 Integer 이기 때문에 OrderRepository의 반환 타입과 매칭되지 않아 해당 기능이 실행되지 않는다고 하셨는데 해당 로직은 포인트컷에서 필터링되는것이 아니라 어드바이스 로직에서 필터링 되는건가요? 프록시가 생성된것 보니 포인트컷이 아니라 해당 어드바이스에서 실행된것 확인했습니다.
- 해결됨스프링 핵심 원리 - 고급편
쓰레드로컬관련 질문이 있습니다.
안녕하세요.수업을 듣다가 궁금하여 질문드립니다.. FiedlLogTrace는 빈으로 등록하여 작동하니, 동시성 문제가 있어 쓰레드 로컬을 사용하였는데 @Controller, @Service 이러한 것들도 빈으로 등록이 되는 것인데 이러한 것들은 동시성 문제와 관련이 없는건가요? 바보같은 질문이지만.. 감사합니다.
- 해결됨스프링 핵심 원리 - 고급편
V2에 대해서 질문있습니다.
구현 클래스(OrderRepositoryV2)를 따로 bean으로 등록하지 않고 프록시를 빈동록할 때 new 연산자로 생성해주는 이유가 따로 있을까요?@Bean public OrderRepositoryV2 orderRepositoryV2(LogTrace logTrace) { //이 부분 OrderRepositoryV2 repository = new OrderRepositoryV2(); return new OrderRepositoryConcreteProxy(repository, logTrace); }proxy를 bean으로 등록할 때 그 안에서 OrderRepositoryV2 객체를 생성하니똑같이 싱글톤처럼 사용되긴 할텐데 따로 bean 등록한 후 의존 주입을 하지 않는 이유가 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
5. 동적 프록시 기술 강의 자료 오타
안녕하세요 영한님, 서포터즈님들 동적 프록시 강의자료 보다가 JDK 동적 프록시 - 적용2 config 부분에서 주입하는 각 부분에서 강의와 다른 것 같아서요 !감사합니다
- 해결됨스프링 핵심 원리 - 고급편
args관련해서 질문있습니다!.
안녕하세요 항상 좋은 강의 감사합니다.전 강의 args와 현재 강의를 듣고 제가 이해를 잘 하지 못한 것 같아 질문 하나 드립니다.해당 강의에서 "args, @args, @target은 실제 객체 인스턴스가 생성 되고 실행될 때 어드바이스 적용 여부를 확인할 수 있다." 고 하셨습니다.1.전 강의 args에서는 spring을 통한 테스트가 아니었기 때문에 모든 스프링 빈에 AOP를 적용 하려는 것을 생각하지 않아도 되는게 맞을까요?2.args를 테스트 할때는 왜 스프링으로 빈 등록을 할 필요가 없었을까요?String, Object는 java.lang은 이미 가지고 있고, args(), args(..), args(*)등은 인스턴스 정보가 필요 없고 만약 Custom한 객체 args(Parent)같은 타입이 들어간다면 자동으로 스프링 동작이 필요한 걸까요?기초적인 질문이라 죄송합니다.
- 미해결스프링 핵심 원리 - 고급편
Method 메타 데이터 전달 방식
안녕하세요.핸들러의 invoke함수 인자로 받는 Method는 어떠한 방식으로 넘어오는지 궁금합니다. 하나가 아닌 여러개가 넘어올 경우에는 어떻게 처리하는지도 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
리플렉션 부분
안녕하세요. 강의 자료 '5.동적 프록시 기술' 의 3쪽에서 참고에 대한 내용으로 람다를 이용해서도 문제 해결을 할 수 있다고 하셨는데, 람다가 익숙하지 않아서 어떻게 하는 건지 궁금합니다..!! 알려주실 수 있을까요??