Entity 맵핑 @어노테이션

2024. 6. 19. 22:58Java/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