스프링

@Access란?

PSW 2025. 2. 5. 16:45

@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;
    }
}