[인프런 워밍업 클럽] BE 0기 2일차 과제
컨트롤러 코드)
@RestController
public class WorkController {
@GetMapping("/api/v1/calc")
public ResultResponse result(NumberRequest request) {
ResultResponse response = new ResultResponse(request.addNum(), request.minusNum(), request.multiplyNum());
return response;
}
}
DTO를 만들어 객체 내부에서 일을 수행하게 하고, 코드의 간결성을 높였습니다.
Request DTO)
public class NumberRequest {
private int num1;
private int num2;
public NumberRequest(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public int getNum1() {
return num1;
}
public int getNum2() {
return num2;
}
public int addNum(){
return num1 + num2;
}
public int minusNum(){
return num1 - num2;
}
public int multiplyNum(){
return num1 * num2;
}
}
request dto에서 객체 스스로 일을 처리하게 하여 능동적인 객체를 만들었습니다.
response DTO)
public class ResultResponse {
private int add;
private int minus;
private int multiply;
public ResultResponse(int add, int minus, int multiply) {
this.add = add;
this.minus = minus;
this.multiply = multiply;
}
public int getAdd() {
return add;
}
public int getMinus() {
return minus;
}
public int getMultiply() {
return multiply;
}
}
JSON 결과값을 내놓기 위해 response DTO 객체를 만들어 반환해주었습니다.
결과)
정상적으로 수행하는 모습을 확인할 수 있습니다.
컨트롤러)
@RestController
public class WorkController {
@GetMapping("/api/v1/day-of-the-week")
public DateResponse result(@RequestParam String date) {
return new DateResponse(date);
}
}
response DTO)
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class DateResponse {
private String dayOfTheWeek;
public DateResponse(String dayOfTheWeek) {
this.dayOfTheWeek = translate(dayOfTheWeek);
}
public String getDayOfTheWeek() {
return dayOfTheWeek;
}
public String translate(String date){
DayOfWeek dayOfWeek = LocalDate.parse(date, DateTimeFormatter.ISO_DATE).getDayOfWeek();
return String.valueOf(dayOfWeek).substring(0, 3);
}
}
쿼리의 입력값을 String 형식으로 받은 후 DTO에서 LocalDate를 이용해 변환 작업을 거쳤다.
컨트롤러에서 처리할 내용을 객체에서 처리하게 하여 코드의 간결함을 향상 시켰다.
DateTimeFormatter.ISO_DATE: "yyyy-MM-dd" 형식으로 포맷팅 해주는 상수이다.
결과)
컨트롤러)
@RestController
public class WorkController {
@PostMapping("/api/v1/sum")
public int result(@RequestBody ListRequest request) {
return request.getSum();
}
}
requestDTO)
import java.util.List;
public class ListRequest {
private List<Integer> numbers;
public List<Integer> getNumbers() {
return numbers;
}
public int getSum() {
return numbers.stream().mapToInt(i -> i).sum();
}
}
@RequestBody가 붙은 dto에서는 반드시 빈 생성자가 있어야 한다 라는 것을 알게 되었다. 이유를 찾아보았더니,
ObjectMapper에서는 객체의 상태를 초기화하기 위해 빈 생성자를 사용하고, 빈 생성자가 선언되어 있지 않다면 런타임 에러가 발생한다. 따라서 HTTP 요청으로 JSON 형태의 Request Body를 받는 경우, DTO에 빈 생성자가 있지 않다면 DTO 객체를 생성하지 못해 에러가 발생한다. 라는 오라클의 공식문서에 나와있었다.
ObjectMapper)
"ObjectMapper는 기본 POJO(Plain Old Java Objects) 또는 범용 JSON Tree Model(JsonNode)에서 JSON을 읽고 쓰는 기능과 변환 수행을 위한 기능을 제공합니다.
또한 다양한 스타일의 JSON 컨텐츠와 함께 작동하고 다형성 및 객체 동일성과 같은 고급 객체 개념을 지원하도록 Customizing할 수 있습니다."
결과)
댓글을 작성해보세요.