sanook 2020. 2. 29. 22:13

 

https://woowabros.github.io/woowabros/2018/12/29/woowahan-jpa1.html

 

우아한형제들 JPA 강의 소감과 적용 사례 - 우아한형제들 기술 블로그

우아한형제들에 외부 개발자분들을 초대해서 JPA 기본기를 강의한 소감배달의민족 내부 시스템 JPA 적용 사례 공유

woowabros.github.io

 

Entity의 PK

- Long 타입의 auto_increment를 추천 (mysql 기준으로 이렇게 하면 bigint)

주문등록번호와 같이 비즈니스상 유니크 키나 여러 키를 조합한 복합키로 PK를 잡을 경우 난감한 상황 발생 가능

1) FK를 맺을 때 다른 테이블에서 복합키 전부를 갖고 있거나, 중간 테이블을 하나 더 둬야 하는 상황 발생

2)인덱스에 좋은 영향을 끼치지 못함

3) 유니크한 조건이 변경될 경우 PK를 전체 수정해야 하는일 

주민등록번호, 복합키는 유니크 키로 별도로 추가하자 

 

빌더패턴

https://ko.wikipedia.org/wiki/%EB%B9%8C%EB%8D%94_%ED%8C%A8%ED%84%B4

 

빌더 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 빌더 패턴(Builder pattern)이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. /** "Product" */ class Pizza { private String dough = ""; private String sauce = ""; private String topping = ""; public void s

ko.wikipedia.org

Entity 클래스에서는 절대 Setter 메소드를 만들지 않음 

-> 무분별하게 만들 경우 해당 클래스의 인스턴스 값들이 언제 어디서 변해야 하는지 코드상으로 명확하게 구분 불가하여 차후에 기능 변경시 정말 복잡해짐 

- 해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만 함 

 

잘못된 사용예 

public class Order{
	public void setStatus(boolean status){
		this.status = false;
	}
}

public void 주문서비스의_취소이벤트(){
	order.setStatus();
}

올바른 사용예

public class Order{
	public void cancelOrder(){
		this.status = false;
	}
}

public void 주문서비스의_취소이벤트(){
	order.cancelOrder();
}

 

어떻게 값을 채워 DB에 삽입하는가?

default:

-생성자를 통해 최종값을 채운 후 DB에 삽입

-값 변경이 필요한 경우 해당 이벤트에 맞는 public 메소드를 호출하여 변경

@Builder를 통해 제공되는 빌더 클래스 사용 :

-생성자나 빌더나 생성 시점에 값을 채워주는 역할은 같음

-but, 생성자의 경우 지금 채워야 할 필드가 무엇인지 정확히 지정 불가

public Example(String a, String b){
	this.a = a;
    this.b = b;
}
//사용
new Example(b,a)

a와 b의 위치를 변경해도 코드를 실행하지 전까지는 문제를 찾기 어려움

Example.builder()
	.a(a)
        .b(b)
        .build();

빌더를 사용하게 되면 다음과 같이 어느 필드에 어떤 값을 채워야 할지 명확하게 인지 가능 

 

출저 : 스프링부트와 AWS로 혼자 구현하는 웹서비스 91~94p