월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 고급편
강의자료 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요, 영한님 강의를 수강 하고 있는 수강생 입니다. 다름이 아니라, 블로그 작성에 있어 영한님 강의자료 PDF 이미지를 사용해도 괜찮을까요?(PDF의 Diagram이 인용 가능한 라이센스인지 확인하고자 문의 드립니다!)
- 해결됨스프링 핵심 원리 - 고급편
try / catch 문 질문
1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]김영한님은 intellij에서 try / catch 문을 생성하면 catch 문 안에 자동으로 e.printStackTrace(); 가 나오는데, 저는 throw new Exception(e); 이 나옵니다.Configure Live Templates를 확인해보았지만, try catch문에 대한 설정을 찾지 못했습니다. 어떻게 하면 김영한 님처럼 catch문 안에 자동 생성되는 내용을 throw가 아닌, printStackTrace로 변경할 수 있는지 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
V2 ConcreteProxyController 빈 중복 에러 (SpringBoot V3)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요, 영한님! 먼저 이렇게 좋은 강의를 들을 수 있게 되어서 너무 기쁘고 감사드립니다.먼저 저는 SpringBoot 3.0.5 버전 사용중입니다.그렇기 때문에 어쩔 수 없이 @RequestMapping으론 컴포넌트 스캔 대상이 되지 않기 때문에 V2 컨트롤러에는 @RestController가 붙어있습니다.구체 클래스 기반 프록시 V2에 적용할 때, 프록시 컨트롤러를 빈으로 등록하려고 하니 아래처럼 빈이 중복으로 등록된다고 오류가 발생하였습니다.*************************** APPLICATION FAILED TO START *************************** Description: The bean 'orderControllerV2', defined in class path resource [me/iseunghan/hello/proxy/app/v2/concrete_proxy/ConcreteProxyConfig.class], could not be registered. A bean with that name has already been defined in file [/Users/iseunghan/workspaces/study/lecture-spring-advanced/proxy/build/classes/java/main/me/iseunghan/hello/proxy/app/v2/OrderControllerV2.class] and overriding is disabled. Action: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true Process finished with exit code 1 그래서 로그에 친절하게 나와있는대로 application.yaml에 아래 설정을 추가하니 정상적으로 실행 및 테스트가 되었습니다.application.yamlspring.main.allow-bean-definition-overriding: true혹시 이와 같은 방법 이외에는 다른 방법이 없을지 여쭤보고 싶습니다..! 감사합니다.
- 미해결스프링 핵심 원리 - 고급편
OrderControllerV1 인터페이스에서 @RequestParam 작성 관련 질문
OrderControllerV1 인터페이스에서 @RequestParam을 생략하면 안 되고 작성해줘야 한다고 하셨는데, '@RequestParam("itemId")'과 같이 "itemId"라는 속성도 생략하면 안 되는 것인가요? @RequestParam이 아닌 @RequestParam("itemId")로 적어주어야 하는 것인가요?
- 미해결스프링 핵심 원리 - 고급편
쓰레드, 쓰레드 전용 보관소 관련 질문
질문1. Thread-A가 살아있을 때까지 Thread-A 전용 보관소도 살아있는 것인가요? 그렇다면 쓰레드 풀을 사용하는 경우, Thread-A와 함께 Thread-A 전용 보관소도 영구적으로 살아있는 것인가요?질문2. ThreadLocal.remove()하는 것은 쓰레드 전용 보관소를 제거하는 것이 아니라, 보관소에 존재하는 값을 제거하는 것이 맞을까요?질문3. ThreadLocal<TraceId>에서 TraceId는 쓰레드 전용 보관소에 저장된 데이터의 타입이 TraceId라는 뜻인가요..?
- 해결됨스프링 핵심 원리 - 고급편
수업 방식 질문입니다.
테스트에 @Test 가 달린 코드만 작성하는게 아니라 테스트에 사용되는 다른 개발 코드들도 테스트 폴더 밑에 작성하고 계신데 이런걸 TDD로 봐도 될까요?
- 미해결스프링 핵심 원리 - 고급편
try문 안에 trace.begin() 넣기
OrderControllerV1.java @GetMapping("/v1/request") public String request(@RequestParam String itemId) { TraceStatus status = trace.begin("OrderController.request()"); //시작 로그 출력 try { orderService.orderItem(itemId); trace.end(status); //종료 로그 출력1 return "ok"; } catch (IllegalStateException e) { trace.exception(status, e); //종료 로그 출력2 throw e; } }trace.begin() 코드에서도 예외가 발생할 수 있으니 try문에 넣어야 한다고 하셨는데, 어떤 부분에서 예외가 발생하나요..?? 혹시 log.info()에서 예외가 발생하나요??
- 미해결스프링 핵심 원리 - 고급편
api 결과에 대한 질문
restapi로 댓글 crud를 할때에 대한 질문입니다. (crud 모두 restapi로 구현하였습니다.) create, update, delete에 대한 결과값으로 return new ResponseEntity<>(200); 을 하게 만들었습니다. 그리고 성공하면 클라이언트가 댓글리스트를 가져오는 api를 요청하도록 만들었습니다. 이렇게 만드는 게 맞는 건가요? ResponseEntity를 리턴하는 컨트롤러의 경우 @RestController말고 @Controller를 달아도 되던데, @RestController로 명시적으로 해주는 게 맞을가요? 자신이 쓴 댓글에는 수정 및 삭제를 보이게 하고 싶습니다. 다양한 방식이 있던데 일반적으로는 어떤 방식으로 하는지 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
하위 에러를 상위로 던진 후 나온 로그 보는 법
어느 강의인지가 기억이 안나서 문의드립니다! 기억나는 내용은 3단계(가장 하위)에서 익셉션 발생 시켜서 2단계에서 해당 익셉션을 받은 다음 다시 1단계로 던져서 나온 로그 보는 법에 대한 강의였던 걸로 기억합니다.
- 해결됨스프링 핵심 원리 - 고급편
댓글 구현에 대한 질문
댓글 구현 중에 질문이 있어서 남깁니다. 댓글 수정 기능 구현할 때, 댓글의 주인인지 아닌지를 검사해야하는데findByCommentIdAndUsername으로 한번에 가져오는 것 (조인)findByCommentId해서 게시자 지연로딩findByCommentIdWithUser해서 user도 같이 가져오도록 fetch join 어떤게 가장 좋은 방법일까요. 그리고 성공시에 클라이언트에게 어떤 정보를 리턴하는 게 가장 좋을까요?댓글을 리턴해주면 될까요?
- 미해결스프링 핵심 원리 - 고급편
어드바이스에 변수
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요, 궁금한 점이 있어 문의 드립니다. AOP를 적용하여, joinPoint.proceed(); 수행 시간을 재려고 하는데요,어드바이스 Method안에서, 시작 시간과, 종료시간을 모두 측정하거든요, 그럼 ThreadLocal을 사용하지 않아도 된다고 생각했습니다.(인스턴스 변수가 아니기 때문에) 제 판단이 맞을까요?- 클래스의 인스턴스 변수 만이 동시성 문제가 있는걸까요?
- 미해결스프링 핵심 원리 - 고급편
빈 후처리기
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================섹션 7을 보면, 그냥 빈 후처리기가 있고, 스프링에서 제공하는 빈 후처리가 있는데, 그냥 민 후처리기는 스프링에서 제공하는 게 아닌건가요? 헷갈리네요ㅠㅠ
- 미해결스프링 핵심 원리 - 고급편
@Import 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 강의 내용에 궁금한 점이있어 11. 스프링 AOP- 포인트컷.pdf 에 18 페이지에 있는, AtTargetAtWithinTest class에 대한 질문이 있어 글 남깁니다. @Import({AtTargetAtWithinTest.Config.class}) 를 쓰지 않고, static class Config 에 @TestConfiguration을 써도 동작하더라구요, 혹시 작동방식에있어서 차이가 있을까요?
- 해결됨스프링 핵심 원리 - 고급편
ProceedingJoinPoint에 대해 질문이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 스프링 AOP 구현부분의 강의를 들으면서ProceedingJoinPoint가 어떻게 호출되는 객체에 대한 정보나, 실행되는 메서드의 정보에 대해 아는지에 대해 궁금해서 질문 올립니다.앞의 자동 프록시 등록 과정들을 설명들을 정리해보면,스프링 부트 자동 설정으로 "AnnotationAwareAspectJAutoProxyCreator" 이라는 자동 프록시 생성기가 빈 등록되어 있는데,이 자동 프록시 생성기가 @Aspect가 붙은 클래스를 보고 Advisor(어드바이저)로 변환해 저장해준다.그리고 이 Advisor(어드바이저)를 보고 포인트컷의 대상이 되는 것들을 "ProxyFactory"에 인자로 넘겨 자동으로 프록시를 생성하고 적용해준다.그런데 여기서 ProceedingJoinPoint는 왜, 무슨 연관관계가 있어서 타겟에 대한 정보들을 알고 있는지에 대해 궁금합니다.
- 미해결스프링 핵심 원리 - 고급편
추상클래스 autowired 및 빈 등록 관하여 질문이 있습니다.
강의해주신 소스코드에서, 추상클래스에 @Component와 멤버변수에 @Autowired를 붙이지 않는 모습을 보여주셨습니다. 이와 관련해서 여러 실험을 해보다보니 궁금한 점이 생겼습니다. 궁금한 점은,추상 클래스에 @Component를 붙여도 왜 정상작동하는 지 모르겠습니다. -> 추상 클래스는 객체 생성이 불가능한 것으로 알고 있는데, 어떻게 빈에 등록되는 건가요?(제네릭이라 빈컨테이너에서 가져오는 것도 쉽지 않네요..)위의 코드에서 @Autowired를 붙이고, 생성자를 지웠습니다.이미 빈에 등록된 LogTrace를 꺼내서 사용하고자 하는데 왜 null이 반환되어 널포인터예외가 발생합니다. 이는 왜 불가능한 것인가요??
- 해결됨스프링 핵심 원리 - 고급편
인터페이스 기반 프록시 적용 후 orderController bean method 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]인터페이스 프록시를 적용한 뒤 프로젝트를 실행 하니 아래와 같은 오류가 발생했습니다.org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'orderControllerImpl' method hello.proxy.app.config.v1_proxy.interface_proxy.OrderControllerInterfaceProxy#request(String) to {GET [/v1/request]}: There is already 'orderControllerV1' bean method hello.proxy.app.v1.OrderControllerV1Impl#request(String) mapped.검색해보니 매핑 정보가 겹쳐있다고 나오는데제가 보기에는 어디가 겹친 건지 모르겠더라구요..강의 코드도 비교 해봤는데 비슷한거 같고..어디가 문제인지 궁금합니다.해당 오류가 발생한 OrderControllerInterfaceProxy와 OrderControllerV1Impl 코드 첨부합니다.ProxyApplication@Import(InterfaceProxyConfig.class) @SpringBootApplication(scanBasePackages = "hello.proxy.app") // app 패키지 하위만 컴포넌트 스캔의 대상이 된다. public class ProxyApplication { public static void main(String[] args) { SpringApplication.run(ProxyApplication.class, args); } @Bean public LogTrace logTrace() { return new ThreadLocalLogTrace(); } }OrderControllerInterfaceProxy@RequiredArgsConstructor public class OrderControllerInterfaceProxy implements OrderControllerV1 { private final OrderControllerV1 target; private final LogTrace logTrace; @Override public String request(String itemId) { TraceStatus status = null; try { status = logTrace.begin("OrderController.request()"); // target 호출 String result = target.request(itemId); logTrace.end(status); return result; } catch (Exception e) { logTrace.exception(status, e); throw e; } } @Override public String noLog() { return target.noLog(); } } OrderControllerV1Impl@Slf4j public class OrderControllerV1Impl implements OrderControllerV1 { private final OrderServiceV1 orderService; public OrderControllerV1Impl(OrderServiceV1 orderService) { this.orderService = orderService; } @Override public String request(String itemId) { orderService.orderItem(itemId); return "OK"; } @Override public String noLog() { return "OK"; } } OrderControllerV1 (인터페이스)@RequestMapping("/v1") // 스프링은 @Controller 또는 @RequestMapping 이 있어야 스프링 컨트롤러로 인식한다. (수동 등록 사용으로 @Controller 사용 안함) @ResponseBody public interface OrderControllerV1 { @GetMapping("/request") String request(@RequestParam("itemId") String itemId); @GetMapping("/no-log") String noLog(); }
- 해결됨스프링 핵심 원리 - 고급편
이중화된 서버에서 동시성 제어할 수 있는 방법 질문 드립니다!
안녕하세요 강사님 이번에 새로운 출발한다는 소식을 들었는데 진심으로 응원드립니다!오늘 ThreadLocal 강의를 듣던 중 궁금한 점이 생겨 질문드립니다.이중화된 서버의 경우 동시성 제어를 DB LOCK을 활용해야 하나요? 실무에서는 주로 어떤 방법으로 제어하나요?영화 예매 기능을 구현할 때 영화 정보 테이블(해당 시간에 상영하는 영화의 자리수를 가지고 있음)예매 내역 테이블(예매한 사람의 인적사항을 가지고 있음)해당 회차의 예매 가능한 총 자리수 - 해당 회차를 신청한 자리수에 신청하려는 인원수를 빼서 0보다 같거나 크면 신청할 수 있도록 아니면 예외를 throws하는 설계입니다..위 설계대로 서비스 레이어에서 아래와 같이 구현하면 신청자 수를 count하는 SQL에 SELECT LOCK을 걸어주는게 맞을까요?@Transactionalpublic void 예매신청(PersonDTO params) { int result = dao.총자리수() - dao.예매한수(); if (result - params.get신청하려는예매인원수() >= 0) { 신청 로직~~~ } else { throw new IllegalStateException("자리 없음!");}늘 좋은 강의 해주셔서 감사합니다 덕분에 많이 늘고 있습니다!
- 미해결스프링 핵심 원리 - 고급편
공통 코드를 추상 클래스로 올리라는 것의 해석
첫 번째 질문은 '섹션 4'에 '데코레이터 패턴 - 예제 코드3' 편에서 김영한님이 private Component component; TimeDecorator(Component component) { this.component = component; }를 드래그하며 MessageDecorator에서와의 중복 코드이기 때문에 추상 클래스를 만들어서 올릴 수 있다고 하셨는데 추상 클래스를 아래와 같이 만들어주고@Getter @Setter public abstract class AbstractDecorator implements Component { private Component component; AbstractDecorator(Component component) { this.component = component; } } MessageDecorator를 이렇게 수정해주면 되는걸까요?@Slf4j public class MessageDecorator extends AbstractDecorator{ public MessageDecorator(Component component) { super(component); } @Override public String operation() { log.info("MessageDecorator 실행"); String result = super.getComponent().operation(); String decoResult = "**" + result + "**"; log.info("MessageDecorator 꾸미기 적용 전={}, 적용 후={}",result, decoResult); return decoResult; } } 두 번째 질문은 추상클래스를 사용한다면 인터페이스의 장점을 활용하지 못할 것 같은데 이걸 의도하신 게 맞는지 궁금합니다. 감사합니다. 강의 잘 듣고 있습니다.
- 해결됨스프링 핵심 원리 - 고급편
LogTrace Prototype Bean으로 설정 시
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요! LocalThread 수강 중 궁금증이 생겨 질문드립니다.다음과 같이 LogTrace를 Prototype Bean으로 등록 후 컨트롤러에서 주입받아 사용하는 상황은 Thread safe 하다고 말할 수 있는지 궁금합니다package hello.advanced.app.v3; import hello.advanced.trace.TraceStatus; import hello.advanced.trace.hellotrace.HelloTraceV2; import hello.advanced.trace.logtrace.LogTrace; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.ApplicationContext; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor public class OrderControllerV3 { private final OrderServiceV3 orderService; private final ObjectProvider<LogTrace> provider; @GetMapping("/v3/request") public String request(String itemId) { TraceStatus status = null; LogTrace trace = provider.getObject(); try { status = trace.begin("OrderController.request()"); orderService.orderItem(trace, itemId); trace.end(status); return "ok"; } catch (Exception e) { trace.exception(status, e); throw e; } } } 만약 그렇다면, ThreadLocal을 통해 할당하고 접근하는 것과 어떤 차이가 있는지 궁금합니다.프로토타입 빈에 대한 이해가 부족한 것 같아 터무니없는 질문일 수 있지만, 잘 이해가 가지않아 질문드립니다
- 해결됨스프링 핵심 원리 - 고급편
3:26 HelloTraceV1이 import 되지 않습니다
안녕하세요, 아래처럼 HelloTraceV1이 import 되지 않아 문의드립니다.