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>
(fetch = FetchType.*LAZY*)으로 설정해야 한다.컬렉션은 필드에서 바로 초기화하는 것이 안전하다.
// 국룰
@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