집돌이 공대남 IT

JPA 프로그래밍 마스터하기: 중급부터 전문가까지 실습을 통한 학습(2) 본문

IT/웹개발

JPA 프로그래밍 마스터하기: 중급부터 전문가까지 실습을 통한 학습(2)

집공이 2023. 8. 30. 12:00

JPA 활용 전략 및 최적화 기법: 고급 매핑 전략과 벌크 연산

안녕하세요, 집돌이 공대남입니다.

이번 포스트에서는 JPA의 고급 매핑 전략과 벌크 연산에 대해 다뤄보겠습니다.

JPA는 객체지향 프로그래밍의 특징과 데이터베이스 테이블간의 차이점을 해소하는 고급 매핑 전략을 제공합니다.

또한, 벌크 연산을 통해 한 번의 쿼리로 여러 행을 한꺼번에 처리하는 것이 가능합니다.

그래서 오늘은 실습을 해보려 합니다.(항상 그랬지만..)

 

고급 매핑 전략

우선, 상속 관계 매핑을 보겠습니다.

JPA는 SINGLE_TABLE, JOINED, TABLE_PER_CLASS 세 가지의 상속 관계 매핑 전략을 제공합니다.

아래의 코드는 SINGLE_TABLE 전략을 사용한 예시입니다.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
}

@Entity
@DiscriminatorValue("Book")
public class Book extends Item {
    private String author;
    private String isbn;
}

@Entity
@DiscriminatorValue("Album")
public class Album extends Item {
    private String artist;
}

이 경우, 모든 객체(아이템, 책, 앨범)가 하나의 테이블(아이템)에 저장되고, DTYPE 컬럼을 통해 객체 타입을 구분합니다.

JOINED 전략은 각 클래스마다 테이블을 만들어 조인하여 사용하며, TABLE_PER_CLASS 전략은 상위 클래스 테이블을 상속받아 하위 클래스마다 테이블을 만드는 방식입니다.

 

벌크 연산

이제 벌크 연산에 대해 알아보겠습니다. 벌크 연산은 한 번의 쿼리로 여러 행을 한꺼번에 수정하거나 삭제하는 연산을 말합니다. JPQL을 이용해 벌크 연산을 수행할 수 있습니다.

다음은 JPA의 벌크 연산을 사용한 예입니다.

@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);

위의 예제에서는 나이가 특정 나이 이상인 회원의 나이를 한꺼번에 1 증가시키는 벌크 연산을 수행합니다. 이렇게 하면 각 회원을 개별적으로 조회하여 수정하는 것이 아니라 한 번의 쿼리로 모든 회원의 나이를 증가시킬 수 있어 성능을 향상시킬 수 있습니다.

추가로, 벌크 연산을 수행할 때는 영속성 컨텍스트를 먼저 비우는 것이 좋습니다.

벌크 연산은 영속성 컨텍스트를 무시하고 바로 데이터베이스에 쿼리를 날리기 때문에, 영속성 컨텍스트와 데이터베이스의

상태가 일치하지 않을 수 있습니다.

다음 포스트에서는 JPA의 성능 최적화 전략에 대해 알아보도록 하겠습니다.

감사합니다!