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 관계는 기본이 지연로딩이라 굳이 설정할 필요는 없다.
order 테이블명 너무 공감 되네요 😂
편하게 하려고 orm 쓰다보니 너무 가볍게 이름들을 만들게되어서 생각하지도 못했던 부분에서 에러를 만나더라구요
비슷하게 저는 sequence를 쓰다가 에러를 만난 적이 있습니다아..