[프로그래머스 데브코스] TIL - 7주차 Day1

방울·2024년 5월 20일
0

API 설계

API 설계에서 중요한 점은 각 엔드포인트가 명확하게 정의되고, 각 기능에 필요한 데이터가 적절하게 반영되는 것이다.

요구사항 분석 및 리소스 식별

  • 좋아요: 사용자가 도서에 좋아요를 추가하거나 취소할 수 있어야 한다.bookId
  • 장바구니: 사용자가 도서를 장바구니에 담고, 장바구니를 조회하거나 도서를 삭제할 수 있어야 한다. cartItemId, bookId, count
  • 주문: 사용자가 장바구니에 담은 도서를 주문할 수 있어야 한다. orderId, items, delivery
  • 결제: 사용자가 주문을 확정하고 결제할 수 있어야 한다. totalPrice, deliveryDetails

엔드포인트 설계

좋아요 API

  1. 좋아요 추가
  • Method: PUT
  • URI: /likes/(bookId)
  • 설명: 특정 도서에 대해 좋아요를 추가
  1. 좋아요 취소
  • Method: DELETE
  • URI: /likes/(bookId)
  • 설명: 특정 도서에 대해 좋아요를 취소

장바구니 API

  1. 장바구니 담기
    Method: POST
    URI: /cart
    설명: 도서를 장바구니에 추가
    Request Body: { bookId: "도서 id", count: "수량" }

  2. 장바구니 조회
    Method: GET
    URI: /cart
    설명: 장바구니에 담긴 도서 목록을 조회

  3. 장바구니 삭제
    Method: DELETE
    URI: /cart/(bookId)
    설명: 장바구니에서 특정 도서를 삭제

주문 API

  1. 주문 예상 상품 목록 조회
    Method: GET
    URI: /cart
    설명: 선택된 장바구니 항목의 주문 예상 목록을 조회
    Request Body: [cartItemId, cartItemId, …]

  2. 주문 목록(내역) 조회
    Method: GET
    URI: /orders
    설명: 사용자의 주문 내역을 조회

  3. 주문 상세 상품 조회
    Method: GET
    URI: /orders/{orderId}
    설명: 특정 주문의 상세 내역을 조회

데이터 모델링

  • 중복을 최소화하고, 관계형 데이터베이스의 장점을 살리기 위해 테이블 간의 관계를 정의한다. 이는 데이터 무결성을 유지하고, 효율적인 데이터 관리를 가능하게 한다.

Books (도서 정보 저장)

CREATE TABLE books (
    book_id SERIAL PRIMARY KEY,
    title VARCHAR(255),
    summary TEXT,
    author VARCHAR(255),
    price DECIMAL(10, 2)
);

Likes (사용자가 좋아요 표시한 도서 정보 저장)

CREATE TABLE likes (
    like_id SERIAL PRIMARY KEY,
    user_id INTEGER,
    book_id INTEGER REFERENCES books(book_id),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Carts (사용자 장바구니 정보 저장)

CREATE TABLE carts (
    cart_id SERIAL PRIMARY KEY,
    user_id INTEGER,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CartItems (장바구니에 담긴 각 도서 정보 저장)

CREATE TABLE cart_items (
    cart_item_id SERIAL PRIMARY KEY,
    cart_id INTEGER REFERENCES carts(cart_id),
    book_id INTEGER REFERENCES books(book_id),
    count INTEGER
);

Orders (주문 정보 저장)

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    user_id INTEGER,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    address VARCHAR(255),
    receiver VARCHAR(50),
    contact VARCHAR(20),
    total_price DECIMAL(10, 2)
);

OrderItems (주문에 포함된 각 도서 정보 저장)

CREATE TABLE order_items (
    order_item_id SERIAL PRIMARY KEY,
    order_id INTEGER REFERENCES orders(order_id),
    book_id INTEGER REFERENCES books(book_id),
    count INTEGER,
    price DECIMAL(10, 2)
);

결제 API 추가

장바구니 기능 설계하는 과정에서 결제가 필요하다는 요구사항 발생! 이를 추가해준다.

결제하기 (주문 등록)

  • Method: POST
  • URI: /orders
  • 설명: 장바구니에 담긴 도서를 주문하고 결제한다. 주문이 완료되면 해당 장바구니 항목은 삭제된다.
  • Request Body:
    {
        "items": [
            {
                "cartItemId": "장바구니 도서 id",
                "bookId": "도서 id",
                "count": "수량"
            },
            {
                "cartItemId": "장바구니 도서 id",
                "bookId": "도서 id",
                "count": "수량"
            }
        ],
        "delivery": {
            "address": "주소",
            "receiver": "이름",
            "contact": "010-0000-0000"
        },
        "totalPrice": "총 금액"
    }

현업에서는 API 설계가 매우 중요할 것이고, 데이터베이스 스키마 역시 효율적이고 확장 가능한 설계가 중요할 것이다. 설계가 튼튼하다면 시스템의 안정성과 유지 보수성을 높일 수 있다. 이러한 설계 과정은 개발 초기 단계에 충분히 검토하고 논의해야 할 것이다. 혼자 해결할 수 있는 문제라기 보다 팀원들의 피드백도 반영하여 최대한 개선해 나가는 방향이 옳을 것이다. 현업에서는 한 달 가까이 걸쳐 정하는 부분이라는 강사님의 말씀에 충분히 그럴 수 있단 생각을 했다...

profile
방울방울

0개의 댓글