인프런워밍업스터디_BE_2일차_과제

오현석·2024년 2월 18일
post-thumbnail

문제 1 - 두 수를 입력했을 때의 GET API 만들기!

로직 : 컨트롤러가 엔드포인트에서 request를 받으면 CalculatorField 객체가 request의 getNum1 메소드와 getNum2 메소드를 사용하여 필드값으로 저장하게 되고 컨트롤러는 이 객체를 toString메소드로 리턴하게 된다.

컨트롤러

@RestController
public class CalculatorController {

  @GetMapping("/api/v1/calc") // GET /add
  public String addTwoNumbers(CalculatorRequest request) {;
    CalculatorField result = new CalculatorField(
            request.getNum1()+ request.getNum2(), request.getNum1() -request.getNum2(), request.getNum1() * request.getNum2());
    return result.toString();
  }

리퀘스트는 강의안과 필드명만 다르다

CalculatorFiled 클래스

public class CalculatorField {
    private final int  add;
    private final int minus;
    private final int multiply;

    public CalculatorField(int add, int minus, int multiply) {
        this.add = add;
        this.minus = minus;
        this.multiply = multiply;
    }

    @Override
    public String toString() {
        return "{\n  " +
                "\"add:\"" + add +
                ",\n  \"minus:\"" + minus +
                ",\n  \"multiply\":" + multiply +
                "\n}";
    }
}

문제 2 - DATE GET API 만들기

로직 : 컨트롤러가 엔드포인트에서 String 타입으로 request를 받으면 LocalDate 객체를 사용하여 parse로 request의 String을 할당해주고 getDayofWeek 메소드로 요일로 변경한다.

컨트롤러

package com.group.libraryapp.controller.assignment;

import com.group.libraryapp.dto.assignment.request.DateRequeset;
import org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.DayOfWeek;
import java.time.LocalDate;

@RestController
public class DateController {
    @GetMapping("/api/v1/dayweek")
    public String DateControl(DateRequeset request){
        LocalDate dateWeek = LocalDate.parse(request.getDate());
        return "{\n  \"dayOfTheWeek\": \""+dateWeek.getDayOfWeek()+"\"\n}";

    }
}

request

package com.group.libraryapp.dto.assignment.request;

import java.text.DateFormat;
import java.time.LocalDate;

public class DateRequeset {
    private final String date;

    public DateRequeset(String date) {
        this.date = date;
    }

    public String getDate() {
        return date;
    }
}

문제 3 - POST API 만들기

로직 : 위의 로직들과 유사하되, POST는 RequestBody 어노테이션을 사용하기 위해 이에 걸맞는 조취를 취해줘야 했다.

1안 - 컨트롤러

package com.group.libraryapp.controller.assignment;

import com.group.libraryapp.dto.assignment.request.SumRequest;
import jakarta.persistence.criteria.CriteriaBuilder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SumController {
    @PostMapping("api/v1/add")
    public int returnAdd(@RequestBody SumRequest request){
        Integer[] numbers = request.getNumbers();
        int result = 0;
        for(int i:numbers){
            result += i;
        }
        return result;
    }

}

Request - @JsonCreator와 @JsonProperty("numbers")로 private한 필드에서도 @RequestBody가 접근할 수 있도록 했다.

package com.group.libraryapp.dto.assignment.request;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class SumRequest {
    private final Integer[] numbers;

    @JsonCreator
    public SumRequest(@JsonProperty("numbers") Integer[] numbers) {
        this.numbers = numbers;
    }

    public Integer[] getNumbers() {
        return numbers;
    }

}

2안 - 그냥 request의 필드에서 final을 쓰지 않고 setter 추가하기

컨트롤러

@RestController
public class SumController {
    @PostMapping("api/v1/add")
    public int returnAdd(@RequestBody SumRequest request){

        Integer[] numbers = request.getNumbers();
        int result = 0;
        for(int i:numbers){
            result += i;
        }
        return result;
    }

}

Request - 생성자 대신 setter를 사용했다. setter는 @RequestBody에서 자체적으로 사용하기 때문에 컨트롤러에서는 setter를 사용하지 않아도 되었다.

package com.group.libraryapp.dto.assignment.request;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class SumRequest {
    private Integer[] numbers;


    public Integer[] getNumbers() {
        return numbers;
    }

    public void setNumbers(Integer[] numbers) {
        this.numbers = numbers;
    }
}
profile
Backend Engineer(FastAPI, Spring, ...) / Prompt & Context Engineer / DevOps

0개의 댓글