
- 요구사항 분석 -
- 회원은 상품을 주문할수있다.
- 주문 시 여러 종류의 상품을 선택 할 수있다.

- 기능 목록 -
- 회원 기능(회원 등록, 회원 조회)
- 상품 기능(상품 등록, 상품 수정, 상품 조회)
- 주문 기능(상품 주문, 주문내역 조회, 주문 취소)

- 도메인 모델 분석 -
- 회원과 주문의 관계: 회원은 여러번 주문 할 수있다(일대다)
- 상품과 주문의 관계: 주문할 때 여러 상품을 선택할 수 있다.
반대로 같은 상품도 여러번 주문할 수 있다. 주문 상품이라는 모델을 만들어서 다대다 관계를 일대다, 다대일 관계로 풀어냄

- 데이터 중심 설계의 문제점 -
- 위에 방식은 객체 설계를 테이블 설계의 맞춘 방식
- 테이블의 외래키를 객체에 그대로 가져옴
- 객체 그래프 탐색이 불가능
- 참조가 없으므로 UML도 잘못됨
코드로 알아보는 예)
public static void main(String[] args){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//정석 코드
try {
//order 로 아이디 검색을 통해
Order order = em.find(Order.class, 1L);
//검색을 통해 얻은 MemberId를 담아
Long memberId = order.getMemberId();
//다시 또 member 조회해
Member member = em.find(Member.class, memberId);
//또 그값을 다시 객체에 담아야 하는 굉장히 불편한 작업을 해야한다.
Member findMember = order.getMember();
완벽한 개선은 아니겠지만 현재 강의에서 확인할수있는 그나마의 개선법은
@Entity
@Table(name = "ORDERS")
public class Order { //DB는 ORDER이 예약어로 되어있는게 있어서 원랜 orders로 만이씀
@Id @GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
private Member member; //이렇게 하는게 좀더 객체 지향적이라고 할수 있음 이건바로 참조해서 멤버아이디를 넣어 멤버에있는 필드를 사용할수있다.
public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
위 코드 처럼 직접 Member 객체를 Order 클래스에 넣어 바로 참조해 사용할 수 있게하는 것 이 더 객체지향적이다.
강의를 보며 더 나은 방법이 있다고 하는데 좀 더 고려해서 차이를 알아보고 나중에 추가로 포스팅을 해야겠다.
'Java > JPA' 카테고리의 다른 글
| QueryDSL에서 서브쿼리에 limit이 안 먹는 이유 (2) | 2025.04.25 |
|---|