inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

유연한 컨트롤러1 - v5

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

398

kimsejin0206

작성한 질문수 4

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;

}

}

spring mvc

답변 2

0

David

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

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

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

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

https://bit.ly/3fX6ygx


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


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

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

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


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

0

인프런 AI 인턴

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

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

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

FrontControllerServletV5 - handle 에러 표시

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

servlet과 container에 대한 질문입니다

0

25

1

api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?

0

64

1

jsp 의존성 수정 요청

0

78

2

요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?

0

143

1

save() 메서드 문의

0

67

1

절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상

0

101

1

request-body-json

0

83

2

MVC 패턴의 적용 단위

0

97

1

RequestMapping을 이용한 핸들러, 어댑터

0

119

2

save 후 결과화면

0

89

2

jsp를 이용한 view

0

97

1

application.properties에 debug 추가해도 결과가 똑같습니다.

0

178

1

수업 코드 제공 관련 문의

0

97

2

RequestMappingHandlerAdapter의 Controller 호출 과정

0

100

3

파일 오픈 시

0

70

1

스프링 배치 관련

0

78

1

@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부

0

112

1

postman으로 /request-body-json-v1 호출시 500 error

0

95

1

프론트엔드와 백엔드의 mvc, rest api에 대한 질문

0

79

1

모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문

0

111

1

console log 출력 관련 질문입니다.

0

75

1

애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ

0

139

1

html 변경하는 부분 적용 문제

0

103

1

한글 깨짐

0

76

2