[프로그래밍] JPA

[JPA] Entity Mapping

JHVan 2024. 5. 4. 23:31

Entity Mapping

@Entity 어노테이션을 사용하면 해당 클래스가 도메인 객체를 관계형 데이터베이스의 테이블로 맵핑됨을 나타냄.

@Entity 어노테이션만 사용했을 때, 기본적으로 테이블 이름은 클래스 이름을 따르며, 대소문자 구분이 일어나지 않음.

대부분의 관계형 데이터베이스 관리 시스템(RDBMS)은 대소문자를 구분하지 않으므로, 이러한 기본 JPA 작명 규칙은 일반적으로 문제를 일으키지 않음.

Table 이름을 명시적으로 지정하고 싶을 때 @Table 어노테이션을 사용할 수 있음.

@Table 어노테이션은 테이블 이름뿐만 아니라, 카탈로그, 스키마, 인덱스 등 테이블과 관련된 추가적인 설정을 할 수 있게 해줌.

@Table(name = "table")과 같이 사용하면, 실제 데이터베이스에 생성되는 테이블 이름을 'table'로 지정할 수 있음.

 

JPA에서 엔티티를 사용할 때의 규칙: JPA가 엔티티의 생명주기를 관리하고, 필요에 따라 인스턴스를 프록시로 생성하며, 데이터베이스와의 동기화를 원활하게 수행하기 위해 필요한 규칙

  1. 기본 생성자 필요: JPA 스펙은 엔티티가 public이나 protected 기본 생성자를 가져야 함. 이는 JPA 구현체가 엔티티 인스턴스를 프록시로 생성할 때 필요함.
  2. final 클래스 사용 금지: JPA 구현체가 엔티티를 상속받아 프록시 객체를 생성해야 하는데, final 클래스는 상속될 수 없기 때문.
  3. 내부 클래스 사용 금지: 내부 클래스가 외부 클래스의 인스턴스에 액세스하기 위해 암묵적으로 참조를 유지해야 하기 때문에, JPA 엔티티의 경우 이런 종속성이 문제가 될 수 있음.
  4. 필드에 final 사용 금지: JPA는 엔티티의 생명주기 동안 필드 값을 변경할 수 있어야 하며, final 필드는 한 번 할당된 후 변경할 수 없기 때문.
  5. 테이블 이름 대문자 사용: 관습적으로, 테이블 이름은 대문자로 작성되며, SQL 쿼리에서도 이러한 표기법이 널리 사용됨. 이는 가독성을 높이고, SQL 표준에 더 잘 부합하게 함
  6. @Table 어노테이션: JPA에서는 @Entity 어노테이션과 함께 @Table 어노테이션을 사용해 엔티티 클래스를 데이터베이스 테이블에 매핑함. @Table 어노테이션은 name, catalog, schema 등의 속성을 제공하여 매핑을 더욱 상세하게 지정할 수 있게 함.
    • name 속성을 통해 테이블의 이름을 지정할 수 있음. 예를 들어, @Table(name="USER")는 USER라는 이름의 테이블에 해당 엔티티를 매핑함.
    • catalog 속성을 사용해 데이터베이스의 카탈로그를 지정할 수 있음. 카탈로그는 데이터베이스 내에서 스키마의 집합을 구분하는 데 사용됨.
    • schema 속성을 사용하여 데이터베이스의 스키마를 지정함. 스키마는 데이터베이스 내에서 관련 테이블의 집합을 그룹화하는 데 사용됨. 특정 RDBMS에서는 테이블 이름에 스키마를 포함시켜 지정할 수 있으며, 예를 들어 "SA.USER" 형식으로 표현할 수 있음.

 

JPA는 필드와 프로퍼티를 데이터베이스 컬럼과 매핑하는 두 접근 방식을 제공함.

필드 접근 방식은 필드에 직접 접근해 값을 읽고 씀. 이때 @Entity 클래스 내 private 필드에 @Column, @Id 등 어노테이션 적용. JPA는 리플렉션 사용해 필드에 직접 접근하므로, getter/setter 필요 없음.

프로퍼티 접근 방식은 getter와 setter 메소드를 통해 필드 값을 읽고 씀. 메소드에 어노테이션 적용하고 JPA는 이 메소드 호출해 필드 값을 관리함.

@Access 어노테이션 없이는 @Id 위치에 따라 접근 방식 결정됨.

@Id가 메소드에 있으면 프로퍼티 접근(그림 왼쪽) ,필드에 있으면 필드 접근(그림 오른쪽) 사용.

@Access 어노테이션으로 접근 방식 명시적 지정 가능. AccessType.FIELD 또는 AccessType.PROPERTY 값을 가지며 클래스 레벨이나 필드/메소드 레벨에 적용 가능. 이를 통해 필드 접근과 프로퍼티 접근 방식을 혼용 사용 가능.

'[프로그래밍] JPA' 카테고리의 다른 글

[JPA] JPA와 Column  (0) 2024.05.05
[JPA] JPA의 기본 키 생성 전략  (0) 2024.05.04
[JPA] JPA의 영속성 컨텍스트  (0) 2024.05.03
[JPA] JPA 와 DB Dialect  (0) 2024.05.01
[JPA] JPA?  (0) 2024.04.29