Data Transfer Object 의 약자로 데이터 이동을 위한 객체라는 뜻
직전 게시물에서 나왔듯 @RequestParam 으로 쿼리를 모두 정해주는 방식이 있다.
좀더 편하게 하기 위해 DTO를 만들어 사용하는 방식을 실습하자
먼저 클래스 객체를 만들어준다.
@Data
@AllArgsConstructor //모든 파라미터를 받는 기본 생성자 생성해주는 어노테이션
@NoArgsConstructor //어떤 파라미터도 받지 않는 기본 생성자 생성해주는 어노테이션
public class BookQueryParam {
private String category;
private String issuedYear;
private String issuedMonth;
private String issuedDay;
}
먼저 3가지 어노테이션 @Data, @AllArgsConstructor, @NoArgsConstructor에 대해서 알아보자
@Data 어노테이션은 Lombok 라이브러리가 제공하는 어노테이션으로, Java 클래스에 필드 접근자 메서드 (getter, setter, equals, hashCode, toString)를 자동으로 생성한다.
아래의 메서드들이 자동으로 생성된다.
위와 같이 객체의 사용에 필요한 여러 메서드들을 생성해준다.
주석에 달려있듯이 모든 파라미터(매개변수)를 입력받는 생성자 메서드를 제공해준다.
만약 BookQueryParam 클래스라면
public BookQueryParam(String category, String issuedYear, String issuedMonth, String issuedDay) {
this.category = category;
this.issuedYear = issuedYear;
this.issuedMonth = issuedMonth;
this.issuedDay = issuedDay;
}
와 같은 생성자가 제공된다.
어떤 파라미터, 매개변수도 받지 않는 생성자 메서드를 제공해준다.
이제 이 클래스를 활용해 DTO를 통한 GetMapping에 대해서 알아보자.
아래의 그 코드이다.
package org.example.restapi.restapi.controller;
import org.example.restapi.restapi.controller.model.BookQueryParam;
import org.springframework.web.bind.annotation.*;
import static org.apache.coyote.http11.Constants.a;
@RestController
@RequestMapping("/api")
public class RestApiController {
@GetMapping(path = "/book")
public void queryParamDTO(
BookQueryParam bookQueryParam
){
System.out.println(bookQueryParam);
}
}
위의 코드를 스프링부트로 실행하면 다음과 같은 주소로 접속했을 때 bookQueryParam의 각 파라미터들을 출력해낸다.
http://localhost:8080/api/book?category=소설&issuedYear=2023&issuedMonth=10&issuedDay=15
위의 주소로 접속해야 하는 이유는 아래의 쿼리 규칙을 만족하기 위해서이다.
- 쿼리 파라미터는 ? 기호로 시작합니다.
- 쿼리 파라미터는 & 기호로 연결됩니다.
- 키-값 쌍은 = 기호로 구분됩니다.
- 한글과 같은 특수문자는 URL 인코딩해야 합니다.
출력은 이렇게 나오게 될 것 이다.
BookQueryParam(category=소설, issuedYear=2023, issuedMonth=10, issuedDay=15)