본문 바로가기
Spring/스프링 JPA 활용

[스프링 JPA 1편] 2 - 2) 엔티티 설계 시 주의점

by Poorm 푸름 2023. 12. 12.

 *  Mac사용, Java17 사용

 *  진도 : 섹션 2 - (5) 
 *          : 자바 클래스명,         : 코드,         : 단축키

 

1. 가급적 Setter 사용 X

Setter가 모두 열려있다. 변경 포인트가 너무 많아서, 유지보수가 어렵다. 나중에 리펙토링으로 Setter 제거

 

2. 모든 연관관계는 지연로딩으로!


[해결]

  • 즉시로딩(EAGER)은 예측이 어렵고 어떤 SQL이 실행될 지 추적하기 어렵다
  • 실무에서 모든 연관관계 지연로딩(LAZY) 설정!
  • 연관된 엔티티를 같이 조회하고 싶으면 fetch join 또는 엔티티 그래프 기능을 사용
  • @XToOne(OneToOne, ManyToOne)같이 1로 가는 관계는 기본 fetch가 EAGER이므로 위험하므로
    직접 다 찾아서 LAZY로 바꿔줘야 한다 (OneToMany는 기본 fetch 전략이 LAZY다)

 

[리팩토링]

  1. shift + command + FOneToOne 또는 ManyToOne 검색
  2. (fetch = FetchType.LAZY) 입력 후 option+enter _ Add~ 선택 (간단한 표시로 바꿔주는 단축키)

** 참고 **
LAZY 로딩이 트랜잭션 밖에서 안되는 이슈 발생할 경우 트랜잭션을 빨리 가져오거나 오픈 세션 인뷰 방식 사용하거나 해서 해결

 

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

 

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

 

  •  논리명 생성: 명시적으로 컬럼, 테이블명을 직접 적지 않을 경우 ImplicitNamingStrategy 사용
spring.jpa.hibernate.naming.implicit-strategy

 

  • 물리명 적용: 모든 논리명에 적용됨, 실제 테이블에 적용 
spring.jpa.hibernate.naming.physical-strategy

 

 

4. Cascade

 

CascadeType.ALL : 상위 엔터티에서 하위 엔터티로 모든 작업을 전파

 

[ Order _ orderitem / delivery ]

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();
    
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn(name = "delivery_id")
    private Delivery delivery; //배송정보

 

5. 연관관계 편의 메서드

양방향 관계에서 한쪽 클래스에만 연관관계 메서드를 넣어주는 것이다

둘 중 어디에 넣어도 상관없지만 핵심적으로 컨트롤 하는 쪽에 넣어주면 좋다

 

[ Order _ Member / OrderItem / Delivery 연관관계 ]

public void setMember(Member member){
    this.member = member;
    member.getOrders().add(this);
}

public void addOrderItem(OrderItem orderItem){
    orderItems.add(orderItem);
    orderItem.setOrder(this);
}

public void setDelivery(Delivery delivery){
    this.delivery = delivery;
    delivery.setOrder(this);

 

[ Category _Chile / Parent 연관관계 ]

public void addChildCategory(Category child) {
    this.child.add(child);
    child.setParent(this);
}

 

 

 

 

 

 

[출처] 김영한 강사님 인프런 스프링 JPA 1편

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., 스프

www.inflearn.com