월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
th:action 질문드립니다
상품 등록 버튼을 눌렀을 때, items/add로 이동하는 걸th:action 대신th:onclick="|location.href='@{/basic/addForm.html}'|"로 적어도 되나요? 단순히 url 이동이 아니라, 상품 등록 버튼을 눌렀을 때, 상품을 실제로 저장하는 액션이 있기 때문에 th:action을 사용해야 하는 것인가요? 상품 등록 버튼을 눌렀을 때의 결과를 작업하는 것인데,<button class="w-100 btn btn-primary btn-lg" type="submit">상품 등록 </button>여기가 아닌, <h4 class="mb-3">상품 입력</h4> <form action="item.html" th:action method="post">여기서 처리하는지 궁금합니다.
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요, 컨트롤러의 구현 방법에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 강의를 들으면서 영한님께서 작성해주신 코드 뿐만 아니라, 그동안 공부했던 방법을 활용하여 다르게 표현할 방법이 없을지를 항상 고민하며 강의를 수강하고 있습니다.(강의를 열심히 수강중인 것으로 생각해주시면 감사하겠습니다 ㅎㅎ..)물론 설명을 너무 잘해주셔서, 강의의 내용과 흐름은 이해할 수 있었는데요, 이 과정에서 몇몇 궁금한 것이 생겨 질문드리게 되었습니다.메서드 파라미터 사용 이 코드는, v4에서의 프론트 컨트롤러 코드인데요, 저는 "메서드 파라미터는 변경하지 않는 것이 좋다"라고 알고 있는데, 그래서 controller.process(paramMap,model) 에서 model이 변경(정확히는 참조는 바뀌지 않지만 컬렉션 내부 내용의 변화)되는 부분이 조금 어색하게 느껴지는 것 같습니다. 그래서 드리는 질문은, 저는 v3에서의 프론트 컨트롤러 코드 흐름이 더 쉽게 와닿는 느낌인데요, 영한님께서는 각각의 컨트롤러에서 ModelView를 생성하지 않는 장점이 더 크다고 판단하신 건지 궁금합니다.2. 인터페이스의 디폴트 메서드 사용 이 코드는, v5의 Adaptor의 구현 클래스에 공통적으로 정의되는 createParamMap() 메서드인데요! 인터페이스의 디폴트 메서드를 활용하면 V3, V4에서의 코드 중복을 해결할 수 있을 것 같다는 생각이 들었습니다.그래서 궁금한 점은, 나중에 createParamMap()을 사용하지 않는 어댑터를 추가할 수 있으니 중복을 감안하고 V3, V4에 각각 정의하는 것이 좋은 방법인지, 혹은 V3, V4에는 코드가 중복되니 코드 중복 제거 차원에서 디폴트 메서드로 정의하는 것이 좋은지에 대한 의견이 궁금합니다. 읽어주셔서 감사합니다. 즐거운 하루 보내세요!
- 해결됨스프링 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은 스프링 빈으로 등록된다. 저는 이렇게 이해했는데 틀린 내용이 있는지 궁금합니다.
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의자료대로 프로젝트 생성하였고, 설정에서 build and run using을 gradle로 그대로 두었는데 다음과 같은 에러가 발생합니다.
강의자료대로 프로젝트 생성하였고, 설정에서 build and run using을 gradle로 그대로 두었는데 다음과 같은 에러가 발생합니다.build and run using를 인텔리제이로 변경하고 실행할 시에는이게 뜨고 바로 종료됩니다. 다른 모든 프로젝트에서도 이와 같은 에러가 발생하는데, 해결방법 알려주시면 감사하겠습니다.
- 해결됨스프링 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); }
- 해결됨스프링 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편 - 백엔드 웹 개발 핵심 기술
jsp파일 관련 에러 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.모든 jsp 파일 첫 줄에 아래와 같은 에러가 나는데 구글링을 해보니 자신이 사용할 톰캣을 facets에 추가해주면 된다고 하더라구요! 그런데 제가 수업때 배운내용은 스프링 컨테이너 안에 이미 톰캣이 내장되어있는데 제가 따로 다운 받아두었던 톰캣을 사용해도 되나? 가 궁금합니다! Description Resource Path Location TypeThe default superclass, "javax.servlet.http.HttpServlet", according to the project's Dynamic Web Module facet version (2.4), was not found on the Java Build Path. new-form.jsp /servlet/src/main/webapp/jsp/members line 1 JSP Problem
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
v3 프로그램 작동원리 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]질문이 총 2가지 인데요.http://localhost:8080/front-controller/v3/members/new-form 이 url을 호출하게 되었을 때 FrontControllerServletV3 클래스가 생성되는 것 까지는 이해 할 수 있는 데 그 이후에 service 매서드가 자동적으로 실행이 되는 건가요?마지막 html 응답을 하는 부분에서 RequestDispatcher dispatcher = request-getRequestDispatcher (viewPath); dispatcher. forward (request, response);이렇게 하는 데 viewPath 경로의 jsp 파일에 request랑 response를 주면 어떤 과정을 통해 화면에 html이 보이게 되는 것인 지 잘 모르겠습니다. 제가 이해한 바로는 forward가 내부적으로 서버에 정보를 전달한다고 이해를 했는데 그렇게 되면 서버에서 클라이언트로 응답은 누가 하는 것인지 이해가 잘 안돼서요.
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP 메시지 컨버터 동작 순서를 변경 하는 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. http메시지 컨버터 동작 순서가ByteArrayHttpMessageConverterStringHttpMessageConverterMappingJackson2HttpMessageConverter라고 말씀해주셨는데 제가 해당 부분을 수정해서MappingJackson2HttpMessageConverter가 1번으로 동작하게 변경을 했다고 가정을하면Json데이터를 처리할 때 속도는 미세하게라도 더 빠르다고 생각을 하고 있습니다.아니면 모종의 이유로 속도가 저하 되는지 궁금해서 질문드립니다. ㅎㅎㅎ
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HandlerMethodArgumentResolver의 resolveArgument()의 호출 위치
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]RequestMappingHandlerAdapter에서 컨트롤러의 파라메터에서 필요로 하는 객체를 반환받아서 ArgumentResolver의 supportsParameter()를 통하여 반환받은 객체가 있는지 검증 후 있으면 ArgumentResolver의 resolveArgument()를 통하여 컨트롤러를 호출해준다고 이해했습니다. 그런데 핸들러 어댑터 로직을 살펴보니 supportsParameter()를 통해 검증해주는 로직은 있지만 resolveArgument()를 호출해주는 로직이 존재하지 않는데 어디서 resolveArgument()를 통하여 컨트롤러를 호출할 수 있는 건지 resolveArgument()의 호출 위치가 궁금합니다 !
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Unsupported java 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강의를 잘 수강하고있는 한 수강생입니다 지금까지 오류가 발생하지 않다가 html 파일을 수정하고나서부터 다음과 같은 오류가 발생합니다 jvm과 sdk버전을 20으로 바꾸면 또 다음과 같이 오류가 발생하는데 해결방법이 있을까요?
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Servlet 클래스, super
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Servlet 클래스를 구현한 RequestHeaderServlet 에서 super.service(request, response); 생략하지 않으면 whitelabel error 가 나는 이유는 뭔가요?
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
jsp 회원 전체 목록 조회 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]진짜 오타랑 폴더 문제 있는 거를 다 해결했는데도jsp 회원 전체 목록 조회가 500오류가 뜹니다.제 코드 파일 아래에 올려두었습니다.https://drive.google.com/file/d/1nlCQnZW4erNmTiNvcnR9NXAnjxdJmIor/view?usp=drive_link 선생님 코드 파일 실행했을 때는 잘 진행되는 것을 확인하였습니다. 무엇이 문젠지 3시간 동안 고민했는데 모르겠습니다.
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
localhost8080 에서 json 경로만 500 서버 오류가 납니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]영한님 수업 잘 따라오면서 나머지 강의들은 잘 프로그램이 작동했는데 HTTP요청 데이터 -API 메시지 바디 -JSON강의 실습이후 json요청 페이지에서만 오류가 뜨고 localhost8080에서는 백지 화면이 뜹니다 제가 무지해 혹시 오류가 따로 있을거같아 컴파일보드 메모장으로 첨부해봅니다.. 오후 11:15:43: Executing ':ServletApplication.main()'... > Task :compileJava UP-TO-DATE > Task :processResources UP-TO-DATE > Task :classes UP-TO-DATE > Task :ServletApplication.main() . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.2) 2024-01-22T23:15:44.017+09:00 INFO 4424 --- [ main] hello.servlet.ServletApplication : Starting ServletApplication using Java 21.0.1 with PID 4424 (C:\Users\�赿��\Desktop\Spring-mvc\servlet\build\classes\java\main started by �赿�� in C:\Users\�赿��\Desktop\Spring-mvc\servlet) 2024-01-22T23:15:44.018+09:00 INFO 4424 --- [ main] hello.servlet.ServletApplication : No active profile set, falling back to 1 default profile: "default" 2024-01-22T23:15:44.667+09:00 INFO 4424 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2024-01-22T23:15:44.676+09:00 INFO 4424 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2024-01-22T23:15:44.677+09:00 INFO 4424 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.18] 2024-01-22T23:15:44.711+09:00 INFO 4424 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2024-01-22T23:15:44.712+09:00 INFO 4424 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 652 ms 2024-01-22T23:15:44.787+09:00 INFO 4424 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: ServletContext resource [/index.html] 2024-01-22T23:15:44.968+09:00 INFO 4424 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '' 2024-01-22T23:15:44.973+09:00 INFO 4424 --- [ main] hello.servlet.ServletApplication : Started ServletApplication in 1.2 seconds (process running for 1.426) 2024-01-22T23:15:49.563+09:00 DEBUG 4424 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [0] 2024-01-22T23:15:49.564+09:00 DEBUG 4424 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Received [GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 ] [��ü �Ķ���� ��ȸ] - start [��ü �Ķ���� ��ȸ] - end 2024-01-22T23:15:49.582+09:00 DEBUG 4424 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [704] 2024-01-22T23:15:49.582+09:00 DEBUG 4424 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Received [] 2024-01-22T23:15:49.583+09:00 DEBUG 4424 --- [nio-8080-exec-1] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@41b5971e:org.apache.tomcat.util.net.NioChannel@8c53d83:java.nio.channels.SocketChannel[connected local=/[0:0:0:0:0:0:0:1]:8080 remote=/[0:0:0:0:0:0:0:1]:51861]], Status in: [OPEN_READ], State out: [OPEN] 2024-01-22T23:15:49.598+09:00 DEBUG 4424 --- [nio-8080-exec-3] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [704] 2024-01-22T23:15:49.599+09:00 DEBUG 4424 --- [nio-8080-exec-3] o.a.coyote.http11.Http11InputBuffer : Received [GET /favicon.ico HTTP/1.1 Host: localhost:8080 Connection: keep-alive sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120" sec-ch-ua-mobile: ?0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 sec-ch-ua-platform: "Windows" Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: no-cors Sec-Fetch-Dest: image Referer: http://localhost:8080/ Accept-Encoding: gzip, deflate, br Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 ] [��ü �Ķ���� ��ȸ] - start [��ü �Ķ���� ��ȸ] - end 2024-01-22T23:15:49.601+09:00 DEBUG 4424 --- [nio-8080-exec-3] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [604] 2024-01-22T23:15:49.601+09:00 DEBUG 4424 --- [nio-8080-exec-3] o.a.coyote.http11.Http11InputBuffer : Received [] 2024-01-22T23:15:49.601+09:00 DEBUG 4424 --- [nio-8080-exec-3] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@41b5971e:org.apache.tomcat.util.net.NioChannel@8c53d83:java.nio.channels.SocketChannel[connected local=/[0:0:0:0:0:0:0:1]:8080 remote=/[0:0:0:0:0:0:0:1]:51861]], Status in: [OPEN_READ], State out: [OPEN]
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
직접 만든 프레임워크 -> 스프링 MVC 비교 pdf 부분 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]5. 스프링 MVC - 구조 이해.pdf의 2페이지에 나온 내용인데handlerMappingMap -> HandlerMapping이 부분은 이 두 개가 정확히 대응되지는 않는 거죠? 프론트 컨트롤러 V5에 있는 코드입니다.private final Map<String, Object> handlerMappingMap = new HashMap<>(); private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>();프론트 컨트롤러 V5의 handlerMappingMap와 handlerAdapters는DispatcherServlet 코드를 보니 왠지 handlerMappings와 handlerAdapters가 대응되는 것 같고,DispatcherServlet의 HandlerMapping 인터페이스와 대응되는 건 프론트 컨트롤러 V5에는 없는 상태라고 이해하면 될까요? 간단한 질문이지만 pdf를 제가 잘못 이해했을까 봐 질문드립니다.
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
process()의 매개변수
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]비슷해 보이는 질문들을 보긴 했는데 아직 잘 이해가 안 돼서 질문드립니다. SpringMemberListControllerV1에선 리턴 타입은 ModelAndView이고, 매개변수는 아예 없는데SpringMemberSaveControllerV1에선 리턴 타입은 ModelAndView로 똑같지만 매개변수 request와 response가 있어서 SpringMemberListControllerV1와 다릅니다. 스프링 MVC - 실용적인 방식 강의를 들어 보니 인터페이스로 고정되어 있지 않고 유연하게 설계되어 있기 때문이라는 것은 알겠습니다. 그러면 메서드의 오버로딩처럼 많은 매개변수 케이스들을 일일이 등록해져 있는 것이 아니라,매개변수로 들어올 수 있는 값들이 정해져 있고, 그것들을 개발자가 자유롭게 조합해서 매개변수로 지정하면 스프링이 알아서 판단할 수 있는 건가요? +) 하나 더 궁금한 건, 리턴 타입도 ModelAndView나 String이 아닌 다른 거로 자유롭게 바꿀 수 있을까요? 아니면 이건 정해져 있나요?
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
라이브러리 추가하는 법은 어디서 알 수 있나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. gradle 추가 하실 때 4줄이나 추가 하시더라구요.//JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'jakarta.servlet:jakarta.servlet-api' implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //JSP 추가 끝 이렇게 추가해야 한다는 건 어디서 알 수 있나요? jakarta홈페이지를 봐도 영 알 수 가 없어서...MVNRepository에서 찾아도 한 줄 만 추가하는 거 밖에는 안 보이더라구요.
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
[HTTP 요청 데이터 - API 메시지 바디 - JSON] 강의 진행 중, logging.level.org.apache.coyote.http11=debug 를 입력하면 EOFException 발생 합니다
안녕하세요. 현재 섹션 2 - HTTP 요청 데이터 - API 메시지 바디 - JSON 강의를 듣고있습니다. postman을 실행하여{"username":"hello","age":20} 를 보낼 때,properties의 logging.level.org.apache.coyote.http11=debug의 여부에 따라 EOFException이 뜨거나 안뜨는 현상이 발생합니다! 그 이유와 해결방법이 궁금해서 질문 드립니다 !!! properties 에 logging.level.org.apache.coyote.http11=debug 를 입력하지 않았을 경우에는 아래처럼 정상 실행됩니다. 하지만 logging.level.org.apache.coyote.http11=debug 를 입력한 상태로, postman을 실행하면 오류가 뜹니다. 이유가 뭘까요 ?? ㅠㅠ 해결방법도 궁금합니다!
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
URL 링크 표현식 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]CSS의 경우 th:href="@{/css/bootstrap.min.css}"이고다른 경우에는 th:href="@{/basic/items/add}"처럼 되어있습니다. 궁금한 점은 css는 static상위 폴더에 basic은 templates 상위 폴더에 위치하는데 이를 구분하는 것이 url에 명시가 되어있지 않은데 어떻게 구분이 되는 걸까요??
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
컨트롤러에서 뷰템플릿을 반환해서 응답하는 경우에 메소드의 반환값이 void일떄
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.응답 -정적리소스,뷰템플릿 강의에서 궁금한것있습니다.컨트롤러에서 뷰 템플릿을 응답으로 반환하는경우를 학습중인데요.강의에 설명에서는 Void를 반환하는경우에 @Controller를 사용하고 HttpServletResponse,OutputStream(Writer) 같은 HTTP 메시지 바디를 처리하는 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용한다. 라고 되어 있는데요. 그러면 메서드 매개변수에 위 2개의 파라미터(HttpServletResponse,OutputStream(Writer))가 들어가있을경우에는 정상적으로 반환되어야 하지 않는것이 맞는것인가요? 두개의 파라매터를 메서드 매개변수에 적용하여 실행해봐도 정상적으로 동작하기에 질문드립니다. 아래는 해당 코드 입니다.//너무 불명확해서 추천하지 않는방식 //컨트롤러를 사용하고 httpServlerResponse 나 ,outputStream 같은 HTTP 메시지 바디를 처리하는 //파라메터가 없으면 요청 URL을 참고해서 논리뷰의 이름으로 사용 @RequestMapping("/response/hello") //반환할 정적 리소스의 경로랑 맵핑이 같을경우 return 값이 없어도 된다. public void responseViewV3(Model model, HttpServletResponse response) throws IOException { response.getWriter().write("ok"); model.addAttribute("data","hello!"); }