[인프런워밍업스터디_BE_0기] 두 번째 과제!
스터디의 두 번째 과제! 퇴근 후 과제를 보면서 어렵지 않은 문제라고 생각되었다. 하지만 이왕 스터디에 뛰어든만큼 다양한 시도를 해보고 싶었던 나는 어떤 형식과 구조로 구현할지 고민하면서 구현한 이후에도 계속 수정을 반복하다보니.. 시간이 부족하다!! 흑... 어쩔 수 없지만 간략히 왜 이런 구조로 구현했는지와 결과코드만 우선 작성하고 시간이 있을 때 글을 좀 더 다듬어야겠다...
각 문제마다 따로 구현할 수도 있지만 이왕이면 공통점을 찾아서 하나의 클래스로 만들어보고 싶으니 요구사항 모두 인수를 받아 "계산"하는 로직을 포함하고 있으니 Calculator로 묶어보자!
그리고 1번과 3번은 정수를 계산하여 결과를 반환하고 2번은 날짜를 계산하여 결과를 반환하니 각각 NumberCalculator와 DateCalculator로 클래스를 만들고, 문제 해결에 필요한 메서드를 구현한 다음, 요청 클래스와 반환 클래스도 구현해서... 다음과 같이 코드를 작성했다!
[1번 문제의 요청 클래스]
public class TwoNumberCalcRequest {
private Integer num1;
private Integer num2;
public TwoNumberCalcRequest(Integer num1, Integer num2) {
this.num1 = num1;
this.num2 = num2;
}
public Integer getNum1() {
return num1;
}
public Integer getNum2() {
return num2;
}
}
[2번 문제의 요청 클래스]
public class DateCalcRequest {
private String date;
public DateCalcRequest(String date) {
this.date = date;
}
public String getDate() {
return date;
}
}
[3번 문제의 요청 클래스]
public class AllNumberCalcRequest {
private List<Integer> numbers;
public List<Integer> getNumbers() {
return numbers;
}
}
[1번 문제의 응답 클래스]
public class NumberCalcResponse {
private Integer add;
private Integer minus;
private Integer multiply;
public NumberCalcResponse(Integer add, Integer minus, Integer multiply) {
this.add = add;
this.minus = minus;
this.multiply = multiply;
}
public Integer getAdd() {
return add;
}
public Integer getMinus() {
return minus;
}
public Integer getMultiply() {
return multiply;
}
}
[2번 문제의 응답 클래스]
public class DateCalcResponse {
private String dayOfTheWeek;
public DateCalcResponse(String dayOfTheWeek) {
this.dayOfTheWeek = dayOfTheWeek;
}
public String getDayOfTheWeek() {
return dayOfTheWeek;
}
}
[컨트롤러 클래스]
@RestController
public class CalculatorController {
private final NumberCalculator numCalc = new NumberCalculator();
private final DateCalculator dateCalc = new DateCalculator();
@GetMapping("/api/v1/calc")
public NumberCalcResponse calcTwoNumbers(TwoNumberCalcRequest request) {
return new NumberCalcResponse(
numCalc.add(request),
numCalc.minus(request),
numCalc.multiply(request)
);
}
@GetMapping("/api/v1/day-calc")
public DateCalcResponse calcDayOfTheWeek(DateCalcRequest request) {
return new DateCalcResponse(dateCalc.dayOfTheWeek(request));
}
@PostMapping("/api/v1/calc")
public Integer addAllNumbers(@RequestBody AllNumberCalcRequest request) {
return numCalc.addAll(request);
}
}
[숫자 계산 클래스]
public class NumberCalculator {
public Integer add(TwoNumberCalcRequest request) {
return request.getNum1() + request.getNum2();
}
public Integer minus(TwoNumberCalcRequest request) {
return request.getNum1() - request.getNum2();
}
public Integer multiply(TwoNumberCalcRequest request) {
return request.getNum1() * request.getNum2();
}
public Integer addAll(AllNumberCalcRequest request) {
return request.getNumbers()
.stream()
.mapToInt(Integer::intValue)
.sum();
}
}
[날짜 계산 클래스]
public class DateCalculator {
public String dayOfTheWeek(DateCalcRequest request) {
return LocalDate.parse(request.getDate()).getDayOfWeek()
.getDisplayName(TextStyle.SHORT, Locale.US)
.toUpperCase();
}
}
자! 이제 Postman을 통해 결과를 확인해보자!
[문제 1]
두 수를 입력하면, 다음과 같은 결과가 나오는
GET
API를 만들어 보자!조건 1. path는
/api/v1/calc
이다.조건 2. 쿼리 파라미터는
num1
,num2
이다.
결과 예시
{
"add": 덧셈결과,
"minus": 뺄셈결과,
"multiply": 곱셈결과
}
실제 결과
요청
결과
[문제 2]
날짜를 입력하면, 몇 요일인지 알려주는
GET
API를 만들어 보자!path와 쿼리 파라미터는 임의로 만들어도 상관없다.
결과 예시
{
"dayOfTheWeek": "MON"
}
실제 결과
요청
결과
[문제 3]
여러 수를 받아 총 합을 반환하는
POST
API를 만들어 보자!API에서 받는 Body는 다음과 같은 형태이다.
Body
{
"numbers": [1, 2, 3, 4, 5]
}
결과 예시
15
실제 결과
요청
결과
댓글을 작성해보세요.