JPA 엔티티 매핑 - 요구사항 분석과 기본 매핑 (실전 예제)

2022. 7. 1. 18:57·공부/JPA
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

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 생략
}
반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • JPA 연관관계 매핑 - 양방향 연관관계와 연관관계의 주인
  • JPA 연관관계 매핑 - 단방향 연관관계
  • JPA 엔티티 매핑 - 기본 키 매핑
  • JPA 엔티티 매핑 - 필드와 컬럼 매핑
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인프런
    프로그래머스
    Java
    react
    토이프로젝트
    넥사크로
    자바스크립트
    전자정부프레임워크
    SQL
    JPA
    개발자
    기출문제
    Spring
    백준
    운영체제
    MSA
    프론트엔드
    RESTful
    springboot
    알고리즘
    토비의스프링부트
    QueryDSL
    에러해결
    IT
    방통대
    스프링부트
    egov
    oracle
    SpringBoot를 이용한 RESTful Web Service 개발
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
JPA 엔티티 매핑 - 요구사항 분석과 기본 매핑 (실전 예제)
상단으로

티스토리툴바