기존 JSP / Servlet MVC에서는 보통 FrontController 를 직접 만들어서 모든 요청을 받고 요청을 분석해 “일할 객체 (Action / Controller)”에게 넘기는 구조를 썼다.
Spring MVC에서는 이 FC 역할이 DispatcherServlet (DS) 로 표준화되어 있다.
“FC를 직접 구현하던 구조”를 “DS 중심 구조”로 갈아끼우는 흐름 자체가 핵심 전환점이다.
1) 문제 상황: /index 요청은 들어왔는데 “받아줄 Controller가 없었다”
사용자 요청:
http://localhost:8088/index
이 요청은 강의식 표현으로 치면 command (=요청 경로) 로 볼 수 있다.
- 요청 경로는 추출됐다: /index
- 그런데 /index를 처리할 Controller 매핑이 프로젝트에 없었다
결국 DS 입장에서는 이렇게 된다.
- “요청은 받았는데”
- “요청을 처리할 핸들러(Controller)가 없다”
그래서 오류 (대개 404 / Whitelabel Error Page)가 발생한다.
2) 해결 1: /index를 처리하는 Controller를 만들고 매핑을 걸어야 한다
예를 들어 테스트용이라면 다음 중 하나가 필요하다.
- @GetMapping("/index")
- 또는 @RequestMapping(value="/index", method=GET)
여기서 포인트는 이거다.
- @RequestMapping은 범용 매핑
- @GetMapping은 GET 전용 축약 표현 (가독성이 좋음)
전용 어노테이션이 생겨서 더 명확하게 쓰게 됐다.
3) 해결 2: 컨트롤러가 “등록되지 않은 것처럼” 보이면 컴포넌트 스캔 범위를 확인한다
컨트롤러를 만들었는데도 계속 없다면 정말로 없는 게 아니라 스프링이 빈으로 등록을 못했을 가능성이 있다.
Spring Boot는 보통:
- DemoApplication (메인 클래스, @SpringBootApplication)이 있는 패키지를 기준으로 그 하위 패키지를 컴포넌트 스캔한다
그래서 컨트롤러를:
- DemoApplication과 같은 패키지 또는 하위 패키지에 두면 스캔되어 자동 등록되는 경우가 많다
4) 내장 웹서버 (embedded) 때문에 “외부 톰캣 없이도” 실행된다
Spring Boot는 외부 톰캣을 설치하지 않아도 웹이 뜬다.
다만 “톰캣이 아예 없는 것”이 아니라 애플리케이션 안에서 내장 톰캣이 같이 실행되는 구조다.
또한 포트 충돌이 날 수 있으니
- server.port=8088 같은 방식으로 포트를 바꿔서 충돌을 피한다
5) ViewResolver의 prefix / suffix는 “Controller가 반환한 viewName”에 붙는다
컨트롤러는 보통 화면 이름만 돌려준다.
- 반환값: "index" (viewName)
ViewResolver가 이를 실제 JSP 경로로 완성한다.
- prefix: /WEB-INF/views/
- suffix: .jsp
- 결과: /WEB-INF/views/index.jsp
즉,
- prefix / suffix는 Controller가 반환한 viewName에 붙는 설정이 맞다.
6) JSP는 Boot에서 “기본값”이 아니라 추가 구성 대상이다
- Boot는 기본적으로 특정 뷰 엔진 (JSP / Thymeleaf)을 강제하지 않는다
다만 프로젝트에서 Thymeleaf 등을 많이 쓰다 보니 .html 기반이 기본처럼 느껴질 수 있다.
JSP를 쓰려면 보통:
- JSP를 컴파일 / 렌더링할 엔진 (예: Jasper)
- JSTL 등
관련 의존성이 추가로 필요해진다.
그래서 pom.xml에 몇 가지 디펜던시 (jar)가 필요하다.
7) .do가 “필수”였던 이유와 Boot에서 RESTful URL이 자연스러운 이유
.do는 “부트가 내장이라서 사라지는 것”이 아니라
- 예전 FrontController 설계에서 서블릿 매핑 패턴을 .do로 통일했던 프로젝트 규칙 / 관례에 가깝다.
Spring MVC / Boot에서는
- /index, /members/1, /news/10처럼
- “확장자 없는 경로 + HTTP 메서드” 조합이 자연스럽다.
그래서 결과적으로 요청 URL이 더 “RESTful (리소스 중심)”하게 구성되기 쉬워진다.
'수업 복습' 카테고리의 다른 글
| Spring Boot + JSP 로그인부터 게시판 조회 (0) | 2026.01.20 |
|---|---|
| 커맨드 객체 바인딩과 DI 흐름 정리 (0) | 2026.01.19 |
| FrontController에서 DispatcherServlet까지 (0) | 2026.01.16 |
| 콘솔 회원·게시판 프로그램 (0) | 2026.01.15 |
| 객체지향 → IoC → Spring Container 흐름 (0) | 2026.01.14 |