[JPA]

필드 접근, 프로퍼티 접근

everydeveloper 2024. 4. 6. 19:38

JPA에서 @Access 이야기를 할 때 필드 접근와 프로퍼티 접근 이야기를 할 때 필드와 프로퍼티가 뭐야?

JPA에서 @Access 어노테이션을 이야기할 때, "필드 접근(Field Access)"과 "프로퍼티 접근(Property Access)"에 대해 언급하는 것은 엔티티의 상태에 접근하는 두 가지 방법을 설명합니다. 이 개념을 이해하기 위해서는 먼저 "필드(Fields)"와 "프로퍼티(Properties)"의 차이를 알아야 합니다.

필드(Fields)

필드는 클래스에 선언된 변수를 의미합니다. 이 변수들은 클래스의 상태를 저장하는데 사용됩니다. 예를 들어, Person 클래스에는 **name**과 **age**라는 필드가 있을 수 있습니다. JPA에서 필드 접근 방식을 사용할 때, JPA 프로바이더는 이러한 필드에 직접 접근하여 데이터를 저장하고 검색합니다.

javaCopy code
@Entity
public class Person {
    @Id
    private Long id;

    private String name;
    private int age;

    // 생성자, 게터, 세터 생략
}

프로퍼티(Properties)

프로퍼티 접근은 필드에 접근하는 것이 아니라, 해당 필드의 값을 읽고 쓰기 위한 "게터(Getters)"와 "세터(Setters)" 메서드를 통해 이루어집니다. 프로퍼티의 이름은 메서드 이름에서 "get" 또는 "set"을 제외한 나머지 부분으로 결정됩니다. 예를 들어, getName() 메서드와 setName(String name) 메서드가 있으면, 이는 name 프로퍼티에 대한 접근을 의미합니다.

javaCopy code
@Entity
@Access(AccessType.PROPERTY)
public class Person {
    private Long id;
    private String name;
    private int age;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    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;
    }

    // age에 대한 게터와 세터 생략
}

필드 접근 vs. 프로퍼티 접근 선택

  • 필드 접근(Field Access): JPA가 클래스의 필드에 직접 접근합니다. 이 방식은 코드가 더 단순하고 직관적일 수 있으며, 비즈니스 로직을 게터/세터에 넣지 않을 때 유용합니다.
  • 프로퍼티 접근(Property Access): JPA가 게터와 세터 메서드를 통해 필드의 값을 다룹니다. 이 방식은 필드 값을 설정하거나 가져올 때 추가 로직을 실행할 수 있는 유연성을 제공합니다.

@Access 어노테이션은 엔티티 또는 매핑된 슈퍼클래스 레벨에서 사용할 수 있으며, AccessType.FIELD 또는 AccessType.PROPERTY 중 하나를 값으로 가집니다. 이를 통해 JPA가 엔티티의 상태를 어떻게 접근할지 결정하게 됩니다.

 

필드 방식은 추가적인 코드가 없기때문에 기본적인 원리에 의해서 동작한다고 보면 프로퍼티 접근은 추가적으로 비즈니스 로직 처리에 관한 부분이 더해질 수 있기 때문에 그런건가

맞습니다. 필드 접근 방식과 프로퍼티 접근 방식 사이의 선택은 일반적으로 엔티티 내부 데이터에 접근하고 조작하는 방법에 대한 설계 고려사항과 밀접하게 관련되어 있습니다. 각 방식의 특징과 사용 시 고려할 점을 좀 더 자세히 살펴보겠습니다.

필드 접근(Field Access)

  • 직접 접근: JPA 프로바이더는 반사(reflection)를 사용하여 엔티티 클래스의 필드에 직접 접근합니다. 이 방식은 필드를 private으로 선언하고 게터/세터 없이 사용할 수 있기 때문에, 구현이 더 단순하고 깔끔할 수 있습니다.
  • 비즈니스 로직의 분리: 필드 접근을 사용하면, JPA가 엔티티의 상태를 직접 변경하기 때문에, 게터/세터 메서드에서 추가적인 검증이나 로직을 실행하지 않습니다. 이는 비즈니스 로직을 엔티티의 상태 관리로부터 분리하는 데 도움이 될 수 있습니다.

프로퍼티 접근(Property Access)

  • 간접 접근: 이 방식에서 JPA는 엔티티 필드에 값을 설정하거나 조회할 때 게터/세터 메서드를 사용합니다. 이를 통해 값을 설정하거나 읽어올 때 추가 로직을 실행할 수 있는 기회가 생깁니다.
  • 비즈니스 로직의 통합: 프로퍼티 접근을 사용하면, 엔티티의 상태 변경 시 그에 따른 검증 루틴이나 계산 로직을 게터/세터 메서드에 포함시킬 수 있습니다. 예를 들어, setAge(int age) 메서드 내에서 나이가 유효한 범위 내에 있는지 검증하는 로직을 실행할 수 있습니다. 이는 엔티티의 무결성을 유지하는 데 도움이 될 수 있습니다.

결정 요소

어느 접근 방식을 선택할지는 엔티티의 사용 방식, 필요한 비즈니스 로직의 복잡성, 그리고 개발팀의 선호도에 따라 달라질 수 있습니다. 일반적으로, 엔티티에 복잡한 상태 검증이나 변환 로직이 필요하다면 프로퍼티 접근이 더 적합할 수 있습니다. 반면, 엔티티가 단순한 데이터 컨테이너 역할을 하고, 비즈니스 로직이 서비스 레이어에 집중되어 있다면, 필드 접근이 더 나은 선택일 수 있습니다.

'[JPA]' 카테고리의 다른 글

@GeneratedValue (테이블 전략, AUTO 전략)  (1) 2024.03.29
@Id, @SequenceGenerator  (0) 2024.03.28
@Enumerated, @Temporal 어노테이션  (0) 2024.03.04