병아리의 코딩 일기

[JPA] 이젠 실전이다! 요구사항 분석과 기본 매핑 본문

카테고리 없음

[JPA] 이젠 실전이다! 요구사항 분석과 기본 매핑

oilater 2023. 2. 18. 12:44

이번 시간엔 지금까지 배운 매핑을 바탕으로 조금 더 복잡한 예제를 만들어보자. 간단한 쇼핑몰 예제다.

 


요구사항 분석 

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

기능 목록

 

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

Member Entity

@Entity
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String city;
    private String street;
    private String zipcode;

    //getter, setter 예제니까 다 만들자. setter는 고민할 필요 있음.
Id 는 내가 지정하는 것이 아니라 DB에서 자동생성되게 하기 위해서 @GeneratedValue 의 Strategy를 사용하였다.
AUTO가 기본이며, @GeneratedValue 뒤에 아무것도 입력하지 않으면 저절로 AUTO로 설정된다.

 

 

 

Order Class

@Entity
@Table(name = "ORDERS") //db에서는 order by 와 같이 order가 예약어로 걸려있기 때문에 안되는 DB도 있음. 그래서 orders로 많이 쓴다.
public class Order {

    @Id @GeneratedValue
    private Long id;

    private Long memberId; // 누가 주문했는지 알아야 하니까!

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

}

여기서 중요한 것은 Enum 타입에는 @Enumerated(EnumType.STRING) 어노테이션을 달아주는 것!

EnumType.ORDINAL 를 사용하지 않도록 주의하자. 나중에 큰 문제로 이어질 수 있다.

무조건 EnumType.STRING 으로 사용하기!

 

 

 

데이터 중심 설계의 문제점

 
Order order = em.find(Order.class, 1L);
Long memberId = order.getMemberId();
  • 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식
  • 테이블의 외래키를 객체에 그대로 가져옴
  • 객체 그래프 탐색이 불가능
  • 참조가 없으므로 UML도 잘못됨 (Id만 가지고 있기에 참조가 다 끊김)

 


 

 

다음 시간엔 연관관계 매핑에 대해서 배워보자.

Order에서 Member를 어떻게 할거냐? 

Id 만 가지는 게 아니라 진짜 Membrer 를 가지게 됨!

진짜 객체 지향 설계다!

 

728x90
반응형
LIST