ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA 활용 (1-3) - 엔티티 설계시 주의점
    Web/JPA 2024. 1. 4. 15:36

     

     

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

     

    -> Setter가 모두 열려있으면, 변경 포인트가 너무 많아서 유지보수가 어렵다.

     

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

     

    > 즉시로딩은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1의 문제가 자주 발생함 

    > 실무에서 모든 연관관계는 지연로등으로 설정해야한다.

    > 연관된 엔티티를 DB에서 조회하면 fetch join, 엔티티 그래프들을 사용하자 

    > @XToOne(OneToOne,ManyToOne)관계는 기본이 즉시 로딩이므로 직접 지연로딩으로 설정해야한다.

     

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

     

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

     

    >null문제에서 안전함

    > 하이버네이트는 엔티티를 영속화 할 때, 컬렉션을 감싸서 하이버네이트 제공하는 내장 컬렉션으로 변경함 

        만약 getOrders()처럼 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 매커니즘에 문제가 발생 할 수 있다. 필드레벨에서 생성하는 것이 안전하고 간결함 

     

    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

     

    > 컬렉션은 객체를 생성할 때 한번만 생성하고 바꾸지 말기!

     

    1.4 테이블,컬럼명 생성 전략

     

    스프링 부트에서 하이버네이트 기본 매핑 전략을 변경해서 실제 테이블 필드명은 다르다. (PDF경로참고)

     

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

      (따로 테이블명 안적고 그럴때)

     

    -스프링 부트 신규설정 (엔티티 필드 -> 테이블 컬럼)

     

    1. 카멜케이스 > 언더스코어

    2. . > 언더스코어

    3 대문자 > 소문자 

     

    - 적용 2단계 (기본설정 변경법?)

     

    1. 논리적 생성: 명시적으로 컬럼,테이블명을 적지않으면, ImplicitNamingStrategy 사용

     

    > spring.jpa.hibernate.naming.implicit-strategy : 테이블이나, 컬럼명을 명시하지 않을 때 논리명 적용

     

    2. 물리명 적용:

     

    spring.jpa.hibernate.naming.physical-strategy : 모든 논리명에 적용됨, 실제 테이블에 적용 (username usernm 등으로 회사 룰로 바꿀 수 있음

     

     

    -- 아직 무슨 얘기인지 잘 모르겠다--

    스프링 부트 기본 설정 spring.jpa.hibernate.naming.implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy spring.jpa.hibernate.naming.physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

     

Designed by Tistory.