출처 : https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
K-개빈 킹 이 수식어가 어울리는 강사, 대한민국에서 사투리가 가장 섹시한 강사, 내 프로젝트에 의존성으로 추가하고 싶은 강사 강의결제를 고민하는 분들께 1) 너무 훌륭한 강의입니다. 무엇보
www.inflearn.com
수정중
1. 객체와 테이블 매핑
- @Entity : 이 어노테이션이 붙은 클래스는 JPA가 관리하는 엔티티가 됨.
JPA를 사용해서 테이블과 매핑할 클래스는 필수로 작성
기본 생성자 필수
final 클래스, enum, interface, inner 클래스 사용 불가
저장할 필드에 final 사용 불가
@Entity(name = "Member")
name 속성으로 JPA에서 사용할 엔티티의 이름을 지정할 수 있음. 클래스 이름 그대로 사용 - @Table : 엔티티와 매핑할 테이블 지정
속성
name : 매핑할 테이블 이름 지정
catalog : 매핑할 catalog 지정
schema : 매핑할 schema 지정
uniqueConstraints(DDL) :유니크 제약조건 걸 때 사용 (제약조건 이름 지정 가능)
2. 필드와 컬럼 매핑
- @Column : 컬럼 매핑
속성
name : 필드와 매핑할 테이블의 컬럼 이름
insertable, updatable : 애플리케이션에서 insert와 update 해도 되는지 여부 , 기본 값 true
nullable(DDL) : null 허용 여부 (false로 지정하면 데이터베이스 스키마 자동 생성시 not null로 db 생성해줌)
unique(DDL) : 한 개의 컬럼에 유니크 제약조건을 걸 때 사용 ( 데이터베이스 스키마 자동 생성할 때 유니크 제약 조건 걸어줌, 제약조건 이름 지정 불가)
length(DDL) : 문자 길이 제약조건 지정, String 타입에만 사용 가능, 기본값 255
columnDefinition(DDL) : 컬럼 정보 직접 작성 - @Temporal
날짜 매핑, LocalDate, LocalDateTime을 사용할 때는 생략 가능
Date나 Calendar를 사용할 때는 필수 작성
TemporalType.DATE : 데이터베이스의 date 타입과 매핑
TemporalType.TIME : 데이터베이스의 time 타입과 매핑
TemporalType.TIMESTAMP : 데이터베이스의 timestamp 타입과 매핑 - @Enumerated
enum 매핑, 기본값 EnumType.ORDINAL (ORDINAL로 저장하면 String으로 저장되는게 아니라 순서가 저장돼서 컬럼에 값이 추가되면 db가 꼬여버리기 때문에 사용 X) EnumType.String을 사용하면 문자가 저장됨. - @Lob
blob, clob 매핑. 속성 없음. 문자면 CLOB으로 매핑 나머지는 BLOB으로 매핑 - @Transient
컬럼에 매핑하지 않을 때
3. 기본 키 매핑
- @Id : 직접 할당
- @GeneratedValue : 기본 키 자동 생성
@GeneratedValue(strategy = GenerationType.AUTO)
AUTO는 IDENTITY와 SEQUENCE, TABLE 중에 맞는 전략을 선택헤줌
@GeneratedValue(strategy = GenerationType.IDENTITY)
데이터베이스에 위임, id 값을 설정하지 않아야 함. = db를 확인해야 id로 어떤 값이 들어갔는지 알 수 있다.
이 때만 예외로 commit할 때가 아니라 persist할 때 쿼리를 날림. insert를 해야 pk 값을 영속성 컨텍스트에 저장 할 수 있기 때문
@GeneratedValue(strategy = GenerationType.TABLE)
키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내
모든 데이터베이스에 적용 가능하지만 성능이 안 좋음.
@GeneratedValue(strategy = GenerationType.SEQUENCE)
시퀀스를 만들고 기본 키에 적용, id 값을 설정하지 않아야 함. = db를 확인해야 id로 어떤 값이 들어갔는지 알 수 있다.
persist 할 때 db에게 시퀀스 값을 받아오고 commit할 때 시퀀스 값을 넣어서 insert함.
@SequenceGenerator를 사용해서 시퀀스 직접 작성 가능
allocationSize의 기본값은 50인데 50으로 설정하면 db에서 시퀀스 값 50을 미리 확보하고 메모리에 저장해뒀다가 50만나면 또 +50을 확보함. = db에 계속 왔다갔다하면 성능 안 좋음. 이렇게 하면 성능 최적화됨.
@Entity
@SequenceGenerator (
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ", // 매핑할 db 시퀀스 이름
initialValue 1, // DDL 생성 시 사용, 시퀀스 시작 숫자
allocationSize = 1) // 증가 값, db 시퀀스의 증가 값이 1이면 1로 설정
public class Member {
@Id
@GeneratedValue=startegy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
정리중
상속관계
관계형 데이터베이스에서는 상속을 처리할 때 슈퍼타입, 서브타입 관계로 저장함
이 때 insert하고 싶으면 두개의 테이블의 insert문을 작성해야함.
select할 때는 join해야함 = 모든 케이스에 조인쿼리를 작성해야함
이걸 자바컬렉션에 저장한다면?
연관관계
객체는 참조를 사용 : member.getTeam()
테이블은 외래 키를 사용 : join on m.team_id = t.team_id
이 때 객체를 테이블에 맞추어 모델링하게 됨. = 나중에 insert할 때 불편하니까
class Member {
String id; // member_id 컬럼 사용
Long teamId; // team_id fk 컬럼 사용
String username; // username 컬럼 사용
}
class team{
Long id; // team_id pk 사용
String name; // name 컬럼 사용
}
Insert into member(member_id, team_id, username ) values....
객체는 참조로 연관관계를 맺는다.
객체다운 모델링을 하면
class Member{
String id; // member_id 컬럼 사용
Tema team; // 참조로 연관관계를 맺는다
String username; // username 컬럼 사용
Team getTeam(){
return team;
}
}
class Team{
Long id; // team_id pk 사용
String name; // name 컬럼사용
}
이렇게 모델링하면 insert 쿼리를 짤 때 복잡해짐. team_id를 가져오기 위해 조인하거나 서브쿼리를 사용해야함.
'코딩 > JPA' 카테고리의 다른 글
[JPA] 상속관계 매핑 (0) | 2023.12.04 |
---|---|
[JPA] 다양한 연관관계 매핑 (0) | 2023.12.04 |
[JPA] JPA 연관관계 매핑 (0) | 2023.12.02 |
[JPA] JPA 실습 (0) | 2023.12.01 |
[JPA] JPA (0) | 2023.11.28 |