Entity 맵핑 @어노테이션
2024. 6. 19. 22:58ㆍJava/Spring
@Entity
속성 | 기능 |
name | 데이터 배이스나 JPA에서 사용할 이름 설정 |
예시
@Entity
public class User {
주의 사항
- 기본 생성자가 꼭 필요
- final, enum, interface, innter class에서는 사용 불가
- 필드(변수)를 final로 선언 불가
@Table
속성 | 기능 |
name | 데이터 배이스나 JPA에서 사용할 이름 설정 |
catalog | catalog 기능이 있는 DB에서 catalog 매핑 |
schema | schema기능이 있는 DB에서 schema 매핑 |
uniqueContraints | DDL 생성시 유니크 제약조건 생성 ※ 스키마 자동 생성 기능을 사용해 DDL을 만들 때만 사용 |
예시
@Entity
@Table(name = "users")
public class User {
@Id
속성 | 기능 |
@GeneratedValue(startegy = GenerationType.IDENTITY) | 기본 키 생성을 DB에 위임 (Mysql) |
@GeneratedValue(startegy = GenerationType.SEQUENCE) | DB시퀀스를 사용해서 기본 키 할당 (ORACLE) |
@GeneratedValue(startegy = GenerationType.TABLE) | 키 생성 테이블 사용 (모든 DB 사용 가능) |
@GeneratedValue(startegy = GenerationType.AUTO) | 선택된 DB에 따라 자동으로 전략 선택 |
예시
@Entity
@Table(name = "roles")
class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- 다양한 전략이 있는 이유는 DB마다 지원하는 방식이 다르기 때문이다.
- AUTO 같은 경우DB에 따라 전략을 JPA가 자동으로 선택한다. 이로 인해 DB를 변경해도 코드를 수정할 필요 없다는 장점이 있다.
@Column
속성 | 기능 |
name | 필드와 매핑할 테이블의 컬럼 이름 지정 default는 필드이름으로 대체 |
insertable | true : 엔티티 저장시 필드값 저장 false : 필드값이 저장되지 않음 |
updatable | true : 엔티티 수정시 값이 수정 false : 엔티티 수정시 값이 수정 되지 않음 |
table | 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용 |
nullable | null값 허용 여부 설정 false : not null 제약 조건 |
unique | 컬럼에 유니크 제약조건 부여 |
columnDefinition | 데이터베이스 컬럼 정보를 직접 부여 |
length | 문자 길이 제약조건 String 타입일 때 사용 |
precision, scale |
BigDecimal 타입에서 사용 precision : 소수점을 포함한 전체 자릿수 설정 scale : 소수의 자릿수 |
예시
@Column(name = "username")
private String username;
//데이터베이스의 컬럼 이름을 지정합니다. 기본값은 필드의 이름과 동일합니다.
@Column(nullable = false)
private String password;
//컬럼이 NULL 값을 허용할지 여부를 지정합니다. 기본값은 true입니다
@Column(unique = true)
private String email;
//컬럼의 값이 고유해야 하는지 여부를 지정합니다. 기본값은 false입니다.
@Column(length = 100)
private String firstName;
//문자열 컬럼의 최대 길이를 지정합니다. 기본값은 255입니다.
@Column(columnDefinition = "TEXT")
private String bio;
//데이터베이스에 직접적인 컬럼 정의를 제공합니다. 데이터베이스별 타입이나 제약 조건을 설정할 때 사용됩니다.
@Column(precision = 10, scale = 2)
private BigDecimal salary;
//숫자 타입 컬럼에서 사용되며, precision은 전체 자릿수를, scale은 소수점 이하 자릿수를 나타냅니다.
@Column(insertable = false, updatable = false)
private Date creationDate;
//insertable은 INSERT 문에서 해당 필드를 포함할지 여부를 지정하고, updatable은 UPDATE 문에서 해당 필드를 포함할지 여부를 지정합니다. 기본값은 true입니다.
//이 예제에서 creationDate 필드는 데이터베이스 테이블에서 creationDate 컬럼이며, INSERT 및 UPDATE 문에서 제외됩니다.
@Access
속성 | 기능 |
AccessType.FILED | 필드에 직접 접근한다, 필드 접근 권한이 private여도 접근 가능 |
AccessType.PROPERTY | getter를 통해 접근 |
예시
@Entity(name = "user2")
@Table(name = "user3")
@Getter
@Setter
@Access(AccessType.FIELD)
public class User {
@Id
@GeneratedValue
private Long id;
}
주의 사항
- @Access를 설정하지 않으면 기본키를 설정하는 @Id의 위치를 기준으로 접근 방식 설정
- @Id가 getter에 위치하므로 @Access를 생략할 수 있다.
@Enumerated
속성 | 기능 |
EnumType.ORDINAL | enum 순서를 DB에 저장 |
EnumType.STRING | enum이름을 DB에 저장 |
예시
//Enum 클래스
public enum RoleType {
ADMIN, USER
}
//Entity
@Entity(name = "user2")
@Table(name = "user3")
@Getter
@Setter
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
@Enumerated(value = EnumType.ORDINAL)
private RoleType ordinal;
@Enumerated(value = EnumType.STRING)
private RoleType string;
}
주의 사항
- 결과를 보면 EnumType.ORDINAL은 ADMIN의 순서인 0이 저장되고, EnumType.STRING은 문자열 자체가 저장된다.
- 사용할 때 주의점은 ADMIN, USER 사이에 enum이 하나 추가되면 USER가 순서상 2번이 된다. 하지만 DB에서는 기존 번호 USER를 1로 저장했기 때문에 문제가 발생할 수 있으므로 되도록이면 EnumType.STRING사용을 권장한다.
@Temporal
속성 | 기능 |
TemporalType.DATE | 날짜, DB date 타입과 매핑(예 : 2020-02-12) |
TemporalType.TIME | 시간, DB time 타입과 매핑(예: 12:12:12) |
TemporalType.TIMESTAMP | 날짜와 시간 DB timestamp타입과 매핑(예 : 2020-02-12 12:12:12) |
예시
private RoleType string;
@Temporal(value = TemporalType.DATE)
private Date date;
@Temporal(value = TemporalType.TIME)
private Date time;
@Temporal(value = TemporalType.TIMESTAMP)
private Date timeStamp;
}
@Transient
@Transient 어노테이션을 붙인 필드는 DB에 저장하지도 조회하지도 않는다. 객체에 임시로 값을 보관하고 싶을 때 사용
@Transient
private String vvv;
@Lob
https://nuher038.tistory.com/73
BLOB 이용한 멀티미디어 저장
BLOB (Binary Large Object)BLOB(대용량 바이너리 객체, Binary Large Object)은 대량의 이진 데이터를 저장하고 처리하는 데 사용되는 데이터 유형입니다.데이터베이스에서 사용되며, 이미지, 비디오, 오디오
nuher038.tistory.com
'Java > Spring' 카테고리의 다른 글
@Controller와 @RestController 의 설명 과 차이 (0) | 2024.06.24 |
---|---|
@Transactional (0) | 2024.06.24 |
BLOB 이용한 멀티미디어 저장 (0) | 2024.06.19 |
싱글톤(Singleton) 패턴의 개념 및 사용 (0) | 2024.06.18 |
AOP의 계념 및 사용법 (0) | 2024.06.18 |