[JPA] 엔티티 설계시 주의

hi·2022년 10월 19일

1. 엔티티에는 가급적 Setter 사용 금지

변경 포인트가 많아 유지보수 어려움

2. 모든 연관관계는 지연로딩 (Lazy)으로 설정

즉시로딩은 N+1 문제 발생
연관된 엔티티를 함께 DB에서 조회할 경우, fetch join 또는 엔티티 그래프 기능 사용
@XToOne 기본값이 즉시로딩. 지연로딩으로 변경

3. 컬렉션은 필드에서 초기화

null 문제에서 안전

  • 또한, 변경 불가하게 만들기
List<Member> members = new ArrayList(); //초기화 후

// members 자체를 변경할 수 있는 setter 제공 X
public void setMember(List<Member> members) { 
	this.members = members;
}
  • 하이버네이트는 엔티티를 영속화 할 때, 컬랙션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경(추적하기 위해)
    -> 때문에 임의의 메서드에서 컬력션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생 가능

4. 테이블 , 컬럼명 생성 전략

  • 하이버네이트 기존 구현: 엔티티의 필드명을 그대로 테이블의 컬럼명으로 사용

  • but, 스프링 부트에서 하이버네이트 기본 매핑 전략을 변경하여 아래처럼 사용

    1. 카멜 케이스 -> 언더스코어(memberPoint member_point)
    2. .(점) -> _(언더스코어)
    3. 대문자 -> 소문자

참고)
논리명 적용 (명시하지 않을때)
spring.jpa.hibernate.naming.implicit-strategy

물리명 적용
spring.jpa.hibernate.naming.physical-strategy

5. 의존관계 생성자 주입

//필드 주입
@Autowired
MemberRepository memberRepository;


//생성자 주입 ★권장
private final MemberRepository memberRepository;

public MemberService(MemberRepository memberRepository) {
	this.memberRepository = memberRepository;
}
  • 필드 주입의 경우 변경하기 힘듦
    -> setter를 만들면? 도중에 변경되면 안 됨, 또한 생성 이후에는 딱히 변경할 일 없음

  • 생성자 주입시

    • 생성 시점에 의존관계를 명확히 알 수 있음
    • 도중에 변경될 일 없어 안전
    • 필드에 final을 붙이면 컴파일 오류 체크 가능

그래서! 생성자 주입 사용
@RequiredArgsConstructor 롬복 애노테이션 사용시 더욱 편리!

0개의 댓글