[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문제는 너무합니다 ㅠ

그렇지만 다음 과제도 열심히 해보겠습니다!!!

 

 

댓글을 작성해보세요.

채널톡 아이콘