2022. 3. 21. 20:34ㆍJava/Spring
JPA에서는 엔티티와 테이블을 정확하게 매핑하는 것이 중요하다. 그래서 매핑하는 어노테이션들을 숙지하고 사용해야 한다.
JPA는 다음과 같은 매핑 어노테이션들을 지원한다.
- 객체와 테이블 매핑 : @Entity, @Table
- Primary key 매핑 : @Id
- 필드와 Column 매핑 : @Column
- 연관관계 매핑 : @ManyToOne, @JoinColumn
@Entity
JPA를 이용해서 테이블과 매핑할 클래스는 @Entity라는 어노테이션을 필수로 붙여야 한다.
@Entity는 name이라는 속성을 가지고 있는데 이는 JPA에서 사용할 엔티티 이름을 지정한다.
이를 설정하지 않으면 클래스 이름을 그대로 사용한다.
@Entity // name 속성x -> Member라는 이름을 사용
public class Member {
}
@Entity(name = "user") // user라는 이름을 사용
public class Member {
}
이 @Entity를 사용할 때 주의사항이 있다.
- 기본 생성자 필수
- final 클래스, enum, interface, inner 클래스에는 사용 불가
- 지정할 필드에 final 사용 x
자바에서는 생성자가 하나도 없으면 기본 생성자를 자동으로 만든다.
근데 만약 따로 생성자를 만들게 되면 따로 기본 생성자를 만들어 줘야 한다.
@Entity
public class Member {
public Member() {}
public Member(String str) {
this.str = str;
}
}
@Table
@Table은 엔티티와 매핑할 테이블을 지정한다. 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
@Table은 name, catalog, schema, uniqueConstraints(DDL) 속성들을 가지고 있다.
name은 매핑할 테이블 이름을 의미하고, catalog는 catalog 기능이 있는 데이터베이스에서 catalog를 매핑하고, schema는 schema 기능이 있는 데이터베이스에서 schema를 매핑한다.
코드
지금까지 배운것들을 코드로 짜보자.
간단하게 회원 엔티티를 만들도록 하겠다.
import javax.persistence.*;
@Entity
@Table(name = "member")
public class Member {
@Id @GeneratedValue // 기본 키 설정, AutoIncrement 설정
@Column(name = "member_id")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
}
데이터베이스 스키마 자동 생성
JPA에서는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.
application.properties에 다음과 같은 코드를 작성한다.
spring.datasource.url=jdbc:mysql://localhost:3306/hello-shop
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver // mysql 드라이버 설정
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=create // 애플리케이션 실행 시점에 테이블 자동으로 생성
spring.jpa.show-sql=true // 콘솔에 실행되는 테이블 생성 DDL을 출력
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
이렇게 설정한 뒤에 애플리케이션을 실행해보면 다음과 같이 콘솔에 나오는 것을 알 수 있다.
그리고 이미 테이블이 있다면 기존 테이블을 삭제하고 다시 생성을 한다.
ddl-auto에는 5가지 설정이 있다.
옵션 | 설명 |
create | 기존 테이블을 삭제하고 새로 생성 |
create-drop | 애플리케이션을 종료할 때 생성한 DDL을 삭제 |
update | 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정 |
validate | 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고 후 애플리케이션 실행 x |
none | 자동 생성 기능 x |
DDL 생성 기능
조건 : 회원 이름은 null이 아니어야 함. 10자 초과 x
@Entity
@Table(name = "member")
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
@Column(nullable = false, length = 10)
private String name;
}
@Column의 속성인 nullable을 false로 하면 not null이 추가된다. 그리고 length는 말 그대로 길이 제한을 두는 속성
그리고 실행을 해보면 name의 varchar괄호 안에 10이라고 제한이 생기고 not null이 생긴 것을 볼 수 있다.
@Temporal
날짜 타입(Date, Calendar)을 매핑할 때 사용한다.
@Temporal에는 value라는 속성이 있는데 날짜인지 시간인지 날짜와 시간인지 구별하는 속성이다
- TemporalType.DATE : 날짜, date 타입
- TemporalType.TIME : 시간, time 타입
- TemporalType.TIMESTAMP : 날짜와 시간, timestamp 타입
@Lob
데이터베이스 BLOB, CLOB 타입과 매핑한다.
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
@Transient
이 필드는 매핑을 하지 않는 대신, 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Access
JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
- 필드 접근 : AccessType.FIELD로 지정. 필드에 직접 접근, 권한이 private이어도 접근 가능
- 프로퍼티 접근 : AccessType.PROPERTY로 지정. 접근자(Getter) 사용
Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식이 설정된다.
'Java > Spring' 카테고리의 다른 글
Spring boot를 이용한 게시판 만들기 - 유저, 게시물 엔티티 및 리포지토리 만들기(2) (2) | 2022.05.25 |
---|---|
Spring boot를 이용한 게시판 만들기 - JPA를 이용하여 데이터베이스 연결(1) (2) | 2022.05.17 |
Spring boot에서 Controller가 먹지 않는 에러 (0) | 2022.03.24 |
Spring boot를 이용한 게시판 구현하기 - 데이터베이스 연결하기(1) (0) | 2022.03.10 |
Spring 개발환경 구축하기 (0) | 2022.01.26 |