반응형
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.
요구사항 분석과 기본 매핑
요구사항 분석
- 회원은 상품을 주문할 수 있다.
- 주문 시 여러 종류의 상품을 선택할 수 있다.
도메인 모델 분석
- 회원 - 주문 : 회원은 여러 번 주문할 수 있다 - 일대다
- 주문 - 상품 : 주문할 때 여러 상품을 선택할 수 있고, 같은 상품도 여러 번 주문될 수 있다. 주문 상품이라는 모델을 만들어서 다대다 관계를 일대다, 다대일 관계로 만든다.
테이블 설계
엔티티 설계
엔티티 클래스 생성(실습)
Member
@Entity
public class Member {
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(length = 10) // 이런 걸 명시해두면 개발자가 굳이 DB를 뒤져보지 않아도 제약조건을 알 수 있다.
private String name;
private String city;
private String street;
private String zipcode;
... getter/setter 생략
}
Order
@Entity
@Table(name="ORDERS")
public class Order {
@Id @GeneratedValue
@Column(name="ORDER_ID")
private Long id;
@Column(name="MEMBER_ID")
private Long memberId;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status; // ORDER, CANCEL
...getter/setter 생략
}
Order의 경우에 주문한 회원 객체를 가져오려면 실행 클래스에서 Order의 객체를 찾고 Order에 들어있는 memberId를 getter로 가져와서 그 값으로 다시 Member 객체를 em.find()해서 가져와야 되는 이상한 로직을 짜게 된다. 이런 경우가 객체지향스럽지 않은 코드이며, 관계형 DB에 맞춘 코드라한다. 좀 더 객체지향스러운 코드는 다음과 같이 수정해야한다.
@Column(name="MEMBER_ID")
private Long memberId; // 이런 설계는 객체지향스럽지 않고 관계형 DB스러운..
private Member member; // 이게 더 객체지향스러운 코드이다.
public Member getMember() {
return member;
}
이렇게 작성하면 실행 클래스에서 주문한 멤버의 객체를 찾아야할 때 단 한 줄이면 회원 객체를 찾을 수 있다.
Member member = order.getMember();
Item
@Entity
public class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
...getter/setter 생략
}
OrderItem
@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 생략
}
반응형