오봉이와 함께하는 개발 블로그

JPA - 실전 예제 1 - 요구사항 분석과 기본 매핑 본문

BE/JPA

JPA - 실전 예제 1 - 요구사항 분석과 기본 매핑

오봉봉이 2022. 6. 24. 20:09
728x90

요구사항 분석과 기본 매핑

회원은 상품을 주문할 수 있으며, 주문 시 여러 종류의 상품을 선택할 수 있다.

기능 목록

  • 회원
    • 회원 가입
    • 회원 조회
  • 상품
    • 상품 등록
    • 상품 수정
    • 상품 조회
  • 주문
    • 상품 주문
    • 주문 내역 조회
    • 주문 취소

도메인 모델 분석

  • 회원과 주문의 관계 : 회원은 여러 번 주문할 수 있다.
  • 주문과 상품의 관계 : 주문할 때 여러 상품을 선택할 수 있다. 반대로 같은 상품도 여러 번 주문될 수있으며, 주문상품이라는 모델을 만들어서 다대가 관계를 일다대, 다대일 관계로 풀어냄

테이블 설계

엔티티 설계와 매핑

코드

Member

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MEMBER_ID")
    private Long id;

    private String name;
    private String city;
    private String street;
    private String zipcode;
}

Order

@Entity
@Table(name = "ORDERS") // order 예약어 때문
@Getter
@Setter
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ORDER_ID")
    private Long id;

    @Column(name = "MEMBER_ID")
    private Long memberId;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;
}

Item

@Entity
@Getter
@Setter
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ITEM_ID")
    private Long id;

    private String name;
    private int price;
    private int stockQuantity;
}

OrderItem

@Entity
public class OrderItem {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ORDER_ITEM_ID")
    private Long id;

    @Column(name = "ORDER_ID")
    private Long orderId;

    @Column(name = "ITEM_ID")
    private Long itemId;

    private int orderPrice;
    private int count;
}

데이터 중심 설계의 문제점

Order order = em.find(Order.class, 1L);
Long memberId = order.getMemberId();
Member member = em.find(Member.class, memberId);

주문에서 멤버를 찾기 위해서는 위와 같은 방법으로 찾아야 한다.
현재 방식은 테이블의 외래키를 객체에 그대로 가져와 객체 설계를 테이블 설계에 맞춘 방식이다.
객체 그래프 탐색이 불가능하고, 참조가 없으므로 UML도 잘못됐다.
객체지향스럽지 못한 설계 방식이다.

좀 더 객체지향적인 방법으로는 아래와 같이 구현할 수 있겠다.

Order order = em.find(Order.class, 1L);
Member findMember = order.getMember();
@Entity
@Table(name = "ORDERS")
@Getter
@Setter
public class Order {
//...
    private Member member;
//...
}
출처 : 인프런 김영한 지식공유자님의 스프링 부트와 JPA 실무 완전 정복 로드맵 강의
728x90
Comments