우리는 Calisthenics 입니다!
프로젝트를 위한 JPA 공부 정리 본문
객체와 관계형 데이터베이스의 차이
- 상속
객체는 상속관계가 있지만, 관계형
- 연관관계
객체는 reference를 가지고 있다. 관계형 데이터
- 데이터 타입
- 데이터 식별 방법
JPA
- Java Persistence API
- Java ORM 표준
ORM
- Object-Relational Mapping(객체 관계 매핑)
- 객체와 RDB를 ORM 프레임워크가 중간에서 매핑
- 객체는 객체대로 설계, RDB는 RDB대로 설계
JPA를 사용해야 하는 이유
- 객체 중심으로의 개발
- 생산성
- 유지보수
- 패러다임 불일치 해결
- 성능
지연 로딩과 즉시 로딩
- 지연 로딩: 객체가 실제 사용될 때 로딩
- 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회
hibernate.hbm2ddl.auto 속성
- 운영 장비에는 절대 create, create-drop, update를 사용하면 안된다. 운영 중인 데이터베이스의 테이블이나 컬럼을 삭제할 수 있기 때문
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
@OneToMany의 mappedBy
객체에는 양방향 연관관계가 없다. 서로 다른 단방향 연관관계 2개를 애플리케이션 로직으로 양방향인 것처럼 보이게하는 것일 뿐
⇒ 데이터베이스 테이블은 외래 키 하나로 양방향 연관관계(조인) 가능
Entity를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나가 되어서 둘 사이에 차이가 발생
이 때문에, JPA에서는 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리 =
연관관계의 주인
이라고 함
양방향 매핑 - 연관관계의 주인
양방향 연관관계 매핑 시, 두 연관관계 중 하나를 연관관계의 주인으로 정해야 한다.
→ 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래키를 관리(등록, 수정, 삭제)할 수 있다. 주인이 아닌 쪽은 읽기만 할 수 있고, 외래 키를 변경하지 못한다.
연관관계를 주인으로 정하기 위해서 mappedBy 속성 사용
- 주인은 mappedBy 속성을 사용하지 않는다.
- 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다.
연관관계의 주인을 정한다 = 외래 키 관리자를 선택한다.
⭐연관관계의 주인은 테이블에 왜래 키가 있는 곳으로 정해야 한다. 항상 @MaynToOne은 연관관계의 주인이 되므로 mappedBy를 설정할 수 없다.
양방향 연관관계 주의점
- 주인이 아닌 곳에 입력된 값은 외래 키에 영향을 주지 않는다.
⭐연관관계의 주인이 아닌 객체에 값을 저장하면 외래 키에 아무 영향을 주지 않는다. 연관관계의 주인만이 외래 키의 값을 변경할 수 있다!
⇒ 하지만 객체 지향의 관점에서, 데이터베이스 뿐만이 아니라 객체도 함께 고려해야 하기 때문에, 양쪽 방향에 모두 값을 입력해주는 것이 안전하다!
- 양방향 연관관계는 항상 서로를 참조해야 한다. 한 쪽만 참조하면 양방향 연관관계가 성립하지 않는다. 항상 서로 참조하게 하려면 연관관계 편의 메서드를 만드는 것이 좋다.
일대다 단방향
일이 연관관계의 주인
일대다 단방향 관계를 매핑할 때는 @JoinColumn을 꼭 사용해야 한다.
→ 이렇게 하지 않으면, JPA는 연결 테이블을 중간에 두고 연관관계를 관리하는 조인 테이블 전략을 기분으로 사용해서 매핑한다.(중간에 테이블 추가된다)
일대다 양방향은 존재하지 않으므로 다대일 양방향을 사용해야 한다.
일대일 관계
- 주 테이블이나 대상 테이블 둘 중 어느 곳이나 외래 키를 가질 수 있다.
- 외래 키에 데이터베이스 UNIQUE 제약조건이 추가되어야 한다.
참고 자료
'Backend > JPA' 카테고리의 다른 글
JPA Fetch 전략 (0) | 2021.08.03 |
---|