Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

엔티티 설계 시 주의점 본문

인프런/[인프런] Springboot와 JPA활용 1

엔티티 설계 시 주의점

Seung__ 2021. 8. 6. 00:12

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


  • Setter가 모두 열려있으면 변경 포인트가 많아서 유지보수가 어려워진다..

 

 

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


  • 엄!청!중!요!
  • EAGER타입은 예측이 어렵고, 어떤 SQL이 실행되는지 추적하기 어렵다.
    - 특히 JPQ을 실행할 때 N+1 이슈가 발생한다.
    - 만약 A와 B가 일대다 관계인데, EAGER 타입이다?
    - A불러오는 쿼리 실행하고 n개의 B를 불러오는 쿼리 바로 실행됨 ㄷㄷ

 

 

JPA Fetch type, N + 1 이슈

1. Fetch Type이란? Entity 를 조회할 경우 해당 Entity와 연관관계에 있는 Entity를 어떻게 가져올 것인지 설정하는 값이다.  - 연관 관계에 있는 Entity 를 모두 가져온다 → Eager  - 연관 관계에 있는 Entit.

bsh-developer.tistory.com

  • 실무에서 모든 연관관계는 LAZY 타입으로 설정해야 한다.
    - Lazy는 필요한 시점에 연관 엔티티 불러옴
    - 딱 필요한 시첨에 가져옴 언제? getter로 불러올때
  • 연관된 엔티티를 DB에서 함께 조회해야 하면, fetch join 또는 엔티티 그래프 사용
  • @XToOne은 기본적으로 EAGER가 기본 설정이다.
    @ManyToOne EAGER
    @OneToMany LAZY
    @OneToOne EAGER

 

 

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


  • 컬렉션은 필드에서 바로 초기화 하는 것이 안전함
  • null 문제에서 안전해짐!!!!
  • hibernate는 엔티티를 영속화 할 때, 컬렉션을 감사서 hibernate가 제공한는 내장 컬렉션으로 변환
  • hibernate에서 내장 컬렉션으로 만들었는데 누가 밖에서 set으로 변경한다면..?..ㄷ
  •  hibernate 내부 매커니즘에 문제 발생 가능.
  • 컬렉션을 만들었으면 바꾸지 말고 그대로 사용.
  • 따라서 필드에서 초기화 하자..
     private List<OrderItem> orderItems = new ArrayList<>()​

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


 

Spring Boot Reference Guide

 

docs.spring.io

 

 

Hibernate ORM 5.4.32.Final User Guide

Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

docs.jboss.org

 

  • SpringPhysicalNamingStrategy
    - 스프링 부트 신규 설정 : entity(필드) -> table(컬럼)
    - 카멜 케이스 -> 언더 스코어(memberRepository -> member_repository)
    - .(점) -> _(언더스코어)
    - 대문자 -> 소문자
  • 적용 2단계
    - 논리명 생성 : 명시적으로 컬럼, 테이블 명을 직접 적지 않으면 ImplicitNamingStrategy 사용
    SpringPhysicalNamingStrategy​

    - 물리명 적용 : 모든 논리명에 적용되는 전략, 실제 테이블에 적용. ex)회사 표준 적용
    spring.jpa.hibernate.naming.physical-strategy​

 

5. Cascade(영속성 전이)


  • Order class
        @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
        private List<OrderItem> orderItems = new ArrayList<>();​
  • Cascade ?
    - cascade는 영속성 전이를 의미.
    - Entity의 상태(생애주기)변화가 있을 때 연관 관계의 entity에 상태변화를 전파함
    - 즉 위의 경우  order entity가 persist되면 연관 entity인 orderItem도 persist됨.
 

Cascade (영속성 전이)

1. Cascade란? 영속성 전이로, Entity의 상태(생애주기)의 변화가 있을 때 연관 관계의 entity에 상태변화(생애주기)를 전파한다. 즉 Cascade는 연관관계의 entity에 영속성을 전이시켜준다. 따라서 @OneToOne,

bsh-developer.tistory.com

 

 

6. 연관관계 편의 메서드


  • 양방향 연관관계는 연관관계 생성을 위해 객체를 양 방향으로 넣어줘야 한다.
  • 즉 A와 B가 양방향 연관관계라고 할 때, A에서 B를 add or set 했다고 하자.
  • 그렇다면 B에도 A를 넣어줘야 한다.
  • 아래와 같이 set 또는 add 메서드 하나로 양방향으로 넣어줄 수 있다.
  • 즉 양쪽 세팅을 한 코드로 엮어서 처리함.
  • Order class
        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);
        }
  • 그렇다면 연관관계인 두 클래스 중 어디다가 메서드를 만들어야해..?
    - 주로 CONTROL하는 쪽에 두는 것이 좋음.
    - 파악하기도 쉽고 관리하기 쉬울 듯.
  • 다른 좋은점은..?
    - 실수도 줄일 수 있고 코드도 짧아짐 ㅋㅋ

 

7. GitHub : 210805 엔티티 설계시 주의사항


 

GitHub - bsh6463/SpringBootJPA1

Contribute to bsh6463/SpringBootJPA1 development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] Springboot와 JPA활용 1' 카테고리의 다른 글

MemberService 개발  (0) 2021.08.06
회원 도메인 개발  (0) 2021.08.06
엔티티 클래스 개발  (0) 2021.08.05
도메인 모델 , 테이블 설계  (0) 2021.08.05
도메인 분석 설계  (0) 2021.08.05
Comments