조건:
/api/v1/calc
{
"add": 4,
"minus": -2,
"multiply": 3
}
컨트롤러와 request, response DTO를 통해 풀었습니다.
컨트롤러
Getter를 사용한 자동 json형식 변환? 을 사용했다.
//com.group.libraryapp.controller.calculator;
@RestController
@RequestMapping("/api/v1")
public class CalculatorController {
@GetMapping("/calc")
CalculatorResponse cals(CalculatorRequest request){
int add = request.getNum1() + request.getNum2();
int minus = request.getNum1() - request.getNum2();
int multiply = request.getNum1() * request.getNum2();
return new CalculatorResponse(add, minus, multiply);
}
}
Request DTO
package com.group.libraryapp.dto;
public class CalculatorRequest {
private final int num1;
private final int num2;
public CalculatorRequest(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public int getNum1() {
return num1;
}
public int getNum2() {
return num2;
}
}
Response DTO
package com.group.libraryapp.dto;
public class CalculatorResponse {
private final int add;
private final int minus;
private final int multiply;
public CalculatorResponse(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;
}
}
어노테이션 DateTimeFormat으로 형식을 지정해주는 방법이 있다는 것을 알았다.
디테일한 예외처리도 배워보고 싶다.
@GetMapping("/day-of-the-week")
public String getDayOfTheWeek(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
return date.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.ENGLISH);
}
처음 시도했던 패턴은 생성자로 받아오게 했는데, 기본 생성자는 필드를 초기화하면 안되는 오류가 있어 아래처럼 되었다.
package com.group.libraryapp.dto;
import java.util.List;
public class CalaulatorArrRequest {
private final List<Integer> numbers;
public CalaulatorArrRequest() {
// 기본 생성자는 필드를 초기화하지 않습니다.
this.numbers = null;
}
public CalaulatorArrRequest(List<Integer> numbers) {
this.numbers = numbers;
}
public List<Integer> getNumbers() {
return numbers;
}
}
그 이후 아래처럼 setter를 사용하는 방법으로 구현했는데, DTO에서 setter를 쓰는게 아직 어색하고… 이렇게 해도되는 건지 모르겠고…어색해서 @JsonProperty("numbers")라는 것의 도움을 받았다.
package com.group.libraryapp.dto;
public class CalaulatorArrRequest {
private List<Integer> numbers;
public List<Integer> getNumbers() {
return numbers;
}
public void setNumbers(List<Integer> numbers) {
this.numbers = numbers;
}
}
DTO
package com.group.libraryapp.dto;
...
public class CalaulatorArrRequest {
private List<Integer> numbers;
public CalaulatorArrRequest(@JsonProperty("numbers") List<Integer> numbers) {
this.numbers = numbers;
}
public List<Integer> getNumbers() {
return numbers;
}
}
Controller
@PostMapping("/array-cal")
public int postArrayCal(@RequestBody CalaulatorArrRequest request){
int sum = 0;
for (Integer n:request.getNumbers()) {
sum += n;
}
return sum;
}