<< 학습 목표 >>
1. 클라이언트가 보낸 값을 꺼낼 수 있다.
2. 클라이언트가 보낸 값을 형변환해 꺼낼 수 있다.
3. 클라이언트가 보낸 한글 데이터를 꺼낼 수 있다.
이번에는 C의 역할 중 클라이언트가 파라미터를 보냈을 때 파라미터를 꺼내보자
- 클라이언트의 요청을 받음
- 클라이언트가 파라미터를 보냈다면 파라미터를 꺼냄
꺼낸 파라미터의 형태가 올바른지 확인함
꺼낸 파라미터들을 하나의 정보로 합칠 수 있다면 합침
- 클라이언트의 요청을 처리할 서비스 메서드를 호출함
- 서비스 메서드가 반환한 처리 결과를 사용해 적절한 후처리를 함
- 클라이언트의 요청 처리 결과를 전달함
그 중에서도 특히 클라이언트가 값을 보냈을 때 값을 꺼내는 방법에 대해 알아보자
클라이언트가 보내는 파라미터를 꺼내는 방법은 다양한 방법이 있음
1. 요청 정보(HttpServletRequest) 를 사용해 꺼내는 방법
2. @RequestParam 애너테이션을 사용해 꺼내는 방법
3. 매개변수를 사용해 꺼내는 방법
세 방법 모두 간단하므로 한꺼번에 코드로 입력한 후 하나씩 알아보자
프로젝트 -> com.example.demo.chapter02 -> TestController02 클래스를 추가하고 아래 코드를 추가하자
package com.example.demo.chapter02;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import jakarta.servlet.http.HttpServletRequest;
@Controller
public class TestController02 {
@GetMapping("/chapter02/type1")
public void type1(HttpServletRequest request) {
String name = request.getParameter("name");
System.out.println("<< type1 메서드 호출 >>");
System.out.println("클라이언트가 보낸 name 파라미터의 값 => " + name);
}
@GetMapping("/chapter02/type2")
public void type2(@RequestParam("name") String name) {
System.out.println("<< type2 메서드 호출 >>");
System.out.println("클라이언트가 보낸 name 파라미터의 값 => " + name);
}
@GetMapping("/chapter02/type3")
public void type3(String name) {
System.out.println("<< type3 메서드 호출 >>");
System.out.println("클라이언트가 보낸 name 파라미터의 값 => " + name);
}
}
<< 코드 설명 >>
type1 메서드에서 type2, type3 메서드로 내려갈수록 파라미터를 꺼내는 방법이 간단해지고 있음
(1). 서블릿 컨트롤러와 동일한 방식으로 요청 정보(HttpServletRequest) 의 getParameter 메서드를 사용해 꺼냄
(2). @RequestParam 애너테이션을 사용해 name 파라미터의 값을 꺼내 name 매개변수에 저장함
(3). @RequestParam 애너테이션이 없으면 매개변수의 이름과 동일한 파라미터의 값을 꺼내 매개변수에 저장함
프로젝트를 실행시키고 각 경로에 name 파라미터를 보내보자
<< Postman 으로 요청 보내는 방법 >>
(1) 의 경우 서블릿 컨트롤러의 방식을 그대로 사용한 것이므로 더 설명할 게 없지만 (2), (3) 의 경우 Spring Framework 만의 방식이므로 몇 가지 상황을 더 알아보자
클라이언트가 파라미터를 여러 개 보냈다면(1) 다음과 같이 매개변수를 더 추가해 각 값을 꺼내 매개변수에 저장(2)할 수 있음
<< Postman >>
<< TestController02 컨트롤러 >>
여기서 type2의 경우 @ReuqestParam 애너테이션에 값을 꺼낼 파라미터의 이름을 지정했으므로 매개변수의 이름이 중요하지 않음
<< 코드 설명 >>
(1). 클라이언트가 보낸 name 파라미터의 값을 꺼내 param1 매개변수에 저장
(2). 클라이언트가 보낸 age 파라미터의 값을 꺼내 param2 매개변수에 저장
(3). 클라이언트가 보낸 height 파라미터의 값을 꺼내 param3 매개변수에 저장
그러나 type3의 경우 값을 꺼낼 파라미터의 이름과 매개변수의 이름이 반드시 같아야함
<< 코드 설명 >>
(1). 클라이언트가 보낸 name 파라미터의 값을 꺼내 name 매개변수에 저장
클라이언트가 보낸 age 파라미터의 값을 꺼내 age 매개변수에 저장
클라이언트가 보낸 height 파라미터의 값을 꺼내 height 매개변수에 저장
일반적으로는 가장 간단한 type3의 방식대로 파라미터를 꺼냄
Spring Framework 프로젝트이므로 파라미터를 꺼낼 때 당연히 Spring Framework의 방식대로 꺼내지만 특히나 Spring Framework의 방식을 사용해 파라미터를 꺼낼 때 편리한 점은 파라미터의 형변환을 알아서 해준다는 점
위와 같이 클라이언트가 파라미터를 보냈다면 보통 컨트롤러에서는 데이터를 꺼내 형변환 후 사용함
그러나 Spring Framework의 방식대로 꺼낼 때는 매개변수의 타입에 맞게 형변환 되 해당 매개변수에 저장됨
프로젝트를 재실행 시킨 후 각 경로로 데이터들을 보내보자
앞으로는 특별한 경우가 아니라면 type3 방식대로 파라미터를 꺼낼 것이므로 type2가 빠져있어도 동일하게 적용된다고 생각하자
클라이언트가 한글 데이터를 파라미터에 담아 보냈을 때는 어떻게 될까?
컨트롤러에서는 별도로 처리해줄게 없음
서블릿 컨트롤러에서는 반드시 request.setCharacterEncoding("UTF-8") 을 해줘야했지만 Spring Framework 를 사용한 컨트롤러에서는 해당 설정이 자동으로 적용됨
이렇게 서블릿 컨트롤러에 비해서 개발자가 할 일이 줄어드므로 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 |