<< 학습 목표 >>
1. GET 방식 요청을 처리할 컨트롤러를 만들 수 있다.
2. POST 방식 요청을 처리할 컨트롤러를 만들 수 있다.
C는 컨트롤러(Controller / 제어자)로 컨트롤러라는 뜻 그대로 요청을 제어하기만 해야하고 요청을 처리하는건 지양해야함
요청을 처리하는 역할은 주로 S(Service)가 담당함
C가 해야하는건 다음과 같음
- 클라이언트의 요청을 받음
- 클라이언트가 파라미터를 보냈다면 파라미터를 꺼냄
꺼낸 파라미터의 형태가 올바른지 확인함
꺼낸 파라미터들을 하나의 정보로 합칠 수 있다면 합침
- 클라이언트의 요청을 처리할 서비스 메서드를 호출함
- 서비스 메서드가 반환한 처리 결과를 사용해 적절한 후처리를 함
- 클라이언트의 요청 처리 결과를 전달함
그러나 반드시 위의 것만 해야하는건 아님
위 항목들은 C가 하길 권장하는 것이니 참고하고 상황에 따라서는 달라질 수 있음
C의 역할 중 컨트롤러를 만들어 클라이언트의 요청을 받을 수 있게 해보자
- 클라이언트의 요청을 받음
- 클라이언트가 파라미터를 보냈다면 파라미터를 꺼냄
꺼낸 파라미터의 형태가 올바른지 확인함
꺼낸 파라미터들을 하나의 정보로 합칠 수 있다면 합침
- 클라이언트의 요청을 처리할 서비스 메서드를 호출함
- 서비스 메서드가 반환한 처리 결과를 사용해 적절한 후처리를 함
- 클라이언트의 요청 처리 결과를 전달함
프로젝트 -> com.example.demo.chapter02 -> TestController01 클래스를 추가하고 아래 코드를 추가하자
package com.example.demo.chapter02;
import java.time.LocalDateTime;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class TestController01 {
@GetMapping("/chapter02/test/controller/01")
public void doGet() {
System.out.println("TestController01 -> doGet 메서드 호출 " + LocalDateTime.now());
}
@PostMapping("/chapter02/test/controller/02")
public void doPost() {
System.out.println("TestController01 -> doPost 메서드 호출 " + LocalDateTime.now());
}
}
<< 코드 설명 >>

(1). C는 반드시 @Controller 애너테이션을 갖고 있어야함
@Controller 애너테이션이 있다고 클라이언트의 요청을 받을 수 있는건 아니고 클라이언트의 요청을 받을 수 있게 준비를 하는 것
(2). C 안에 클라이언트의 요청을 처리할 메서드들을 추가해야 하는데 메서드에 @GetMapping 애너테이션을 붙인다면 해당 메서드는 GET 방식 요청을 처리할 수 있는 메서드가 됨
경로는 애너테이션 안에 문자열로 지정함
따라서 doGet 메서드는 클라이언트가 GET 방식으로 http://localhost:8080/chapter02/test/controller/01 로 요청을 보낸다면 그 요청을 처리할 메서드임
(3). @PostMapping 애너테이션을 붙인다면 해당 메서드는 POST 방식 요청을 처리할 수 있는 메서드가 됨
GetMapping 애너테이션과 마찬가지로 경로는 애너테이션 안에 문자열로 지정함
따라서 doPost 메서드는 클라이언트가 POST 방식으로 http://localhost:8080/chapter02/test/controller02 로 요청을 보낸다면 그 요청을 처리할 메서드임
이제 프로젝트를 실행시키고 Postman 으로 요청을 보내보자

각 요청 방식과 URL을 지정해 요청을 보내면 요청에 맞는 메서드가 호출되 요청을 받을 수 있음
요청을 받았는 지 여부는 sts 내 [ Console 패널 ] (1) 을 확인해보면 알 수 있음

서블릿을 배운 후 곧바로 Spring Boot를 공부한다는 전재로 이 글을 쓰고 있기 때문에 서블릿과 비교하기 위해 컨트롤러 내 메서드 이름을 doGet, doPost 로 했지만 컨트롤러 내 메서드 이름을 doGet, doPost 로 지정할 필요는 없음
컨트롤러 내 메서드 이름, 코드를 다음 (1), (2) 과 같이 바꾸자

서블릿의 컨트롤러와 Spring Framework의 컨트롤러를 직접 비교해보자

차례대로 비교해보자
서블릿 컨트롤러에는 @WebServlet 애너테이션이 붙지만 Spring Framework 컨트롤러는 @Controller 애너테이션이 붙음
또한 서블릿 컨트롤러에는 컨트롤러의 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 방식 요청을 처리하기 위해서는 경로별 메서드가 하나씩, 총 두 개의 메서드가 필요함

Spring Framework의 컨트롤러 만드는 방법이 더 간편하다는걸 알 수 있음
'Spring + Boot > Boot-Chapter02' 카테고리의 다른 글
| Chapter02. Spring Boot - 롬복(Lombok) 사용하기 (0) | 2023.04.11 |
|---|---|
| Chapter02. Spring Boot - 클라이언트가 보낸 파일 꺼내기 (0) | 2023.04.11 |
| Chapter02. Spring Boot - 클라이언트가 보낸 값들 꺼내기 (0) | 2023.04.09 |
| Chapter02. Spring Boot - 클라이언트가 보낸 값 꺼내기 (0) | 2023.04.09 |
| Chapter02. Spring Boot - MVC 디자인 패턴 (0) | 2023.04.08 |