또한 서블릿 컨트롤러에는 컨트롤러의 URL을 지정하지만 Spring Framework 컨트롤러는 컨트롤러의 URL을 지정하지 않음
서블릿 컨트롤러의 경우 해당 경로(1) 로 GET 방식 요청이 들어왔을 때 호출될 메서드(2)이지만 Spring Framework 컨트롤러의 경우 해당 경로(3) 로 GET 방식 요청(4)이 들어왔을 때 호출될 메서드(5)임
서블릿 컨트롤러의 경우 컨트롤러 하나당 URL 하나만 처리할 수 있음
그리고 doGet 메서드를 오버라이딩하면 해당 URL의 GET 방식 요청을 처리할 수 있고 doPost 메서드를 오버라이딩 하면 해당 URL의 POST 방식 요청을 처리할 수 있음
둘 다 오버라이딩 한다면 해당 URL의 GET, POST 방식 요청 모두 처리할 수 있음
Spring Framework 컨트롤러의 경우 따로 오버라이딩 해야될 메서드는 없고 메서드 위에 애너테이션과 경로를 지정해 해당 URL의 GET, POST 방식 요청을 처리할 수 있음
서블릿 컨트롤러는 경로(URL) 마다 컨트롤러를 생성해야함
예를 들어 서블릿 컨트롤러로 /chapter02/test/controller/01 경로의 GET 방식 요청 처리, /chapter02/test/controller/02 경로의 GET 방식 요청을 처리하기 위해서는 경로별 컨트롤러가 하나씩, 총 두 개의 컨트롤러가 필요함
Spring Framework 컨트롤러는 경로(URL) 마다 메서드를 추가해야함
예를 들어 Spring Framework 컨트롤러로 /chapter02/test/controller/01 경로의 GET 방식 요청 처리, /chapter02/test/controller/02 경로의 GET 방식 요청을 처리하기 위해서는 경로별 메서드가 하나씩, 총 두 개의 메서드가 필요함
ViewResolver 설정은 src/main/resources -> application.properties (1) 에 설정함
뷰리졸버 설명을 하기 전에 컨트롤러 먼저 생성하자
<< 컨트롤러 생성 >>
com.example.demo.chapter02 -> ViewTestController 클래스 추가 후 아래 코드 입력
package com.example.demo.chapter02;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class ViewTestController {
@RequestMapping(value="/chapter02/jsp1", method = RequestMethod.GET)
public String jsp1() {
return "index";
}
@GetMapping("/chapter02/jsp2")
public String jsp2() {
return "chapter02/some";
}
}
<< 코드 설명 >>
(1). @이 붙었으므로 애너테이션으로 Controller 애너테이션은 해당 클래스를 컨트롤러로 만들어줌
컨트롤러는 클라이언트의 요청을 받아 요청을 처리할 서비스 메서드를 호출함
그리고 서비스 메서드가 반환한 처리 결과에 따라서 클라이언트에게 적절한 결과를 응답함
(2), (3). RequestMapping, GetMapping 애너테이션은 클라이언트의 요청을 처리할 메서드에 붙는 애너테이션
@RequestMapping 애너테이션은 value, method 속성을 사용함
value 속성은 "해당 경로로 요청이 들어왔을 때" 로 해석할 수 있음
method 속성은 "해당 요청 방식으로 요청이 들어왔을 때" 로 해석할 수 있음
따라서 value, method 속성을 연결해 해석하면 "http://localhost:8080/chapter02/jsp1 로 GET 방식 요청이 들어왔을 때 jsp1 메서드가 그 요청을 처리하겠다" 임
(3). GetMapping 애너테이션은 속성 없이 ( ) 안에 문자열을 넣었는데 애너테이션 이름이 GetMapping 인 것처럼 "http://localhost:8080/chapter02/jsp2 로 GET 방식 요청이 들어왔을 때 jsp2 메서드가 그 요청을 처리하겠다" 임
(2)와 (3)에서 문자열을 반환해주는데 클라이언트에게 전달할 뷰이름으로 컨트롤러에서 문자열을 반환하면 뷰 리졸버가 동작해 반환하는 문자열의 앞에 prefix 를 붙이고 문자열의 뒤에 suffix 를 붙여서 해당하는 뷰를 클라이언트에게 전달함
따라서 컨트롤러는 문자열을 반환했지만 뷰리졸버 덕분에 클라이언트는 문자열이 아닌 뷰를 전달 받음
혹시 이대로 했는데 뷰가 안나온다면 무시하고 넘어가자
이 글의 처음에서 언급했듯 Spring Boot 로 만든 Spring Framework 프로젝트는 백엔드 용으로만 쓰지 그 안에 웹 페이지, CSS 등 뷰를 위한 것들을 넣지 않음
만약 Spring Boot 를 공부하고 포트폴리오를 만든다면 Spring Boot로 백엔드 프로젝트를 만들고 JSP 에서 배웠던 프로젝트를 만들어 이 프로젝트를 프론트엔드 프로젝트로 사용하면 됨
잘모르겠다면 Spring Boot 공부가 다 끝나면 마지막에 프로젝트를 할테니 그대로 따라오면 알게될 것
우리가 만든 프로젝트의 Servlet, Tomcat, Java의 버전을 현업에서 사용하는 버전으로 바꿀 순 없을까?
바꿀 순 있지만 그러려면 Spring Boot 3.0.5 버전이 아닌 더 낮은 버전을 사용해 Spring Framework 프로젝트를 만들어야함
우리가 공부하는 환경과 현업의 환경이 많이 다르지만 그러려면 수 년 전의 책이나 자료를 찾아야하므로 이대로 진행하자
취업에 성공해 Spring Framework 를 사용한 프로젝트에 투입됐다면 Spring Framework의 버전과 Tomcat, Java의 버전을 잘 확인하고 차이가 난다면 신입 딱지가 붙어있을 때 얼른 상사 또는 사수에게 "저는 공부할 때 Spring Framework는 X 버전, Tomcat은 X 버전, Java는 X 버전을 사용했는데 혹시 제가 주의해야할 부분이 있을까요?" 라고 물어보자
아직은 "신입이니까..." 가 용서될 수도 있을 것ㅎㅎ
이렇게 우리 프로젝트의 Spring Framwork, Tomcat, Java의 버전을 확인해봤음
마지막으로 Tomcat의 포트 번호를 바꾸는 방법을 알아보자
Spring Boot 를 배울 때 포트 번호를 바꿔야하는 경우가 빈번하게 생기는 듯함
Tomcat의 포트 번호를 바꾸려면 [ 프로젝트 설정 값이 들어가는 곳 ] (1) 에 포트 번호를 설정하면 됨