Backend/JPA

[JPA/Java Persistence API] 엔티티 매핑

냠냠:) 2021. 5. 16. 02:21

[우아한형제들 김영환님의 인프런 강의 자바 ORM 표준 JPA 프로그래밍 - 기본편을 수강하고 정리한 내용입니다]




엔티티 매핑

자바에서 사용하는 엔티티와 데이터베이스에서 관리하는 데이터 간의 관계를 매핑하는 것

 

엔티티와 데이터베이스 간 매핑

  • 객체와 테이블 매핑
  • 필드와 컬럼 매핑
  • 기본 키 매핑
  • 연관관계 매핑

 

 

객체와 테이블 매핑

 

@Entity

  • @Entity 어노테이션이 붙으면 JPA가 관리한다는 뜻
  • 기본 생성자 필수
  • final 클래스, enum, interface, inner 클래스 사용 X
  • DB에 저장할 필드에는 final 키워드 사용 X
@Entity
public class Member {

	@Column
	@Id
	private Long id;
}

 

 

@Table

  • @Table은 엔티티와 매핑할 테이블 지정
  • name 속성 : 매핑할 테이블 이름
  • schema 속성 : 매핑할 스키마 이름
  • uniqueContraints : DDL 생성 시 유니크 제약조건
@Entity
@Table(name = "MEMBER")		//매핑할 테이블 명
public class Member {

	@Column
	@Id
	private Long id;
}

 

필드와 컬럼 매핑

@Column

  •  컬럼 매핑
@Entity
@Table(name = "MEMBER")		//매핑할 테이블 명
public class Member {

	@Column(name = "MEMBER_ID", updatable = false)	//MEMBER_ID 컬럼 / 업데이트 불가능
	@Id
	private Long id;

	@Column(length = 200 ,nullable = false)	//DDL 생성 시 not null 제약조건이 붙음 / 데이터 길이는 200
	private String name;

	@Column(columnDefinition = "varchar(100) default '설명'")	//컬럼 정보 직접 작성
	private String description;
}

애플리케이션 실행 시 DDL문 생성
자바 ORM 표준 JPA 프로그래밍 - 기본편 중

 

 

@Temporal

  • 날짜 타입 매핑
  • LocalDate : 날짜
  • LocalDateTime : 날짜 + 시간
  • 이전 Date/Calendar를 사용했던 필드에 작성
  • Java 8 버전의 LocaDate/LocalDateTime에는 필요하지 않음
@Entity
@Table(name = "MEMBER")		//매핑할 테이블 명
public class Member {

	@Column(name = "MEMBER_ID", updatable = false)	//MEMBER_ID 컬럼 / 업데이트 불가능
	@Id
	private Long id;

	@Column
	private LocalDate createDate;

	@Column
	private LocalDateTime createDateTime;

	@Temporal(TemporalType.DATE)
	private Date date;

	@Temporal(TemporalType.TIMESTAMP)
	private Date dateTime;
}

실제 애플리케이션 동작 시 생성되는 DDL문

 

 

@Enumerated

  • enum 타입 매핑
  • ORDINAL/STRING 옵션이 존재
  • 유지보수를 위해 인덱스 저장 방식의 ORDINAL 대신 문자열 저장 방식의 STRING 사용
public enum RoleType {
	USER, ADMIN
}
@Entity
@Table(name = "MEMBER")
public class Member {

	@Column(name = "MEMBER_ID")
	@Id
	private Long id;

	@Enumerated(EnumType.ORDINAL)
	RoleType roleTypeOrdinal;

	@Enumerated(EnumType.STRING)
	RoleType roleTypeString;
}

실제 애플리케이션 동작 시 생성되는 DDL문
자바 ORM 표준 JPA 프로그래밍 - 기본편 중

 

@Transient

  • 특정 필드를 컬럼에 매핑하지 않음
  • 데이터베이스에 저장X/조회X
  • 메모리상에서만 임시로 사용
@Entity
@Table(name = "MEMBER")	
public class Member {

	@Column(name = "MEMBER_ID")
	@Id
	private Long id;

	@Transient
	private String temp;
}

DDL 생성 시 temp는 생성되지 않음

 

 


기본키 매핑

@Id

@Entity
public class Member {

	@Id
	private Long id;
}

 

@GeneratedValue

 

IDENTITY

  • 기본 키 생성을 데이터베이스에 위임
  • MYSQL의 AUTO_INCREMENT
  • persist()시 즉시 INSERT SQL 실행 후 Id값을 DB에서 조회
@Entity
@Table(name = "MEMBER")		//매핑할 테이블 명
public class Member {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
}

 

SEQUENCE

  • 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트
  • 대표적으로 오라클 시퀀스가 이에 해당
@Entity
@Table(name = "MEMBER")		//매핑할 테이블 명
public class Member {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private Long id;

}

애플리케이션 실행 시 생성되는 시퀀스


@Entity
@Table(name = "MEMBER")		//매핑할 테이블 명
@SequenceGenerator(
		 name = "MEMBER_SEQ_GENERATOR",
		 sequenceName = "MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
		 initialValue = 1, allocationSize = 1)
public class Member {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
	private Long id;
}


자바 ORM 표준 JPA 프로그래밍 - 기본편 중

 

 

 


데이터베이스 스키마 자동 생성

  • DDL을 애플리케이션 실행 시점에 자동 생성
  • 테이블 중심 개발 -> 객체 중심 개발
  • 데이터베이스 방언(dialect)을 활용해서 적절한 DDL 생성
  • 개발 환경에서만 사용

자바 ORM 표준 JPA 프로그래밍 - 기본편 중
실제 애플리케이션 실행 시 찍히는 Create Table 로그

 

반응형