본문 바로가기

개발/프로그래머스 데브코스

프로그래머스 데브코스 31일차 with. TS 웹 풀스택

📚요약

지난 시간에는 쉬는 시간 아닌 쉬는 시간을 가졌습니다. 이번 시간에는 프로젝트의 API 설계와 ERD를 병행해서 진행하겠습니다.

 

📖프로젝트 API 설계 & ERD

API의 경우 성공할 경우만 생각하고, ERD와 연계해서 설계한 과정을 간단한 예시와 함께 설명하고 의문도 적어보겠습니다.

🍯tip! API를 설계할 때 실패를 먼저 고려할 필요가 없다. 왜냐하면 우리가 원하는 결과는 성공했을 경우를 먼저 가정하기 때문이다.
  1. 첫 번째는 페이지를 보며 '서버에서 보내줘야 할 데이터는 있는가?', '사용자가 버튼을 눌렀을 때 서버에 요청할 부분이 있는가?'를 고민합니다. 고민은 항상 적어가며 진행합니다.
    예를 들어, 로그인 페이지를 보면 아이디와 비밀번호를 적고 로그인 버튼을 누르게 됩니다. 이때 서버에 로그인 요청을 하게 됩니다. 이런 것들이 모여 API 문서가 됩니다.

  2. 고민을 했다면 여러 고민들을 공통으로 묶을 수 있는 카테고리를 만듭니다.
    예를 들어, 이전 미니 프로젝트(도서관 관리)를 보면 크게 사서으로 묶여있습니다.

  3. 카테고리로 묶었다면 API에 필요한 것들을 하나하나 채워봅니다.
    예를 들어, HTTP Method(GET, POST, PUT 등), URI(/books, /login 등), HTTP Status Code(200, 404 등), Request, Response가 있습니다.

  4. 3번까지 진행하면서 이상이 없다면 좋겠지만 경험이 없다면 어려운 부분이 생길 수 있습니다. 그런 경우 API 설계를 잠깐 멈추고 ERD를 먼저 고민한다면 해결이 될 수 있습니다.
 🍯tip! API는 한 번 설계할 때 완벽하면 너무 좋습니다. 하지만 계속 변경될 수 있다는 점을 항상 잊으면 안 됩니다. 수정을 한다고 생각하고 편하게 진행하는 게 제일 좋습니다.

 

ERD는 모르겠으면 우선 한 테이블에 데이터를 다 넣습니다. 그런 다음 중복이 많아 보이는 부분을 찾아서 테이블을 분리해 주면 됩니다. 그래도 어려운 경우들이 있으니 같이 고민해 보겠습니다.

❔▪❓

고민에 대한 답은 한 가지가 아닌 경우가 있기 때문에 참고만 하고 그때그때 더 생각해 보는 것이 중요합니다.

 

Q. 게시글의 좋아요 또는 개인 팔로우는 어떻게 해결하는 게 좋을까요?

A1. 새로운 테이블을 만든다.

table_follows
following_user_id followed_user_id
table_likes
post_id like_user_id

위와 같은 테이블을 통해 따로 저장하고 SQL문으로 필요한 값을 가져올 수 있습니다.

 

Q. 프론트의 Request(요청)에 배열이 있는데 데이터베이스에는 어떻게 저장될까요?

A1. 예를 들어, user가 여러 post를 가지고 있는 경우

user_id posts
1 [1,2,3,...]

이처럼 가지고 있지 않습니다.

user_id post_id
1 1
1 2
1 ...

이와 같이 가지고 있습니다. 그렇기 때문에 API를 설계하면서 만약 프론트에서 배열이 넘어온다고 배열로 저장된다고 생각해서는 안됩니다.

 

Q. 중복된 정보 즉, 다른 테이블에서 SQL을 통해 충분히 가져올 수 있는 경우에 편리성을 위해서 얼마나 허용해도 괜찮은가?

예를 들어, 쇼핑을 하고 주문을 하려고 합니다. 이 경우 주문 테이블에는 물품의 id와 수량이 들어갈 수 있습니다.

orders
id item_id count
1 1 2

그리고 해당 물품의 테이블이 따로 있습니다.

items
id price desc
1 100 블라블라

위와 같은 경우 orders 테이블에 total_price라는 컬럼이 있다면 데이터를 조회하고 전달하는 편에서는 편할 것입니다. 하지만 item_id를 통해 price 정보를 가져오고 count와 같이 이용하면 total_price는 없어도 충분히 구할 수 있는 데이터입니다. 이런 상황에서 어떻게 하는 게 좋은 건지 고민입니다.

🍯tip! 개발자들에게 적응하면 편리한 ERD 툴 dbdiagram.io

 

다음 시간에 계속...

 

출처 & 참고

김송아 강사님의 강의