본문 바로가기
Java

자바 최대 절전 모드 (3) - 매핑 · 객체 상태 관리

by gentle-tiger 2025. 7. 10.
프로젝트 중 느낀 자바 기초의 부족함을 보완하고자 핵심 주제를 순차적으로 복습할 예정입니다.
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다. 

 

Hibernate (3) – 매핑 · 객체 상태 관리

  1. Java 객체를 데이터베이스 테이블과 어떻게 매핑합니까?
  2. Hibernate에서 시퀀스 기반 기본 키를 어떻게 정의합니까?
  3. Hibernate에서 구성 요소(Component) 매핑이란 무엇입니까?
  4. Hibernate 인스턴스 상태의 유형은 무엇입니까?
  5. Hibernate의 상속 매핑 모델 유형은 무엇입니까?
  6. 파생(Derived) 속성이란 무엇입니까?
  7. 일대다 매핑에서 cascade 및 inverse 옵션을 정의하십시오.

 

Java 객체를 데이터베이스 테이블과 어떻게 매핑합니까?

Hibernate에서 Java 객체를 데이터베이스 테이블에 매핑하는 방법은 어노테이션이나 XML 설정으로 이루어집니다. Java 클래스는 테이블에 대응하는 엔티티로 선언되며, 각 클래스의 필드는 테이블의 컬럼에 매핑됩니다. 기본적으로 @Entity, @Table, @Column과 같은 어노테이션을 사용합니다. 

 

Hibernate에서 시퀀스 기반 기본 키를 어떻게 정의합니까?

Hibernate에서 시퀀스 기반 기본 키를 정의하려면 @GeneratedValue 어노테이션을 사용하고 statategy = GenerationType.SEQUENCE를 지정합니다. 시퀀스를 명시적으로 지정하거나 기본 시퀀스 이름을 사용할 수도 있습니다. 

import javax.persistence.*;

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq")
    @SequenceGenerator(name = "member_seq", sequenceName = "member_sequence", allocationSize = 1)
    private Long id;

    private String name;

    // Getters and Setters
}

 

Hibernate에서 구성 요소(Component) 매핑이란 무엇입니까?

구성 요소 매핑은 다른 엔티티와 별도의 테이블에 매핑되지 않고, 하나의 엔티티의 필드로 포함된 복합 객체를 매핑하는 방법입니다. 구성 요소는 테이블에 별도의 레코드로 저장되지 않고, 해당 엔티티의 컬럼으로 내부 구성 요소처럼 저장됩니다.

import javax.persistence.*;

@Embeddable
public class Address {
    private String street;
    private String city;

    // Getters and Setters
}

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Embedded  // Address를 member 테이블의 컬럼으로 매핑
    private Address address;

    // Getters and Setters
}

 

Hibernate 인스턴스 상태의 유형은 무엇입니까?

Hibernate에서 엔티티 인스턴스는 Transient → Persistent → Detached 의 세 가지 상태로 관리됩니다.

Transient는 엔티티가 세션에 연관되지 않은 상태로, DB와 연결되지 않은 상태입니다. Persistent는 엔티티가 세션에 연관된 상태로, DB와 연결되어 있고 트랜잭션을 통해 관리됩니다. Detached는 엔티티가 세션과 분리된 상태로, DB와 연결되었으나 세션과의 관계가 끊어진 상태입니다. 

 

Hibernate의 상속 매핑 모델 유형은 무엇입니까?

SINGLE_TABLE, JOINED, TABLE_PER_CLASS 세 가지 전략이 존재합니다. 모든 상속 관꼐를 하나의 테이블에 저장하는 SINGLE_TABLE은 조회 빈도가 높을 때 사용하며, 부모 클래스와 자식 클래스를 각각 별도의 테이블에 저장하고 조인으로 사용하는 JOINED는 단순 및 고성능이고 정규화를 중시할 때 적합합니다. 

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Member {
    
    private Long id;
    private String name;
}

 

파생(Derived) 속성이란 무엇입니까?

파생속성이란 다른 엔티티의 속성에 의존하여 계산되는 속성으로, DB에 저장되지 않고 계산된 값을 런타임에 동적 반환하는 것이 특징입니다. @Transient 어노테이션이 붙어 있는 메서드는 Hibernate가 쿼리에서 제외하기 때문에 쿼리 성능을 최적화할 수 있으며, DB에 저장할 필요가 없고, 실시간 계산이 필요한 비즈니스 로직에 주로 사용합니다. 

    @Transient  // 데이터베이스에 저장되지 않는 파생 속성
    public double getTotalPrice() {
        return quantity * price;
    }

 

일대다 매핑에서 cascade 및 inverse 옵션을 정의하십시오.

일대다 매핑에서 cascade와 inverse 옵션은 주로 부모-자식 엔티티 간의 관계를 정의할 때 사용합니다. cascade 옵션은 엔티티 간의 연쇄적인 동작을 설정하는 옵션입니다. 예를 들어, 부모 엔티티가 저장될 때 자식 엔티티도 자동으로 저장되도록 할 수 있습니다. inverse 옵션은 다쪽(자식 엔티티)이 부모 엔티티를 관리하는지 여부를 결정합니다. inverse = true로 설정하면 자식 엔티티가 부모 엔티티를 관리하게 됩니다. cascade는 잘못 설정할 경우 원하지 않는 삭제나 저장 작업이 전파될 수 있으므로, 필요한 동작에만 적용하도록 해야 하며, inverse의 경우 양쪽에서 inverse가 잘못 설정되면 연관 관계가 제대로 매핑되지 않거나 예기치 않은 동작이 발생할 수 있습니다.