[2일차] 인프런 워밍업 스터디 클럽 0기- BE
2일차는 API를 만드는 과제입니다.
API란 내가 어떻게 보낼테니 너는 이렇게 받아줘 라는 일종의 약속입니다.
어려운 말로는 Application Protocol Interface 입니다. 그냥 약속이라는 뜻입니다.
문제1 두 수를 입력하면, 다음과 같은 결과가 나오는 GET API를 만들어 보자!
localhost:8080/api/v1/operation?number1=10&number2=20
위와 같이 입력하면 아래와 같이 출력되는 문제입니다.
{
"add": 30,
"minus": -10,
"multiply": 200
}
이 문제는 그렇게 어렵지 않았습니다. 핵심은 DTO 였습니다.
저는 아래와 같이 구현하였습니다.
생성자에서 바로 모든 로직을 구해 버렸죠.
public class Operation {
private final int add;
private final int minus;
private final int multiply;
public Operation(OperationRequest request) {
this.add = request.number1() + request.number2();
this.minus = request.number1() - request.number2();
this.multiply = request.number1() * request.number2();
}
}
위와 같이 구현하면 Controller는 아래와 같이 간단하게 구현하면 됩니다.
@RestController
@RequestMapping("/api/v1")
public class OperationController {
@GetMapping("/operation")
public Operation operation(OperationRequest request) {
return new Operation(request);
}
}
이번 과제를 하면서 새롭게 알게된 것이 있습니다. 바로 record 입니다.
DTO를 다 만들고 보니 인텔리제이가 인텔리하게 아래와 같이 변경해 주고 잘 돌아 가는 것을 확인하였습니다.
public record OperationRequest(int number1, int number2) {
}
진짜 마법과 같은 일이었습니다. record에 대해서 조금 더 알아 봐야 할 것 같습니다.
문제2... 또 문제가 있었습니다. 너무 힘듭니다. 그렇지만 힘을 내 봅니다.
localhost:8080/api/v1/day-of-the-week?date=2024-02-03
위와 같이 입력하면 아래와 같이 출력되어야 합니다.
{
"dayOfTheWeek": "SATURDAY"
}
이 문제는 살짝 친구(ChatGPT)에게 물어 봤습니다.
@RequestMapping("/api/v1")
@RestController
public class DayOfTheWeekController {
@GetMapping("/day-of-the-week")
DayOfTheWeek dayOfTheWeek(@RequestParam("date") String date) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate dateFormat = LocalDate.parse(date, dateTimeFormatter);
DayOfWeek dayOfWeek = dateFormat.getDayOfWeek();
return new DayOfTheWeek(String.valueOf(dayOfWeek));
}
}
위와 같이 DateTimeFormatter에서 패턴을 구해 옵니다. 그리고 LocalDate에서 파싱을 같은 형식으로 파싱을 해주죠.
그리고 LocalDate에서 getDayOfWeek()로 요일을 구해 온 후 리턴해 주기만 하면 됩니다. ( getDayOfWeek() 만들어 주신 분 감사합니다 )
문제 3번도 있습니다;ㅁ; 살려 주세요.
{
"numbers": [1,2,3,4,5]
}
위와 같이 Post로 넘기면 합이 나와야 합니다.
힌트가 있었는데요, 요청을 받는 DTO에서 List를 갖고 있으면 JSON의 배열로 받을 수 있다고 합니다.
그런데 두둥. 안됩니다. 저는 안되었습니다.
저는 아래와 같이 구현하였더니 잘되었습니다.
@Getter
@Setter
@NoArgsConstructor
public class NumbersRequest {
private int[] numbers;
public NumbersRequest(int[] numbers) {
this.numbers = numbers;
}
}
아래 컨트롤러에서는 스트림으로 처리해 보았습니다
@RequestMapping("/api/v1")
@RestController
public class ArraySumController {
@PostMapping("/sum")
public int sum(@RequestBody NumbersRequest request){
// int sum = 0;
// for (int number : request.getNumbers()) {
// sum += number;
// }
return Arrays.stream(request.getNumbers()).sum();
}
}
과제가 너무 힘들었습니다.
과제 하나에 3문제는 너무합니다 ㅠ
그렇지만 다음 과제도 열심히 해보겠습니다!!!
댓글을 작성해보세요.