본문 바로가기
Study/Java

[Spring Tip] 엔티티 설계시 주의점

by _royJang 2022. 10. 3.

Setter

Setter가 열려있다면 프로젝트 사이즈가 커진 뒤 유지보수가 굉장히 어렵다.

모든 연관관계는 지연로딩으로 설정!!! (중요)

즉시 로딩(EAGER)을 사용한다면 연관된 모든 테이블을 로딩해야한다. 따라서 지연 로딩(LAZY)로 설정하고 사용해야 한다. 만약 연관된 엔티티를 함께 조회해야 한다면, fetch join 또는 엔티티 그래프를 사용한다.(n+1문제?)
! ManyToOne은 default가 EAGER, OneToMany는 LAZY. 따라서 ManyToOne은 LAZY로 fetch 값을 변경이 필수적이다.

초기화와 동시에 메모리 할당을 하는것이 'null' 문제에서 안전하다.

best practice.

테이블 네이밍 전략

주로 언더바 전략을 사용하고 스프링에서 카멜케이스와 ._로 변경해 주는 기능이 있음.(SpringPhysicalNamingStrategy)

연관관계 편의 메소드

양방향에 값을 주입시켜야할 트랜젝션이 있을 때, 핵심적으로 컨트롤 하는 클래스에서 하나의 함수로 묶어 실행한다. 실수가 줄어들 수 있다.

Cascade

Mapping 어노테이션에 cascade 옵션이 등록 돼 있으면 persist 기능을 자동으로 동작함.

다른 엔터티에서 참조되지 않고 동일한 라이프사이클을 가진 엔터티끼리 사용하는게 좋다.

생성자 제약

JPA를 사용할 때에 새로운 인스턴스를 제작하는 메소드를 개발한다면 new를 통해 직접 인스턴스를 생성하는 생성자를 막는 것이 좋다. JPA에서 protected 제약은 사용하지 말라는 뜻으로 주로 해석한다.

lombok의 @NoArgsConstruct(access = AccessLevel.PROTECTED)는 같은 동작을 수행한다.

더티체킹

변경 데이터를 JPA가 확인하여 변경사항에 대한 쿼리를 쿼리 작성없이 날려준다. 큰 장점.

도메인 모델 패턴

엔터티가 비즈니스 로직을 가지고 있고 서비스 계층은 단순히 요청을 위임하는 역할을 하는 패턴. JPA나 ORM을 사용할 때에 주로 사용 됨

트랜잭션 스크립트 패턴

엔터티는 기본적인 getter setter만 가지고 있고 서비스 계층에서 비즈니스 로직을 구현하는 패턴

'Study > Java' 카테고리의 다른 글

[JPA] 키워드  (0) 2022.10.02
[JAVA, JPA, SPRING] 어노테이션 모음집  (0) 2022.09.30
[Spring Boot] 스프링 컨테이너, @Bean, @Component  (0) 2022.03.29