> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/jpa-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/jpa-basic/4./1.md).

# 실전 예제 1 - 요구사항 분석과 기본 매핑

요구사항 분석

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

기능 목록

1. 회원 기능\
   회원 등록\
   회원 조회
2. 상품 기능\
   상품 등록\
   상품 수정

   상품 조회
3. 주문 기능\
   상품 주문\
   주문내역 조회

   주문 취소

예상 목업

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeYM7UsE8qxZSAntmoG%2F-MeYMU8Nb9ofFu4wNozj%2FScreen%20Shot%202021-07-14%20at%201.53.35%20PM.png?alt=media\&token=0e0876bc-bc9b-4658-ad55-302b46b62a62)

⭐️ 도메인 모델 분석

1. **회원 - 주문 관계**: **회원**은 **여러 번 주문**할 수 있다. (일대다)
2. **주문 - 상품 관계**: **주문**할때 **여러 상품 선택**할수있다.\
   반대로 같은 상품도 여러 번 주문될 수 있다.\
   \=>주문 - 상품 : 다대다 관계이기 때문에 중간에 주문상품이라는 모델을 만들어서 일다대, 다대일 관계로 풀어낸다!

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeYNTCvUG2F3tQuUKqG%2F-MeYNc8udMQOtRcLj8X4%2FScreen%20Shot%202021-07-14%20at%201.59.20%20PM.png?alt=media\&token=18fb221d-cdee-4ee3-b25f-39e83b5851d5)

**테이블 설계**

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MehUt8D8I_ZZcvBj0AE%2F-Meh_vLxq3aBR6IkUwi-%2F%E1%84%89%E1%85%B5%E1%86%AF%E1%84%8B%E1%85%A81%20%E1%84%90%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%87%E1%85%B3%E1%86%AF%20%E1%84%89%E1%85%A5%E1%86%AF%E1%84%80%E1%85%A8.png?alt=media\&token=46c74455-6b09-4679-8e69-aa8a750fcfe6)

**엔티티 설계와 매핑**

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MehUt8D8I_ZZcvBj0AE%2F-Meha0RzUCnpRrijpsbn%2F%E1%84%89%E1%85%B5%E1%86%AF%E1%84%8B%E1%85%A81%20%E1%84%8B%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B5%E1%84%90%E1%85%B5%20%E1%84%89%E1%85%A5%E1%86%AF%E1%84%80%E1%85%A8%E1%84%8B%E1%85%AA%20%E1%84%86%E1%85%A2%E1%84%91%E1%85%B5%E1%86%BC.png?alt=media\&token=1824903b-f752-4dd8-8235-5b5bdd5b6d18)

RDB 중심 설계의 문제점

테이블의 외래키를 객체에 그대로 가져옴\
\=>객체 그래프 탐색이 불가능 참조가 없으므로 UML도 잘못됨

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeYZh4UHUwKvlSvbHiS%2F-MeYc5WBACE5i0pKlxg7%2FScreen%20Shot%202021-07-14%20at%203.04.54%20PM.png?alt=media\&token=29ac32e2-b40e-4320-9a9e-74764c44f9ce)

* Naming 관례\
  Java : Camel ex) MemberRepository\
  DB : Underscore ex) MEMBER\_REPOSITORY\
  예전에는 대소문자 구분없었기 때문
* 필드에 칼럼 속성으로 length 지정해서 명시해주는 것이 좋다!\
  개발자가 객체, 필드만 보고도 제약사항을 알고 쿼리를 잘 작성할 수 있다!\
  ex) **@Column(length = 10) private String name;**\
  &#x20;  **@Entity(indexes = @Index(...)) : 사용할 인덱스를 정확하게 지정 가능** \
  **JPQL WHERE문 작성 시에 테이블 보면서 왔다갔다 하는 것보다 객체(테이블)보고 하는 것이 훨씬 직관적이기 때문이다.**
* JPA, Hibernate 순수하게 사용하면 필드이름이 그대로 사용된다.\
  실제 개발 시에 스프링 부트를 사용하는데 이 때 Hibernate 네이밍 관례를 오버라이딩해서 바꿀 수 있다.\
  \=>보통 DBA 분들이 원하는 것은 orderDate가 아니라 ORDER\_DATE (order-date)이다.\
  \=>스프링 부트로 JPA, Hibernate 사용하면 스프링 부트 기본설정으로 자바의 Camel 케이스를 대문자(소문자) 언더스코어 형식으로 바꾼다.
