@Access 어노테이션의 역할
- JPA에서 엔티티 클래스의 필드를 DB 컬럼과 매핑할 때, 필드 접근 방식과 프로퍼티 접근 방식 두 가지 방법이 있다. @Access 어노테이션을 사용하면 해당 엔티티가 어떤 방식으로 데이터에 접근할 것인지 명시적으로 지정할 수 있다.
@Access(AccessType.FIELD) // 필드 접근 방식
@Access(AccessType.PROPERTY) // 프로퍼티 접근 방식
1. 필드 접근 방식(AccessType.FIELD)
- 객체의 필드(멤버 변수)에 직접 접근하여 값을 설정하고 가져온다.
- 필드에 @Column,@Id 등의 JPA 어노테이션을 직접 선언해야 한다.
- getter/setter 메서드를 거치지 않고 직접 필드에 접근한다.
import jakarta.persistence.*;
@Entity
@Access(AccessType.FIELD) // 필드 접근 방식 지정
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name; // 필드에 직접 매핑
public String getName() {
System.out.println("Getter 호출됨"); // 호출되지 않음
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. 프로퍼티 접근 방식 (AccessType.PROPERTY)
- getter/setter 메서드를 통해 필드에 접근한다.
- 필드가 아닌 getter 메서드에 JPA 어노테이션을 선언해야 한다.
- 엔티티 필드를 private으로 감추고, getter/setter를 통해 접근하도록 설계할 수 있다.
import jakarta.persistence.*;
@Entity
@Access(AccessType.PROPERTY) // 프로퍼티 접근 방식 지정
public class User {
private Long id;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(nullable = false)
public String getName() {
System.out.println("Getter 호출됨"); // 호출됨
return name;
}
public void setName(String name) {
this.name = name;
}
}
3. 혼합 사용
- 특정 필드는 FIELD, 특정 필드는 PROPERTY로 접근 방식을 다르게 설정할 수도 있다.
import jakarta.persistence.*;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 필드 접근
private String name; // 필드 접근
private Double price;
@Access(AccessType.PROPERTY) // 특정 필드만 프로퍼티 접근
@Column(name = "product_price")
public Double getPrice() {
System.out.println("Getter 호출됨");
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
'스프링' 카테고리의 다른 글
@EventListener 어노테이션이란? (0) | 2025.02.12 |
---|---|
@Entity에 대한 @OneToMany 매핑에서 컬렉션의 clear() (0) | 2025.02.05 |