본문 바로가기
Spring Boot (프로젝트)

[쇼핑몰 프로젝트] 3. ERD 기획

by Hoozy 2023. 11. 6.
  • 쇼핑몰 프로젝트에서는 Spring Data JPA를 사용하기 때문에 ORM, JPA에 대한 개념과 활용법을 먼저 공부해야 한다.

ORM (Object Relational Mapping)

  • 애플리케이션의 class 파일과 RDB(관계형 DB)의 테이블을 매핑한다는 뜻이며, 기술적으로는 애플리케이션의 객체를 RDB 테이블에 자동적으로 영속화 해주는 것이다.
  • 장점
    1. SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있다.
    2. Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높인다.
    3. 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기 때문에 생산성 증가
    4. 매핑하는 정보가 class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고, DB가 바뀌어도 SQL문을 일일이 고치지 않아도 되어서 유지보수 및 리팩토링에 유리하다.
  • 단점
    1. 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있다.
    2. 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 native Query 문을 써야할 수도 있다.
    3. 학습비용이 비싸다.

JPA (Java Persistence API)

  • Java 진영에서 ORM 기술 표준으로 사용하는 인터페이스 모음이다.
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
  • 인터페이스이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현한다.
  • JPA는 반복적인 CRUD SQL을 간편하게 처리해준다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 SQL이 실행될지 생각만하면 되어서 예측도 쉽게 할 수 있다.
  • 또한, JPA는 native SQL이란 기능을 제공해주는데, 이는 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성하여 사용할 수 있다.
  • 자바 객체간의 상속 관계를 JPA에서는 객체 연관관계를 테이블 연관관계로 바꿔주어 객체 중심으로 개발을 가능하게 해준다. 이에 따라 생산성이 좋아져 유지보수도 수월해지는 장점이 있다.

ERD 기획

  • ERD (Entity Relationship Diagram)
    • 개체-관계 모델로, 테이블간의 관계를 설명해주는 다이어그램이라고 볼 수 있고, 이를 통해 프로젝트에서 사용되는 DB의 구조를 한눈에 파악할 수 있다.
  • Entity
    • 테이블을 구성하는 객체 구성 성분이다.
    • 예를 들어, User(유저)의 엔티티는 이름, 아이디, 비밀번호, 이메일 등의 Attributes(속성)들로 구성된 Entity이다.
  • 객체 관계
    1. One to One
      • 1 대 1 관계로, 객체 간의 관계가 객체 한개당 객체 한개씩 매핑된다는 뜻이다.
    2. One to Many
      • 1 대 다 관계로, 객체 한개당 다른 객체 여러개와 매핑된다는 뜻이다.
    3. Many to Many
      • 다 대 다 관계로, 객체 여러개와 다른 객체 여러개가 매핑된다는 뜻이다.
  • 식별 관계
    • 식별 관계는 서로의 관계를 맺을 때 외래키가 PK가 되는 관계로, 외래키가 유일해야 하는 관계이다.

쇼핑몰 ERD

  • 회원
    • 회원은 이메일과 비밀번호를 무조건 가져야 한다.
    • 보통 웹 사이트라면 회원과 권한이 다 대 다 관계로 중간 테이블을 mapper로 만들어 관리하는게 보통이지만, 쇼핑몰 프로젝트는 회원당 권한이 하나만 가질 수 있게 기획해서 권한을 회원 테이블에 넣었다.
    • 회원은 test 계정이 아니면 쿠폰을 하루에 3개만 쓸 수 있다. (매일 00시 3개로 초기화)
  • 상품
    • 상품당 이미지는 고유하기 때문에 식별 관계로 설정했다.
    • 상품은 하나의 이미지와 카테고리가 있어야 한다.
    • 상품은 재고가 0이되면 구매를 못하도록 설정했다. (default 값으로는 30개로 했다.)
  • 장바구니
    • 장바구니는 회원만 가질수 있고, 장바구니에는 상품이 한개 씩 들어가며 상품 한가지를 여러개 넣을 수 있다.
    • 장바구니 내에 있는 여러가지 상품을 결제하면 하나하나씩 결제내역에 들어간다.
  • 상품이미지
    • 상품당 고유한 이미지 링크 테이블이다.
  • 결제내역
    • 결제내역은 회원이 상품을 산 내역 테이블이다.
    • 회원과 상품은 다 대 다 관계로 중간에 mapper 테이블인 결제내역을 만들었지만, 중간테이블에 중요한 정보를 담아야해서 결제아이디는 결제내역을 조회하는 역할일뿐 중요한 정보는 담지 않았다.
  • 카테고리
    • 상품의 제일 작은(세세한) 카테고리 테이블이다.
  • 취소여부
    • 결제의 취소여부를 나타내기 위해 설정한 테이블이다.
  • 새로운 토큰
    • 회원이 로그인하고 액세스 토큰이 만료되었을 때 새로운 토큰을 가지고 액세스 토큰과 새로운 토큰을 다시 발급받기 위한 토큰 테이블이다.
    • 가져올 때에는 Security 의 Authentication에 있는 회원의 id로 찾아온다.
    • 새로운 토큰의 만료시간이 초과하면 새로운 토큰도 만료되어 로그인을 새로해야 한다.

참고 자료

https://dbjh.tistory.com/77

댓글