728x90
반응형
요구사항 분석
- 회원은 상품을 주문할 수 있다.
- 주문 시 여러 종류의 상품을 선택할 수 있다.
도메인 모델 분석
- 회원 - 주문 관계 : 회원은 여러번 주문할 수 있다. (
1:N
) - 주문 - 상품 관계 : 주문할 때 여러 상품을 선택할 수 있다. 반대로 같은 상품도 여러번 주문될 수 있다. 따라서 주문과 상품 사이에 주문상픔이라는 모델을 만들어서 주문 - 상품 의
N:M
관계를 주문 - 주문상품 으로1:N
, 주문상품 - 상품 으로1:N
의 관계로 만들어 준다.
테이블 및 엔티티 설계


실습
Entity
- Member.java
@Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; private String city; private String street; private String zipcode; // getter, setter }
- Order.java
@Entity @Table(name = "ORDERS") public class Order { @Id @GeneratedValue @Column(name = "ORDER_ID") private Long id; @Column(name = "MEMBER_ID") private Long memberId; // 외래키를 그대로 필드로 사용하는 것이 아닌 Member 객체를 가져오도록 구현 필요 // 객체를 가져와 사용하도록 구현해야 객체 중심 설계 // Member member; // public Member getMember() { // return member; // } // public void setMember(Member member) { // this.member = member; // } private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; // getter, setter }
- OrderItem.java
@Entity public class OrderItem { @Id @GeneratedValue @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; // getter, setter }
- Item.java
@Entity public class Item { @Id @GeneratedValue @Column(name = "ITEM_ID") private Long id; private String name; private int price; private int stockQuantity; // getter, setter }
- OrderStatus.java
(enum)
public enum OrderStatus { ORDER, CANCEL; }
※ JPA 관례로 필드명 그대로 컬럼명이 생성되지만 스프링부트로 JPA 실행 시 Java의 낙타봉 표기를 소문자 언더스코어로 자동 변경되어 컬럼명이 생성된다.
Main
- JpaMain.java
public class JpaMain { public static void main( String[] args ) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { // 1. 테이블 설계에 맞춘 방식 // Order order = em.find(Order.class, 1L); // Member member = em.find(Member.class, order.getMemberId()); // 2. 객체 설계에 맞춘 방식 // Order order = em.find(Order.class, 1L); // Member findMember = order.getMember(): tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } }
DDL 동작 결과



데이터 중심 설계의 문제점
- 위 실습 방식은 객체 설계를 테이블 설계에 맞춘 방식 (ORDER 와 MEMBER 관계)
- 테이블의 외래키를 객체에 그대로 가져옴
- 객체 그래프 탐색 불가
- 참조가 없으므로 UML도 잘못됨
따라서 Order 객체 구성 시 memberId
를 필드로 선언하는 것이 아닌 Member 객체를 필드로 선언하여 해당 객체를 가져와 사용하는 방식으로 설계해야 한다.
728x90
반응형
'Dev > JPA' 카테고리의 다른 글
[JPA] 실습 - 연관관계 매핑 시작 (0) | 2021.08.18 |
---|---|
[JPA] 연관관계 매핑 기초 (0) | 2021.08.12 |
[JPA] 엔티티 매핑 (0) | 2021.08.02 |
[JPA] 영속성 관리 (0) | 2021.07.20 |
[JPA] JPA 시작하기 (0) | 2021.07.17 |
댓글