[인프런 워밍업 클럽 0기] BE 7일차 과제

[인프런 워밍업 클럽 0기] BE 7일차 과제

문제 1

과제 #6에서 만들었던 Fruit 기능들을 JPA를 이용하도록 변경해보세요!


문제2

우리는 특정 과일을 기준으로 지금까지 우리 가게를 거쳐갔던 과일 개수를 세고 싶습니다.
<문제 1>에서 만들었던 과일 Entity Class를 이용해 기능을 만들어 보세요!

예를 들어

  1. (1, 사과, 3000원, 판매 O)

  2. (2, 바나나, 4000원, 판매 X)

  3. (3, 사과, 3000원, 판매 O)

와 같은 세 데이터가 있고, 사과를 기준으로 과일 개수를 센다면, 우리의 API는 2를 반환할 것입니다.

구체적인 스펙은 다음과 같습니다.

  • HTTP method : GET

  • HTTP path : /api/v1/fruit/count

  • HTTP query

    • name : 과일 이름

  • 예시 GET /api/v1/fruit/count?name=사과

  • HTTP 응답 Body

{
    "count": long
}
  • HTTP 응답 Body 예시

{
    "count": 2
}

문제 3

우리는 아직 판매되지 않은 특정 금액 이상 혹은 특정 금액 이하의 과일 목록을 받아보고 싶습니다.
구체적인 스펙은 다음과 같습니다.

  • HTTP method : GET

  • HTTP path : /api/v1/fruit/list

  • HTTP query

    • option : "GTE" 혹은 "LTE"라는 문자열이 들어온다.

      • GTE : greater than equal의 의미

      • LTE : less than equal의 의미

    • price : 기준이 되는 금액이 들어온다.

  • 예시 1 - GET /api/v1/fruit/list?option=GTE&price=3000

    • 판매되지 않은 3000원 이상의 과일 목록을 반환해야 한다.

  • 예시 2 - GET /api/v1/fruit/list?option=LTE&price=5000

    • 판매되지 않은 5000원 이하의 과일 목록을 반환해야 한다.

  • HTTP 응답 Body

[{
    "name": String,
    "price": long,
    "warehousingDate": LocalDate,
}, ...]
  • HTTP 응답 Body 예시

[
    {
        "name": "사과",
        "price": 4000,
        "warehousingDate": "2024-01-05",
    },
    {
        "name": "바나나",
        "price": 6000,
        "warehousingDate": "2024-01-08",
    }
]

후기

워밍업 클럽이 마무리되고

과제들을 제출하는 시점에

하나가 비어있는 게 아쉬워서

실패의 이유를 회고해보고자 한다.

이전 발자국에서 이야기했던 것처럼

(https://www.inflearn.com/blogs/6974)

문제 1에서부터 막혔는데

    public TotalPriceResponse getTotalPrice(String name) {
        String tSql = "SELECT SUM(price) FROM fruit WHERE name = ? AND is_sold = true";
        String fSql = "SELECT SUM(price) FROM fruit WHERE name = ? AND is_sold = false";
        long salesAmount = jdbcTemplate.queryForObject(tSql, long.class, name);
        long notSalesAmount = jdbcTemplate.queryForObject(fSql, long.class, name);

        return new TotalPriceResponse(salesAmount, notSalesAmount);
    }

원인은 이 코드다.

JDBC에서는 일단 돌아가게는 만들었으나

JPA로 변경할 때

Layered Architecture에서 각각의 역할을 분리해야되는데

나머지 간단했던 코드에 비해 이색(?)적으로 구현했던 나의 코드는

어디에 얼만큼 나누어 배치해야되는지 감이 잡히지 않았다.

JDBC에서 일단 돌아가게는 만들어놓은 스파게티 코드를

하나하나 역할에 따라 분리하려니

이건 무슨 역할이고 어떻게 나눠야 되지?

어디에 배치해야 하는 거지?

Layered Architecture로 나누는 건 알겠는데

Response와 request가 영향을 미치는 범위는 어느 정도로?

같은 세부적인 코드레벨에서 기준을 잡기 어려워 명확한 코드가 안 나왔던 거 같다.

(사실 윗 코드는 그냥 두 개 불러올 때 고려해야하는 여러 가지 이해에 필요한 공수를 감당하기 버거웠던 듯)

 

뭐 일단 돌아가게 만든다면야 아예 새로 구성해서 두 개의 호출을 합치는 방법이라던가

(이건 처음 작성할 때의 목적에 어긋나는 거 같고..)

특정 스프링의 어노테이션을 알면 구현은 가능할 듯 했으나

그 정도를 이해하고 다루려면 너무 거대한 키워드들이라

당초의 목적인 백엔드 전반 체험에서는 너무 멀어지는 길이기도 하고

뭣도 모르는 초보자가 갈 길과 공수는 아닌 듯 했다.

(갖다 써서 해결은 학습의 목적은 아니니... 그렇다고 스프링을 다 알 수도 없잖아...)

 

강의를 듣고 JDBC Hibernate JPA등의 여러 추상화 단계를 거쳐 객체로써 다룰 수 있다는 건 알겠는데

세부적인 사항까지 파악하여 과제를 하기엔

프론트 개발을 하던 나에겐 너무 멀리 가는 방향이어서 멈칫하게 되기도 했다.

 

그리하여 개선을 하는 문제 1부터 막혀

진행해보다가 실패하게 되었고

무엇을 해야하는지는 보였으나

"일단 동작"이 아닌 학습의 목적인 "동작 원리 이해"로 접근하기엔 능력 미달이었다.

 

그래서 뭐 결론적으론 과제는 미해결 상태로 남게 되었다.

 

Nextjs에도 쿼리 파라미터가 있는데

비즈니스 도메인에 따라 어디서 어떻게 처리하는 게 좋은지가 갈리는 건가

여러 생각해볼 거리도 생긴 듯 하다.

(이건 인프라인가 백엔드인가 프론트인가)

댓글을 작성해보세요.

채널톡 아이콘