🔙뒤로가기

엔티티에는 가급적 Setter를 사용하지 말자.

Setter가 모두 열려 있으면 변경 포인트가 너무 많아져서 유지보수 하기가 어렵다. 나중에 리팩토링을 하면서 Setter를 제거해주는 게 좋다.

모든 연관관계는 지연 로딩으로 설정!

참고 페이지 : ‣

<aside> ⚠️ N+1문제란?

N+1 문제는 데이터베이스와의 쿼리 횟수가 예상보다 많아져 성능에 영향을 주는 현상이다 JPQL을 사용하면서 자주 발생하는 이슈. N+1 문제는 특히 연관된 엔티티를 가져올 때 발생할 수 있다.

예를 들어, 아래와 같은 엔티티 관계가 있다고 가정하자.

SELECT m FROM Member m

이 쿼리를 실행하면 모든 회원을 가져온다. 그러나 각 회원의 주문(Order)를 가져오려면 추가적인 쿼리가 필요하다. 이 경우 주문이 N개 있다고 하면 N번의 추가 쿼리가 발생한다. 여기서 N+1 문제가 발생.

즉, 하나의 쿼리로 회원을 가져오고(N), 회원별 주문을 가져오기 위해 N번의 추가 쿼리를 실행하는 것이 N+1 문제이. 이로 인해 성능이 저하될 수 있다.

</aside>

<aside> ⚠️ N+1 문제를 해결하는 방법 중 하나는 JOIN FETCH 또는 **EntityGraph**를 사용하여 쿼리를 작성하는 것이다. 이를 사용하면 관련 엔티티를 함께 가져오기 때문에 추가적인 쿼리 실행 없이 원하는 데이터를 한 번에 가져올 수 있다.

예를 들어, **JOIN FETCH**를 사용하여 회원과 주문을 함께 가져오는 쿼리는 다음과 같다.

SELECT m FROM Member m JOIN FETCH m.orders

이렇게 하면 한 번의 쿼리로 회원과 그들의 주문을 모두 가져올 수 있다. 이 방법을 사용하면 N+1 문제를 해결하고 성능을 개선할 수 있다. 그러나 JOIN FETCH 사용 시 중복 데이터가 발생할 수 있으니 신중하게 사용해야 한다. 이런 경우에는 DISTINCT 키워드를 사용하여 중복을 제거할 수 있다.

</aside>

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

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

// 국룰
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();

// 다른 방법
@OneToMany(mappedBy = "member")
private List<Order> orders;

public Member(){
	this.orders = new ArrayList<>(); //생성자를 통한 초기화
}
Member member = new Member();
System.out.println(member.getOrders().getClass());
em.persist(member);
System.out.println(member.getOrders().getClass());

//출력 결과
class java.util.ArrayList
class org.hibernate.collection.internal.PersistentBag

테이블, 컬럼 명 생성 전략

스프링 부트에서 하이버네이트 기본 매핑 전략을 변경해서 실제 테이블 필드명은 다

https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#howto-configure-hibernate-naming-strategy http://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/ Hibernate_User_Guide.html#naming