월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 핵심 원리 - 고급편
@EnableAsync 에서의 default 가 JDK 동적 프록시인 이유
안녕하세요 김영한님!강의 감사히 잘 들었습니다!!완강을 한지는 몇개월이 지났는데, 코딩 중 궁금한 점이 생겨 글을 작성합니다!제목에서와 같이 @EnableAsync 라는 어노테이션을 코드에서 발견했는데요. 해당 어노테이션의 속성에는 proxyTargetClass 라는 속성을 넣을 수 있게 되어 있었습니다.하지만 저는 그 속성을 보자마자 당황스러웠는데요. 보통 스프링 부트는 default로 CGLIB를 사용해서 proxyTargetClass = true 라는 속성이 있으면 회색빛으로 "이 속성을 안써도 괜찮다" 라는 언급을 해줍니다. 그런데 제가 proxyTargetClass = true를 보았을땐 명확한 하얀색으로 되어있어 이제까지 잘못알고 있었나하여 굉장히 당황했습니다.당황함을 뒤로한채 해당 어노테이션의 설명을 보니, 이 어노테이션에서는 proxyTargetClass의 default = false로 되어있고, CGLIB를 사용하고 싶다면 true로 바꾸라는 설명이 쓰여있었습니다.왜 비동기를 설정하는 어노테이션에서 이런 속성을 정의해야하는것일까요..+ 추가질문) 이 어노테이션의 속성을 보면서 느낀점은 한 프로젝트 내에서 A는 CGLIB로 B는 JDK 동적 프록시로 사용하고 싶다면 B를 빈후처리기를 사용해서 직접 설정해주면 될까요?
- 미해결스프링 핵심 원리 - 고급편
Proxy객체의 cacheValue에서 동시성 문제가 발생하지 않는지 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]프록시 패턴을 실제 코드에 적용한다고 가정했을 때 Proxy객체의 cacheValue에서 동시성 문제가 발생하지 않는지 궁금합니다! 만약 동시성 문제가 발생한다면 ThreadLocal을 이용해서 해결하면 될까요?
- 미해결스프링 핵심 원리 - 고급편
실무에서의 AOP 사용법에 대한 질문
안녕하세요 김영한님!강의 감사히 잘 듣고 있습니다.지난 11강 포인트컷 파트에서 여러 지시자들의사용법을 많이 알려주셨는데요,제 기억에는 execution 지시자의 사용 빈도가 높다고말씀하셨던 것으로 기억합니다.그런데 이번 강의에서는 어노테이션을 생성해@annotation 지시자를 사용하셨습니다.제가 보기엔 @annotation 지시자는 조인포인트에 해당 어노테이션을 붙여야 하는 번거로움이 있지만 그래서 오히려 더욱 명확한 코드가 되는 것 같고,반대로 execution 지시자는 조인포인트가 Aspect를 알 필요가 없어 더 나은 코드처럼 보이기도 합니다.실무에서 execution과 @annotation 지시자 중어느 방식을 더 선호하시는지 알고 싶습니다.제가 잘못 이해한 부분이 있다면 양해부탁드립니다!
- 미해결스프링 핵심 원리 - 고급편
ApplicationContext, ObjectProvider
ApplicationContext, ObjectProvider 이 두가지는 생성자 주입으로 받을 때@Autowired가 필요 없나요?
- 미해결스프링 핵심 원리 - 고급편
NoLog
[질문 내용]DynamicProxyFilterConfig에서 PATTERNS에 들어있는 문자열이 메핑 주소에 들어있으면 로그가 안뜨는게 아니라 클래스 명에 포함되어 있으면 로그가 뜨지 않는 거로 이해했는데 맞을까요?
- 미해결스프링 핵심 원리 - 고급편
@Bean vs @Component
빈등록하는 방법에@Bean을 통한 직접등록,@Component를 통해 자동 스캔@Import를 통한 등록 3가지를 말씀해주셨는데요, @Bean과 @Component는 왜 구분지어지는건가요?@Bean은 @Configuration 객체안에서만 사용할 수 있는 규칙이라던지 있는건가요?
- 미해결스프링 핵심 원리 - 고급편
안녕하세요! 김영한님 강의를 열심히 듣고 있는 학생입니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 김영한님 강의를 통해 스프링을 공부하며, 조금씩 성장중인 학생입니다. 다름이 아니라 제가 김영한님 강의를 통해 공부한 내용들을 벨로그에 작성하고 나중에 꺼내보고 싶은데 괜찮을까요?상업적 목적은 일절 없으며, 강의자료의 내용을 제 나름대로 이해하여 풀어쓰고, 적용 코드들을 예시로 기재할 예정입니다.
- 미해결스프링 핵심 원리 - 고급편
LogTrace 주입
안녕하세요.원래 위의 상태에서, 아래에서 ConcreteProxyConfig.class 를 @Bean 으로 등록을 하면 LogTrace 주입이 잘 되는 이유가 궁금하네요.ConcreteProxyConfig를 @Bean 으로 등록이 되어야만, ConcreteProxyConfig 내에 @Bean 으로 설정한 것들도 @Bean 으로 등록이 되는지는 알겠는데, 그렇다고 LogTrace 이 어떻게 @Bean으로 등록이 되어 주입이 될 수 있는지 궁금합니다. 감사합니다.
- 미해결스프링 핵심 원리 - 고급편
newProxyInstance 클래스 로더
예제에서보면 newProxyInstance 매개변수로 들어가는 클래스 로더는 프록시 타겟 클래스에서 가져오는걸로 맞추신 것 같은데그렇게 해야하는 이유가 있을까요?예를들어 Controller의 프록시를 만들 때 Controller.class.getClassLoader가 아닌 Service.class.getClassLoader로 하면 안되는건가요?
- 해결됨스프링 핵심 원리 - 고급편
동적프록시 인터페이스 함수 여러개
동적프로스 생성 시 지정하는 핸들러의 Invoke 메소드는 하나인데요, 만약 대상 인터페이스가 가진 메소드가 call() 하나가 아니라 두개 이상이라면 어떻게 되는건가요?A.call()을 하든 A.call2()를 하든 결국 Invoke안에서 method 호출만 메소드에 따라 달리하는 것이고 Invoke에서 지정한 공통 로직은 메소드에 따라 구분할 순 없는것인가요?
- 미해결스프링 핵심 원리 - 고급편
request 스코프 활용
스프링 핵심 원리 기본편에서 설명해주신 request 스코프를 사용하면 uuid가 유지되는 객체를 컨트롤러, 서비스, 레퍼지토리 로직에서 공유할 수 있을 것 같은데 이를 활용해서는 level 까지 포함한 로깅을 구현하긴 어려운걸까요? 지금 내용처럼 TraceId를 파라미터로 넘겨 받는 방식으로만 가능한건지 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
Callback 인터페이스를 기존의 Runnable 로 실행해도되나요?
문득 궁금한게 생겨 질문드립니다.강의에서는 Template Callback 패턴에서 Callback 인터페이스를 생성해서 사용하고있는데 아래코드처럼 기존 자바의 Runnable 인터페이스를 사용해서 콜백함수를 넘겨줘도 상관이없나요? 결과는 동일한것으로 보이는데 혹이 차이점이 있다면 무엇이 다른지 여쭤보고싶습니다
- 미해결스프링 핵심 원리 - 고급편
표현식 0..*의 의미가 뭔가요?
스프링 핵심 원리 고급편/ 섹션11 스프링 AOP-포인트컷/execution1의 6:10에 대한 질문입니다.파라미터에서 '..'은 '0..*'와 같다고 했는데, '0..*'의 의미가 뭔가요?'0..*'을 표현식의 파라미터 부분에 넣고 검증해보니 동작하지 않는 걸 보니 표현식은 아닌 것 같습니다.'0..*'에서 '0', '..', '*'가 각각 무엇을 의미하는 건지 잘 모르겠습니다.
- 미해결스프링 핵심 원리 - 고급편
프록시 적용시 @RequestMapping과 요청url 매핑
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]제가 알고 있는 짧은 지식으로는 스프링에서 요청url을 처리할 때 요청url과 @RequestMapping에 적힌 url이 매칭이 되는 메서드를 찾아 해당 메서드를 실행시켜 주는 것으로 알고 있습니다. 이때는 실제 컨트롤러가 직접 호출되어 요청 url과 @RequestMapping이 매핑이 되는 것으로 이해하고 있습니다. 그런데 프록시를 적용할 경우 프록시가 먼저 호출되고 프록시에서 컨트롤러를 호출하게 되는데, 빈으로 등록되지 않은 컨트롤러의 @RequestMapping과 요청url 매핑을 스프링에서 자동으로 처리해주는 것인가요?그렇다면 어떤 원리로 이뤄지는지 알려주시면 감사하겠습니다.
- 해결됨스프링 핵심 원리 - 고급편
protected() 접근제어자
안녕하세요.AbstractTemplate 클래스의 call() 함수의 접근제어자를 protected 로 한 이유가 있을까요?private - 상속을 받지 못하므로 사용Xcall()은 execute() 가 호출하는 내부함수이므로 최대한 접근제어를 줄이면 좋으니까 protected() 사용한 것이 맞을까요?default와 public 로 굳이 외부로 노출할 필요없다. 이런 것 맞을까요? 감사합니다.
- 해결됨스프링 핵심 원리 - 고급편
remove()
https://www.inflearn.com/questions/944736 의 질문을 읽어봤습니다."remove()를 하게 되면 A의 데이터가 사라지는 것은 아니고 ThreadLocal 의 해당 변수의 데이터가 사라진다? "가 이해가 되지 않네요. 다음 강의인 정리의 마지막 부분에서 영한님이 말씀하시길 사용자A의 전용 보관소의 데이터를 꼭 지우라고 하셨거든요. 그리고 사용자A가 remove()를 했다면, 사용자B는 조회시 애초에 아무것도 저장하지 않았으므로 어떤 값도 못 얻는 것 맞을까요? (심지어 thread-A 쓰레드를 할당받더라두요) 감사합니다.
- 미해결스프링 핵심 원리 - 고급편
로그 추적기의 요구 사항이 public 메서드 호출을 로깅하는 건데, private 메서드 호출까지도 로깅하는 걸로 하고 싶다면 어떻게 해야할까요?
로그 추적기의 요구 사항이 public 메서드 호출을 로깅하는 건데, private 메서드 호출까지도 로깅하는 걸로 하고 싶다면 어떻게 해야할까요? private 메소드는 AOP 적용 불가능한대, 디버깅시 어떤 흐름으로 함수가 호출되지 파악하기 위해서 private 메서드 호출도 봐야되는 것 같고, 그러면 어떻게 하는지 궁금해서 여쭤봅니다. 혹시 모니터링 툴로 함수의 전체적인 호출 흐름을 파악할 수 있나요?
- 미해결스프링 핵심 원리 - 고급편
@Around 에서 joinPoint.proceed()
@Around 설명 부분에 joinPoint.proceed() 호출 여부를 선택할 수 있다고 하셨는데 코드의 문제점을 설명해주실 떄 그런데 @Around 는 항상 joinPoint.proceed() 를 호출해야 한다. 라고 자료에 써져있는데.. 호출 여부를 선택할 수 있는거 아닌가요?!
- 해결됨스프링 핵심 원리 - 고급편
ThreadLocal.remove()
사용자A 가 thread-A 로 thread-A 전용 보관소에 사용자A 데이터를 저장했다가 ThreadLocal.remove() 를 하게 되면 thread-A 전용 보관소에 저장된 사용자A 데이터도 사라지게 되는 것 아닌가요..??
- 미해결스프링 핵심 원리 - 고급편
args 표현식을 이용한 매개변수 전달 개념 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 포인트컷 표현식을 이용하여 매개변수를 전달하는 것을 공부했습니다. 이 개념과 본래 포인트컷의 개념이 헷갈려서 문의드립니다. @Around("allMember() && args(arg, ..)") public Object logArgs2(ProceedingJoinPoint joinPoint, Object arg) throws Throwable { log.info("[logArgs2]{}, arg={}", joinPoint.getSignature(), arg); return joinPoint.proceed(); } 포인트컷은 조인 포인트를 필터링하기 위한 개념으로 공부했습니다. 위 코드에서 args(args, ..) 부분의 args가 매개변수를 나타내는 것은 이해가 됩니다. 하지만 ArgsTest 코드에서 학습했을 때는 args() 표현식 안에 String, Object, java.io.Serializable 등등과 같은 타입을 적어줘서, 매개변수의 타입을 필터링했었거든요. 그러면 args는 어떤 타입을 필터링하는 포인트컷인가요? 무엇이든 상관없는건가요?