도메인 분석 설계
(0) 실제 화면
회원 기능
- 회원가입
- 회원목록
상품 기능
- 상품 등록
- 상품 목록
주문 기능
- 상품 주문
- 주문내역
(1) 실제 동작하는 화면을 먼저 확인 한 뒤에 기능 목록을 추출한다.
기능목록
- 회원 기능
- 회원 등록
- 회원 조회 - 상품 기능
- 상품 등록
- 삼품 수정
- 상품 조회 - 주문 기능
- 상품 주문
- 주문 내역 조회
- 주문 취소 - 기타 요구 사항
- 상품(Item)은 재고 관리가 필요하다.
- 상품의 종류는 Book, Album, Movie 가 있다.
- 상품을 카테고리로 구분할 수 있다.
- 상품 주문시 배송 정보를 입력할 수 있다.
(2) 도메인 모델과 테이블 설계
(출처: 실전! 스프링부트와 활용1 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard)
(3) 연관관계 매핑 분석
연관관계의 주인을 정하고, 외래키를 어떻게 매핑할 것인지, 단방향인지 양방향인지 설정한다. !!
참고로 외래키가 있는 곳을 연관관계 주인으로 정하는 것이 좋다고 한다 !! ORDERS 테이블을 참고하자
(4) 엔티티 클래스 개발
JPA를 배울 때 정리한 엔티티 클래스 개발과 같다. 처음부터 끝까지 스스로 만들어 보면서 유의해야 할 사항들을 정리해 보았다.
- 관계를 맺을 때
ex)
@OneToMany(mapped = "참조하는 엔티티(객체) 속성명")
@ManyToOne
@JoinColumn(name = "참조하는 객체의 속성을 어떤 이름으로 끌어올 것인가 지정")
=> @OneToMany는 양방향 매핑시 주로 사용되고 속성명이므로 order, orders, orderItem 등이 예시가 된다.
=> JoinColoumn은 첫 연관관계 매핑할때 사용되는 어노테이션이다.
ex) member_Id를 외부키로 가져와서 속성명을 지정해주는 것처럼 name을 지정해주면 된다. - @Enumerated(EnumType.STRING)
=> EnumType.STRING 으로 표기하는것 까먹지 않기 !! - @Getter와 @Setter가 있다고 안일하지 않기.
양방향 매핑되어 있을 때는 Setter를 잘 생각하고 구현해야됨. 양방향이라고 한쪽에서 데이터를 채우면 반대편에서 자동으로 데이터가 채워지는게 아니기 때문. setter를 구현해서 한쪽에서 데이터를 넣으면 반대편에도 넣어지도록 구현하는 게 좋음. 한 쪽을 선정하는 기준은 관계의 주인이 되는 쪽을 하는 게 좋다.
예를들어 Order에 보면 Order가 Member, Delivery, OrderItem의 관계에 있어서 중심이기 때문에 set으로 설정할 때 다른 객체의 리스트안에도 데이터를 넣어주도록 설정해주는 게 좋음..
꼭 한 쪽에서만 설정해야 하므로 중복설정 안하도록 주의 !! (무한이 담길 수 있음) - Order의 Table명은 "orders"로 바꿔줘야한다.
데이터베이스가 order by를 예약어로 잡고 있는 경우가 많기 때문이다. 에러난다. - 상속 엔티티라고 @Entity 빼먹지 말기
+ @Inheritance 의 전략과 @DiscriminatorColumn, @DiscriminatorValue
ex)
@Entity
public class Item - cascase설정 해주기 **
- 같은 클래스 안에서 부모 객체와 자식객체의 매핑
@JoinColumn(name = "parent_id")
private Category parent;
에서 @JoinColumn의 name 속성이 연관관계 테이블의 속성을 참조하는 속성이 아니라, (착각 ㄴㄴ)
관계하여 참조한 속성을 현재 테이블에 어떤 이름의 속성으로 저장할 것인가에 대한 속성이다 !!
@JoinColumn에는 referencedColumnName 이라는 속성이 있는데요. 이 속성이 바로 관계한 테이블의 어떤 속성을 매핑할 것인지 나태내어 주는 어노테이션 속성이다.
이게 바로 비밀의 키 입니다. 여기에 아무 값도 지정하지 않으면 대상 테이블의 PK를 지정합니다.
따라서 parent_id는 FK가 되서 속성으로 들어오고, 이 FK가 가리키는 곳이 Category parent의 PK인 category_id가 되는 것이다. (출처 질문 답변해주신 김영한 개발자님) - Embeded 타입
> 참고: 값 타입은 변경 불가능하게 설계해야 한다.
> @Setter 를 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스를 만들자. JPA 스펙상 엔티
티나 임베디드 타입( @Embeddable )은 자바 기본 생성자(default constructor)를 public 또는
protected 로 설정해야 한다. public 으로 두는 것 보다는 protected 로 설정하는 것이 그나마 더 안전
하다.
> JPA가 이런 제약을 두는 이유는 JPA 구현 라이브러리가 객체를 생성할 때 리플랙션 같은 기술을 사용할 수
있도록 지원해야 하기 때문이다 - @XToOne(fetch = FetchType.LAZY)
이 게시물은 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 강의를 수강하고 정리한 내용임을 밝힙니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의
실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., 본
www.inflearn.com