DevKim

[Tip] Entity 설계 시 주의할 점 & 참고할 점 본문

Spring Boot

[Tip] Entity 설계 시 주의할 점 & 참고할 점

on_doing 2021. 5. 13. 22:31
728x90

1. 실무에서는 가급적 Getter은 열어두고, Setter은 닫아주자

- 실무에선 엔티티를 조회 할 일이 너무 많으므로, Getter의 경우엔 열어두는 것이 좋다.

단, Setter를 막 열어두면 나중에는 엔티티가 도대체 어디서 왜 변경되는지 추적하기가 힘들어진다.

그래서 엔티티를 변경할 때는 Setter 대신에 변경 지점이 명확하도록

변경을 위한 비즈니스 메서드를 별도로 제공해야한다. (유지 보수성이 올라감)


2. 실무에서 @ManyToMany는 '절대' 사용하지 말자.

- 편리한 것 같지만, 중간 테이블에 컬럼을 추가할 수 없고, 세밀하게 쿼리를 실행하기 어렵기 때문에 실무에서 사용하기에는 한계가 있다. 일대다,다대일 매핑으로 풀어내서 사용하자


3. FK가 있는 곳을 연관관계의 주인으로 정해라


4. 테이블은 타입이 없으므로 구분이 어렵다. 관례상 '테이블명_id"를 많이 사용한다.

- 실무에선 회사의 규칙을 따른다.중요한 것은 일관성이다!


5. 실무에서 FK는 꼭 걸어줘야하나요?

- 시스템마다 다른데, 실시간 트래픽이 엄청 중요하고, 정확성보다는 유연성이 중요하면 FK는 빼고 index만 잘 잡아주면된다. 그런데 이게 돈 관련된 거나 data가 항상 맞아야하는 시스템에서는 FK를 거는 것에 대해 생각 할 필요가 있다!


6. 값 타입은 변경 불가능하게 설계해야한다.

- 생성할 때만 딱 값이 세팅되는게 best!!

- @Setter을 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스를 만들자.

- JPA 스펙상 엔티티나 임베디드 타입은 자바 기본 생성자를 protected로 설정하는게 안전하다.

-> JPA가 이런 제약을 두는 이유는, JPA 구현 라이브러리가 객체 생성시, 리플랙션 같은 기술을 사용할 수 있도록 지원해야하기 때문


7. 모든 연관관계는 지연로딩으로 설정하기

- 즉시로딩은 예측이 어렵고, 특히 JPQL을 실행할 때 N+1문제가 자주 발생한다.

*@_ToOne관계는 디폴트값이 즉시로딩이므로 모두 지연로딩으로 설정해야함


8. 컬렉션은 필드에서 초기화하자.

- 컬렉션 필드는 필드에서 바로 초기화 하는 것이 안전하다!!

->null문제에서 안전, 하이버네이트에서 엔티티 영속화 할 때,

변경시 문제발생할 수 있는 경우에 대해 안전


9. 엔티티는 최대한 순수하게 유지하자.

-엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직은 없어야한다.

->최대한 다른 곳에 dependency가 없도록하여 유지 보수성을 높이자

728x90
Comments