2일차 과제 [인프런 워밍업 클럽 스터디 BE 1주차]

heisje·2024년 2월 20일
0
post-custom-banner

2일차 과제

문제1. 두 수를 입력하면 다음과 같은 결과가 나오는 GET API 만들기

조건:

  • path: /api/v1/calc
  • 쿼리파라미터 : num1, num2
{
    "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;
    }
}

문제2. 날짜 입력 시 몇요일인지 알려주는 GET API작성

어노테이션 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);
    }

문제3. 여러 수를 받아 총 합을 반환하는 POST API작성

문제풀이 과정

처음 시도했던 패턴은 생성자로 받아오게 했는데, 기본 생성자는 필드를 초기화하면 안되는 오류가 있어 아래처럼 되었다.

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;
}
profile
김희제의 기술블로그
post-custom-banner

0개의 댓글