Spring JPA

yeahcold·2024년 9월 3일
1

table 명 설정

  • 테이블 명이 order면 추후 order_by 할 때 오류 생길 수 있기 때문에 테이블명을 orders로 하는 게 좋다. => @Table(name = "orders") 이용

int vs Integer

int

  • Primitive 자료형으로 int, float, long, double 등과 같은 하나의 primitive 자료형이다. 산술 연산이 가능하지만, null로 초기화 불가.

Integer

  • Wrapper 클래스이다.
    Unboxing 을 하지 않으면 산술 연산이 불가능하지만, null 값은 처리할 수 있다.

다 : 다 관계라면?

@ManytoMany를 써주면서 JoinTable을 해줘야한다.
ex) item과 category 테이블 사이에서 다 : 다 관계라면 JoinTable을 통해 item_category 테이블을 만들어준다.

근데, 이 방법은 딱 그 column들만 이용할 수 있을 뿐, 더 추가가 안 되기 때문에 실무에서는 거의 쓰이지 않는다.

Entity에는 가급적 Setter를 사용하지 말자.

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

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

  • 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다.
    • 여기서 즉시로딩이란? 그냥 연관된 entity들을 다 조회해버리는 것. => 문제가 생길 수 밖에 없다.
      • JPQL은 Spring에서 쓰는 쿼리문을 말하는데, 즉시 로딩으로 member와 order 클래스가 연관되어있다고 가정하자. 이 때, select o from order o 쿼리문을 쏘게 되면, 이 쿼리문(1) + order와 연관된 member 개수(N) 만큼의 쿼리가 발생하게 된다. 즉 N+1 문제가 발생하게 된다.. ^^
  • 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야한다.
  • 연관된 엔티티를 함께 DB에서 조회해야하면, fetch join 또는 엔티티 그래프 기능을 사용한다.
  • @XToOne(OnetoOne, ManytoOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야한다. @XtoMany 관계는 기본이 지연로딩이라 굳이 설정할 필요는 없다.
profile
Software Engineer

2개의 댓글

comment-user-thumbnail
2024년 9월 10일

order 테이블명 너무 공감 되네요 😂
편하게 하려고 orm 쓰다보니 너무 가볍게 이름들을 만들게되어서 생각하지도 못했던 부분에서 에러를 만나더라구요
비슷하게 저는 sequence를 쓰다가 에러를 만난 적이 있습니다아..

1개의 답글