묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
회원 도메인 실행과 테스트 8:30 쯤 DIP 위반
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 회원 도메인 실행과 테스트 8:30 쯤 DIP 위반 언급하실 때MemberRepository는 인터페이스를 의존한다고 하시면서 MemberServiceImpl를 가리키셨는데 이해가 안가서요 ㅠㅠDIP가 어떻게 위반됐는지 다시 한 번 설명 부탁드립니다!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
Test code 관련하여 궁금한 것이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 강의 열심히 듣고 있습니다. 밑에 다른 분이 비슷한 질문을 해주셨는데, 해소되지 않는 부분이 있어 질문을 남깁니다.Test 코드 작성시에 위에 @SpringBootTest annotation이 있는데, 해당 annotation이 붙으면 컨테이너가 자동으로 실행되어 spring boot 환경에서 test를 진행이 가능한 것으로 알고 있습니다. 결국 주입을 자동으로 받는 다는 것은 memberRepository가 빈으로 등록되어있다는 뜻인 것 같은데, memberRepository는 test가 아닌 실제 main쪽 패키지에 존재하는데 어떻게 등록이 가능한건가요? main쪽에 있는 ItemServiceApplication이 실행되는 것인가요?이전에도 비슷하게 실행한 적이 있는 것 같은데.. 그때는 인지하지 못하다가 문득 궁금해져서 질문을 남깁니다.감사합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
DispatcherServlet에서 핸들러와 핸들러 매핑의 동작 방식
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이전에 MVC 프레임워크 v5를 직접 만들었을 땐, 스프링이 실행됨과 동시에 다음 코드처럼 프론트 컨트롤러의 handlerMappingMap에 핸들러들이 자동으로 등록되었었습니다. 즉, 클라이언트로부터 요청이 오기도 전에 '핸들러 매핑 맵'에 저장되는 거로 이해했습니다. private void initHandlerMappingMap() { handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3()); handlerMappingMap.put("/front-controller/v5/v4/members/new-form", new MemberFormControllerV4()); handlerMappingMap.put("/front-controller/v5/v4/members/save", new MemberSaveControllerV4()); handlerMappingMap.put("/front-controller/v5/v4/members", new MemberListControllerV4()); } 그러면 실제 DispatcherServlet에서도 위와 비슷한지, 다른지, 정확히 어떻게 동작하는지 궁금합니다. 스프링 부트가 실행되자마자 '핸들러 매핑'들은 스프링 빈으로 등록된다고 이해했습니다. 다만 '핸들러'가 어떤지는 헷갈립니다. 스프링 부트가 실행됨과 동시에 '핸들러(컨트롤러)'들이 각각에 해당되는 '핸들러 매핑' 내부에 저장되는 건지, 아니면'핸들러'들이 '핸들러 매핑'에 처음부터 저장되는 게 아니라, 클라이언트로부터 요청이 오면 그때 '핸들러 매핑'이 스프링 컨테이너에서 핸들러를 '찾아 주는' 건지.아니면'핸들러 매핑' 인터페이스마다 방식이 다른 건지 궁금합니다. +) 한 가지 더 궁금한 점이 있습니다.애노테이션 기반의 컨트롤러들은 반드시 스프링 빈으로 등록되어야 한다고 이해했습니다.그런데 Controller 인터페이스를 구현한 컨트롤러나 HttpRequestHandler 컨트롤러들은 강의에선 BeanNameUrlHandlerMapping을 이용하기 위해 스프링 빈으로 등록되기는 했지만, BeanNameUrlHandlerMapping를 이용하지 않는다면 꼭 스프링 빈으로 등록할 필요는 없는 건가요? 컨트롤러들이 모두 스프링 빈일 필요는 없는 건지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
override 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]override오류로 test 작동이 안됩니다ㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Modelattribute가 react랑 연계해도 작동하는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 수업 너무 잘 듣고 있습니다.다름이아니고 앞의 검증과 관련된 질문입니다. @modelattribute가 form 에서 잘못 입력했을 경우에 사용자로인해 입력된 그 값을 그대로 유지할수 있도록 사용되게 하고싶을때, react와 연계하여 서버를 띄운다고 했을때 json body로 넘겨주지 않고 이 modelattribute를 사용해도 되나요? 강의에서는 클라이언트도 저희가 만들어서 괜찮지만 프론트측을 리액트로 만든다고 했을때 궁금해서 여쭤봤습니다
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@JsonIgnore 관련 ClassNotFoundException 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.@JsonIgnore을 어느 클래스에 어디어디 붙여야 할까요?"http://localhost:8080/api/v1/simple-orders"api 테스트를 해보니 아래와 같은 에러가 나서 질문드립니다 2024-01-25T22:37:28.102+09:00 DEBUG 32028 --- [nio-8080-exec-1] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id fetch first ? rows only2024-01-25T22:37:28.226+09:00 ERROR 32028 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoClassDefFoundError: javax/persistence/Transient] with root causejava.lang.ClassNotFoundException: javax.persistence.Transient at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na]2024-01-25T22:37:28.277+09:00 ERROR 32028 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoClassDefFoundError: javax/persistence/Transient
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 매핑과 핸들러 어댑터들도 모두 스프링 빈으로 등록되나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스프링 부트를 사용하면 자동으로 핸들러 매핑과 핸들러 어댑터, 뷰 리졸버 등 여러 가지를 등록해 준다고 하셨는데 저는 처음에 '등록'이라는 의미를 DispatcherServlet에 있는private List<HandlerMapping> handlerMappings;private List<HandlerAdapter> handlerAdapters;private List<ViewResolver> viewResolvers; 이 List에 저장한다는 의미로만 생각했었습니다.그런데 강의가 진행되면서 설명해 주신 내용 중, 다음 코드처럼 스프링 부트에서 InternalResourceViewResolver를 스프링 빈으로 등록해 주듯이 @Bean ViewResolver internalResourceViewResolver() { return new InternalResourceViewResolver("/WEB-INF/views/", ".jsp"); } } 핸들러 매핑과 핸들러 어댑터들도 스프링 빈으로도 등록되는 건가요? 즉,핸들러 매핑, 핸들러 어댑터, 뷰 리졸버들은 스프링 빈으로 등록되고뷰는 기본적으로 스프링 빈으로 등록되지 않지만(https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1&unitId=71204&tab=community&q=782881&category=questionDetail) 원한다면 따로 스프링 빈으로 등록할 수도 있다.(BeanNameViewResolver를 사용할 때) 이렇게 생각해도 되는지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
맥 사용시 2002 오류 나오실 경우
mysql.server start명령어 사용해보세요 아직원리는 모르겠는데 명령어 사용 후 mysql -u root입력하시면 sql작동 됩니다
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요, 컨트롤러의 구현 방법에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 강의를 들으면서 영한님께서 작성해주신 코드 뿐만 아니라, 그동안 공부했던 방법을 활용하여 다르게 표현할 방법이 없을지를 항상 고민하며 강의를 수강하고 있습니다.(강의를 열심히 수강중인 것으로 생각해주시면 감사하겠습니다 ㅎㅎ..)물론 설명을 너무 잘해주셔서, 강의의 내용과 흐름은 이해할 수 있었는데요, 이 과정에서 몇몇 궁금한 것이 생겨 질문드리게 되었습니다.메서드 파라미터 사용 이 코드는, v4에서의 프론트 컨트롤러 코드인데요, 저는 "메서드 파라미터는 변경하지 않는 것이 좋다"라고 알고 있는데, 그래서 controller.process(paramMap,model) 에서 model이 변경(정확히는 참조는 바뀌지 않지만 컬렉션 내부 내용의 변화)되는 부분이 조금 어색하게 느껴지는 것 같습니다. 그래서 드리는 질문은, 저는 v3에서의 프론트 컨트롤러 코드 흐름이 더 쉽게 와닿는 느낌인데요, 영한님께서는 각각의 컨트롤러에서 ModelView를 생성하지 않는 장점이 더 크다고 판단하신 건지 궁금합니다.2. 인터페이스의 디폴트 메서드 사용 이 코드는, v5의 Adaptor의 구현 클래스에 공통적으로 정의되는 createParamMap() 메서드인데요! 인터페이스의 디폴트 메서드를 활용하면 V3, V4에서의 코드 중복을 해결할 수 있을 것 같다는 생각이 들었습니다.그래서 궁금한 점은, 나중에 createParamMap()을 사용하지 않는 어댑터를 추가할 수 있으니 중복을 감안하고 V3, V4에 각각 정의하는 것이 좋은 방법인지, 혹은 V3, V4에는 코드가 중복되니 코드 중복 제거 차원에서 디폴트 메서드로 정의하는 것이 좋은지에 대한 의견이 궁금합니다. 읽어주셔서 감사합니다. 즐거운 하루 보내세요!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
준영속 상태의 객체인 이유, 영속 상태의 객체인 이유
안녕하세요. 강의 내용과 관련하여 질문이 있어 글 남깁니다.강의에서 10:00 정도에 변경 감지 방법에 대해 설명하시는 부분입니다.트랜잭션 상에서 엔티티를 다시 조회하여 내용을 변경하면 이 엔티티는 영속 상태이므로 변경 감지가 된다. 따라서 save() 를 하지않아도 알아서 변경 감지되어 DB에 update된다. 라고 이해했습니다.제가 궁금한 부분은,itemRepository.findOne(itemId); 부분에서 엔티티를 조회하는데, 이 엔티티는 원래 준영속 상태의 엔티티였고, findOne() 을 함으로써 다시 영속성 컨택스트에 들어온 건가요? 아니면 생성된 때부터 지금까지 죽 영속 상태였나요?강의의 맥락상, 지금 준영속 객체를 변경하는 방법에 대해 배우고 있으니 전자일 것이라고 생각했습니다. 만약 제가 생각한대로 준영속 상태에서 변경된 것이 맞다면, merge와 역할 자체는 같은게 맞나요? 물론 디테일한 로직이 좀 다르지만, 역할 자체만 보면 merge또한 준영속 객체를 기발으로 영속 객체를 만들어 반환해주는 거고, 변경 감지 기법도 findOne()을 통해 준영속 객체를 영속 객체로 다시 만들어주는 것이니까요.이 둘의 차이점은 객체가 통째로 갈아치워지느냐, 부분 수정이 가능하냐 이것 정도만 있다, 라고 이해해도 될까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문상품_재고수량초과 테스트 질문있습니다(fail())
[질문 내용]여기서 주문상품수량이 10개니 예외가 터지지않고 fail로 가는거로 알고있는데요 Expected jpabook.jpashop.exception.NotEnoughStockException to be thrown, but nothing was thrown 이러한 에러는 뜨는데 예외가 터지지않았기에 fail이 떠야하는데 fail안에 있는 메세지가 안뜹니다한가지 더 질문이 있씁니다주문상품수량을 11로 바꿧을떄 마지막에 fail을 적지않고 테스트를 돌렸을땐 예외를 터트려서 테스트가 성공적으로 끝나는데요 여기서 위와같이 fail메서드를 적어도 원래는 위에서 예외가 처리됏기떄문에 테스트가 정상적으로 끝나야 되는게 맞는거 아닌가요? 테스트를 돌렷는데 fail문이 뜹니다 그 뜻은 예외가 터지지않았다는 말이죠.. 의문이 듭니다 도와주세요ㅠㅠ
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿 관련하여 제가 이해한 내용 중에 틀린 부분이 있는지 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 서블릿을 따로 공부한 적이 없어서 구글링을 조금 해 봤지만 제대로 이해한 건지 확신이 안 갑니다. 제가 이해한 내용 중 오류가 있는지 궁금합니다. 아래 코드는 강의에서 사용했던 코드입니다.@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json") public class RequestBodyJsonServlet extends HttpServlet { . . . } RequestBodyJsonServlet이 서블릿인 이유는 HttpServlet를 상속했기 때문이며, @WebServlet 때문에 서블릿인 것은 아니다. 하지만 서블릿으로서 동작하려면 @WebServlet이 필요하다. @WebServlet은 이 서블릿에 URL을 매핑하기 위함이며, @ServletComponentScan이 서블릿을 서블릿 컨테이너에 등록할 때도 @WebServlet이 붙은 클래스들을 서블릿 컨테이너에 등록한다. RequestBodyJsonServlet이 HttpServlet를 상속하여 서블릿의 조건을 만족하고, @WebServlet을 클래스 레벨에 붙임으로써, @ServletComponentScan에 의해 서블릿 컨테이너에 등록될 수 있게 되었지만 스프링 빈으로 등록된 것은 아니다. DispatcherServlet은 스프링 빈으로 등록된다. 저는 이렇게 이해했는데 틀린 내용이 있는지 궁금합니다.
-
미해결스프링 핵심 원리 - 고급편
execution 강의 듣다가 execution와 관련된건 아니지만 궁금증이 생겨 문의남깁니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요execution 강의 듣다가 execution와 관련된건 아니지만 궁금증이 생겨 문의남깁니다.AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();강의에서는 pointcut을 위 코드와 같이 전역으로 선언하고 사용하고 있더라구요. pointcut을 전역으로 선언 후 테스트에서 사용하는데 beforeEach에서 초기화를 하지 않으면 다른 테스트에 영향이 갈 수 있지 않나? 생각이 들어서 , 한 번에 모든 테스트를 실행시켜 debug point를 찍으며 확인해봤는데요. 그런데 자동으로 테스트마다 pointcut이 초기화 되더라구요 이유가 있을까요??
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
FrontControllerServletV4 와 model
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]FrontControllerServletV4에서 아래 코드 부분에서 model 을 직접 생성해 view에 넘겨주는데 model 은 controller.process 를 통해 controller 에 paramMap과 model 을 넘겨 model 값을 설정합니다. 그 후 다시 프론트 컨트롤러에서 model 정보도 같이 view로 render 해주는데 이때 model 의 값이 채워져있는건가요?제가 생각하기로는 controller.process 를 통해 model 의 값이 채워지지만 viewName 만 반환해 결국 프론트 컨트롤러의 map 은 초기화 상태 그대로인것 같아서요:)이러면 model 을 View 에 넘기는 것이 의미가 없지 않나요?@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestURI = request.getRequestURI(); ControllerV4 controller = controllerMap.get(requestURI); if (controller == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } Map<String, String> paramMap = createParamMap(request); Map<String, Object> model = new HashMap<>(); String viewName = controller.process(paramMap, model); MyView view = viewResolver(viewName); view.render(model, request, response); }
-
미해결
이전 로그인 시간 팝업
안녕하세요 영한님 수업을 듣다가 관리자 페이지를 만들어보면서 듣고 있는데요제가 이것저것 찾아보면서 다른 기능들을 넣으면서 공부를 하고 있습니다.하지만 의문점이 하나가 생겼습니다. 로그인, 로그아웃까지 구현을 했으나,이전에 로그인한 시간 팝업에 띄우고 싶은데 Session으로 하면 정해진 시간까지 Session이 동작하여서 이것을 쓰면 안 될 것 같은데요 어떤 기능을 공부해서 사용해야 하나요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 프레임워크 동작 구조 정리
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 !![1] 요청 시에 @RequestBody와 HttpEntity를 안 쓰는 경우 , 응답 시에 @ResponseBody와 HttpEntity를 안 쓰는 경우[2] 요청 시에 @RequestBody와 HttpEntity를 쓰는 경우 , 응답 시에 @ResponseBody와 HttpEntity를 쓰는 경우이 두 가지 케이스로 나누어 스프링 프레임워크의 동작 구조를 정리해보았는데 제가 이해하는 게 맞는지 너무 길지만 한번만 피드백해주시면 감사하겠습니다 !![1]요청 : 파라메터 타입에 @RequestBody X 이거나 HttpEntity X의 경우응답 : 반환 값에 @ResponseBody X 이거나 HttpEntity X의 경우 1. 클라이언트의 요청 2. DispatcherServlet를 호출(urlPatterns = /* 경로이기 때문) 3. HandlerMapping의 가장 우선순위에 있는 구현체인 RequestMappingHandlerMapping을 통해 @Controller이 붙은 클래스의 객체를 매핑 정보로 활용 4. doDispatch()의 getHandler()에서 해당 매핑 정보의 컨트롤러 객체 반환 5. doDispatch()의 getHandlerAdapter()을 통해 HandlerAdapter을 호출 후 컨트롤러를 처리할 수 있는 어댑터 있는지 검증(supports()) 후 어댑터 호출(handle()) 6. 이때 컨트롤러는 @Controller의 @RequestMapping이 붙어있으므로 HandlerAdapter의 가장 우선순위의 RequestMappingHandlerAdapter 어댑터 구현체가 호출되는 것! 7. 어댑터는 컨트롤러의 파라메터에 해당되는 객체가 ArgumentResolver의 구현체로 존재하는지 검증(supportsParameter()) 후 존재하면 생성(resolveArgument()) 8. 어댑터는 생성된 객체를 컨트롤러의 파라메터에 주입하면서 컨트롤러 호출 9. 컨트롤러는 로직 수행 후 return 값(객체)을 어댑터에 반환 10. 어댑터는 ResultValueHandler 호출하면서 반환값에 해당되는 객체가 존재하는지 검증(supportsReturnType()) 후 존재하면 생성(handleReturnValue()) 11. 어댑터는 생성된 객체 및 논리적 뷰 이름으로 초기화된 ModelAndView 객체 생성 후 DispatchServlet에 반환 12. DispatchServlet에서 ViewResolver에 논리적 뷰 이름을 넘겨주면서 호출 13. ViewResolver에선 논리적 뷰 이름을 물리적 뷰 경로로 바꿔주고 그 값으로 초기화된 View 객체 반환 14. DispatchServlet에서 View객체 이용해서 render() 호출 15. JSP 뷰 템플릿이었으면 render()에서 JSP 코드로 포워드 후 랜더링하고 나머지 타임리프 같은 뷰 템플릿이면 render() 받자마자 바로 화면 랜더링 [2]요청 : 파라메터 타입에 @RequestBody O 이거나 HttpEntity O의 경우응답 : 반환 값에 @ResponseBody O 이거나 HttpEntity O의 경우 1. 클라이언트의 요청 2. DispatcherServlet를 호출(urlPatterns = /* 경로이기 때문) 3. HandlerMapping의 가장 우선순위에 있는 구현체인 RequestMappingHandlerMapping을 통해 @Controller이 붙은 클래스의 객체를 매핑 정보로 활용 4. doDispatch()의 getHandler()에서 해당 매핑 정보의 컨트롤러 객체 반환 5. doDispatch()의 getHandlerAdapter()을 통해 HandlerAdapter을 호출 후 컨트롤러를 처리할 수 있는 어댑터 있는지 검증(supports()) 후 어댑터 호출(handle()) 6. 이때 컨트롤러는 @Controller의 @RequestMapping이 붙어있으므로 HandlerAdapter의 가장 우선순위의 RequestMappingHandlerAdapter 어댑터 구현체가 호출되는 것! 7. 어댑터는 컨트롤러의 파라메터에 해당되는 타입의 객체가 ArgumentResolver의 구현체로 존재하는지 검증(supportsParameter()) 8. ArgumentResovler이 검증하던 중 컨트롤러의 파라메터 타입이 @RequestBody 혹은 HttpEntity임을 감지하고 RequestResponseBodyMethodProcessor 구현체가 동작하며 HTTP 메시지 컨버터 호출 9. RequestResponseBodyMethodProcessor 구현체는 HTTP 메시지 컨버터의 canRead()를 통하여 파라메터의 클래스 타입과 미디어 타입(Content-Type)을 검증하고 조건 만족하면 read()를 통해 HTTP 메세지 바디에 있는 데이터 변환 10. RequestResponseBodyMethodProcessor 구현체는 변환된 객체를 어댑터에 반환 11. 어댑터에선 반환된 객체를 컨트롤러의 파라메터에 주입하면서 컨트롤러 호출 12. 컨트롤러는 로직 수행 후 return 값(객체)을 어댑터에 반환 13. 어댑터는 ResultValueHandler 호출하면서 해당 반환값이 존재하는지 검증(supportsReturnType()) 14. 이때 ResultValueHandler에선 컨트롤러의 반환값이 @ResponseBody , HttpEntity임을 감지 후 RequestResponseBodyMethodProcessor 구현체가 동작하며 HTTP 메시지 컨버터를 호출 15. RequestResponseBodyMethodProcessor구현체는 HTTP 메시지 컨버터의 canWrite()를 통하여 파라메터 클래스 타입과 HTTP 요청 메시지에서의 미디어 타입(Accept)을 검증하고 조건 만족하면 write() 수행 16. write()에선 데이터를 변환하여 HTTP 응답 메세지 바디에 삽입 후 응답 메세지 클라이언트에게 반환감사합니다 !! 그리고 만약 제가 정리한 부분이 맞다면 HTTP API 방식으로 동작하는 경우 맨 마지막 16번에서 write() 이후에 만들어진 응답 메세지를 어디서 클라이언트에게 반환하는 건지 궁금합니다 !
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP 메시지 컨버터 동작 순서를 변경 하는 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. http메시지 컨버터 동작 순서가ByteArrayHttpMessageConverterStringHttpMessageConverterMappingJackson2HttpMessageConverter라고 말씀해주셨는데 제가 해당 부분을 수정해서MappingJackson2HttpMessageConverter가 1번으로 동작하게 변경을 했다고 가정을하면Json데이터를 처리할 때 속도는 미세하게라도 더 빠르다고 생각을 하고 있습니다.아니면 모종의 이유로 속도가 저하 되는지 궁금해서 질문드립니다. ㅎㅎㅎ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
5~6강 질문이요
post방식은 dto 객체 앞에 @RequestBody가 있는데 get방식은 왜 dto객체 앞에 @RequestParam을 안 써요? 맨 처음에 dto 객체 없었을 때 매개변수 이용하였을 때는 @RequestParam 썼던 것 같은데..
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
이미지 보여주기 @ResponseBody
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.downloadImage 메소드 작성할때 위에 @Responsebody사용한 이유가 이미지를 리턴하기 위해서 사용한게 맞나요 ?그리고 다른 방법은 어떤게 있나요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
~/jpashop.mv.db 파일을 못찾겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이 과정에서 jdbc:h2:~/jpashop까지 입력을 완료하고 데이터베이스가 잘 생성이 되었는데 ~/jpashop.mv.db이 어디에 생성된건지 모르겠습니다. ~/jpashop.mv.db