인프런 커뮤니티 질문&답변

kimsejin0206님의 프로필 이미지
kimsejin0206

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

유연한 컨트롤러1 - v5

frontControllerServletV5 클래스의 service 함수 호출 횟수와 시점, handler 가 null인 문제

작성

·

337

·

수정됨

0

스크린샷 2023-12-29 오후 9.21.41.png스크린샷 2023-12-29 오후 9.21.47.png스크린샷 2023-12-29 오후 9.22.12.png학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

안녕하세요! 항상 양질의 강의를 위해 힘써주셔서 감사드립니다! 유연한 컨트롤러 v5를 공부하던 중 궁금한 점이 생겨서 질문 올렸습니다. 아래 제 코드에서는 현제 viewResolver 함수에서 경로가 "/WEB-INF/...." 가 아닌 "WEB-INF/..." 으로 되어 있어서 해당 코드를 수정하지 않으면 404 에러가 발생하는 상황입니다. 처음에는 어느 곳이 틀렸는지 찾을 수가 없어서 틀린 곳을 찾기 위해 디버깅 하던 중, handler가 null인지 검사하는 부분에서 handler가 null인 것을 확인했습니다. 저는 viewResolver가 호출 되기 이전에는 정상적으로 handler를 찾는 작업이 수행되어 handler가 null일 수가 없다고 생각했는데 실제로 확인해보니 제 예상과 달라 잘 이해가 되지 않았습니다. 또한, mapping된 url을 한번만 요청했는데도 service 함수 내의 첫번째 줄에서 println 함수를 호출했을 때 해당 문장이 2번 출력되는 것을 확인했는데 왜 이런 결과가 나왔는지도 궁금합니다.

package hello.servlet.web.frontcontroller.v5;

import hello.servlet.web.frontcontroller.ModelView;

import hello.servlet.web.frontcontroller.MyView;

import hello.servlet.web.frontcontroller.v3.controller.MemberFormControllerV3;

import hello.servlet.web.frontcontroller.v3.controller.MemberListControllerV3;

import hello.servlet.web.frontcontroller.v3.controller.MemberSaveControllerV3;

import hello.servlet.web.frontcontroller.v4.controller.MemberFormControllerV4;

import hello.servlet.web.frontcontroller.v4.controller.MemberListControllerV4;

import hello.servlet.web.frontcontroller.v4.controller.MemberSaveControllerV4;

import hello.servlet.web.frontcontroller.v5.adapter.ControllerV3HandlerAdapter;

import hello.servlet.web.frontcontroller.v5.adapter.ControllerV4HandlerAdapter;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

@WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*")

public class FrontControllerServletV5 extends HttpServlet {

// private Map<String, ControllerV4> controllerV4Map = new HashMap<>();

private final Map<String, Object> handlerMappingMap = new HashMap<>();

private final List<MyHandlerAdapter> handlerAdapter = new ArrayList<>();

public FrontControllerServletV5() {

initHandlerMappingMap();

initHandlerAdapters();

}

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());

//v4 추가

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());

}

private void initHandlerAdapters() {

handlerAdapter.add(new ControllerV3HandlerAdapter());

handlerAdapter.add(new ControllerV4HandlerAdapter());

}

@Override

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("here");

Object handler = getHandler(request);

if (handler == null) {

System.out.println("is null");

response.setStatus(HttpServletResponse.SC_NOT_FOUND);

return;

}

MyHandlerAdapter adapter = getHandlerAdapter(handler);

ModelView mv = adapter.handle(request, response, handler);

String viewName = mv.getViewName(); //논리이름 new-form

MyView view = viewResolver(viewName);

view.render(mv.getModel(), request, response);

}

private Object getHandler(HttpServletRequest request) {

String requestURI = request.getRequestURI();

return handlerMappingMap.get(requestURI);

}

private MyHandlerAdapter getHandlerAdapter(Object handler) {

//handlerAdapter.iter -> for문 생성

for (MyHandlerAdapter adapter : handlerAdapter) {

if (adapter.supports(handler)) {

return adapter;

}

}

throw new IllegalArgumentException("handler adapter를 찾을 수 없습니다. handler=" + handler);

}

private static MyView viewResolver(String viewName) {

MyView view = new MyView("WEB-INF/views/" + viewName + ".jsp");

return view;

}

}

답변 2

0

안녕하세요. kimsejin0206님, 공식 서포터즈 David입니다.

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용과 관련하여 강사님께서 다른 수강생의 유사한 질문에 답변해 주신 내용이 있는 것 같습니다. 해당 내용을 참고하시면 도움이 될 것 같습니다.

  • 질문 제목: “FrontControllerServletV5 - handle 에러 표시”
  • 강의명: “스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술”
  • 해당 수강생 질문 요약: 에러가 발생하여 문제를 해결하려고 하였는데, 다른 파일에서 “ServletException”이 “SerialException”으로 잘못 입력되어 있었음을 발견하고 해결했다고 답변함.

FrontControllerServletV5 - handle 에러 표시

강의 내용과 관련된 자세한 답변을 위해 제공된 링크를 방문해 보시기 바랍니다.

kimsejin0206님의 프로필 이미지
kimsejin0206

작성한 질문수

질문하기