[JPA] 엔티티 클래스 개발 주의사항

DevHwan·2022년 12월 4일
0

엔티티 클래스 개발 주의사항

  • 가급적 getter 만 열어두고 setter는 사용하지 않는다.

  • 변경시에는 setter가 아닌 변경 지점이 명확하도록 변경을 위한 비즈니스 로직을 별도로 제공할 것

  • OneToOne 관계 같은 경우 FK를 어디에 두어도 상관이 없다. ACCESS 를 자주 하는 곳에 두는 게 좋다.

  • FK를 가지고 있는 쪽에서 값을 넣어야 반대편이 변경될 수 있다. 연관 관계의 주인에서 값을 넣으면 변경되지 않는다.

  • @Enumerated(EnumType.String) Ordinary 로 타입을 줄 수 있으나 나중에 상태가 추가되었을 경우 크게 문제가 생길 수 있다. String 타입으로 넘겨주는 게 현명하다.

  • 상속 하는 클래스 엔티티 들의 경우

    • @Inheritance(strategy = InheritanceType.) JOINED 는 가장 정규화된 스타일이다, SINGLE_TABLE 은 한 테이블에 모두 모으는 것, TABLE_PER_CLASS 는 클래스마다 테이블로 나누는 전략
    • @DiscriminatorColumn(name = "dtype") TYPE 별로 구분해 준다.
  • 실무에서는 다대다 관계를 거의 쓰지 않는다.

    • 필드를 추가하는 행위가 불가능하다. ( 중간 테이블에 컬럼을 추가할 수 가 없다. )
    • 세밀하게 쿼리 실행하기가 어렵다.
    • 해결방법
      • 중간 엔티티를 따로 만들고 각각 @ManyToOne , @OneToMany 로 매핑하여 사용하면 좋다.
      • 다대다 매핑 관계를 일대다, 다대일 매핑으로 풀어서 해결한다.
  • 엔티티 클래스를 생성해서 자동으로 생성되는 DDL 을 데이터 베이스에 그대로 사용하면 될까??

    • 당연히 안된다. 비슷하게 사용하는 건 유용하지만 별도로 추가하거나 제거하거나 하는 과정을 거쳐야 한다. 실무에서는 자동으로 생성되는 DDL 을 참고만 한다.
  • 엔티티 설계시 주의점

    • 모든 연관관계는 지연 로딩으로 설정한다. 중요!!
      • 어떤 SQL 이 실행될지 추적하기가 어렵다. 연관되어 있는 데이터를 다 가져온다 ..
      • 실무에서 모든 연관관계는 LAZY 로 설정해야 한다. @OneToOne(fetch = LAZY) @ManyToOne(fetch = LAZY)
        디폴트로는 EAGER가 설정되어있기 때문에 반드시 명시해야 한다.
  • 컬렉션은 필드에서 바로 초기화 하는 것이 베스트 방법이다.

    • 컬렉션을 바꾸지 않는 것이 안전하다.
      • null 문제에서 안전하다.
      • 하이버 네이트가 엔티티를 영속화할 때, 내장 컬렉션으로 변경하기 때문이다.
        @OneToMany(mappedBy = "order", cascade =ALL)
        private List<OrderItem> orderItems = new ArrayList<>();
  • 테이블 컬럼명 생성 전략

대문자는 인식하지 않기 때문에 사용하지 않는다.
  • 엔티티가 비즈니스 로직을 가지고 객체 지향의 특성을 활용하는 것을 도메인 모델 패턴이라 한다.

  • 반대로 엔티티에는 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 것을 트랜잭션 스크립트 패턴이라고 한다.

profile
달리기 시작한 치타

0개의 댓글