집돌이 공대남 IT

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

IT/웹개발

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

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

JPA 활용 전략 및 최적화 기법: 쿼리 최적화와 트랜잭션 관리

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

초급부터 전문가까지 과정을 총 15회를 거쳐서 마쳤습니다.

초급을 하시면서 쿼리 최적화도 잠시 해보고 트랜잭션 관리도 해보고 이렇게 최적화를 초급단계에서 조금씩 맛(?) 보았습니다. 이제 중급 단계에서 좀 더 다뤄보도록 하겠습니다.

이번 포스트에서는 JPA를 활용한 쿼리 최적화 전략과 트랜잭션 관리에 대해 실습하면서 배워보도록 하겠습니다.

쿼리 최적화

JPA를 사용하면서 데이터베이스 쿼리를 최적화하는 데에는 여러 전략이 있습니다. 여기서는 페치 전략과 캐시를 이용한 최적화에 대해 다루겠습니다.

  1. 페치 전략: JPA는 LAZY와 EAGER 두 가지 페치 전략을 제공합니다. LAZY(나태) 전략은 데이터가 실제로 사용될 때까지 로딩을 지연시키는 반면, EAGER(열정) 전략은 관련 데이터를 즉시 로딩합니다. 이를 통해 애플리케이션의 성능을 개선할 수 있습니다.
@Entity
public class Member {
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

위 코드에서는 회원(Member)과 주문(Order) 사이의 일대다 관계를 설정하였고, FetchType을 LAZY로 설정하였습니다. 이렇게 하면 회원 데이터를 조회할 때 연관된 주문 데이터는 로딩되지 않고, 실제로 주문 데이터가 필요한 시점에 데이터베이스에서 로딩됩니다.

  1. 캐시 사용: JPA는 일급 캐시와 이차 캐시를 지원합니다. 이를 통해 데이터베이스 액세스를 줄이고, 애플리케이션의 반응 속도를 향상시킬 수 있습니다.
@Entity
@Cacheable
public class Member {
    // 생략...
}

위 코드에서는 @Cacheable 어노테이션을 사용하여 Member 엔티티에 대한 캐시를 활성화하였습니다. 이후 EntityManager가 Member 엔티티를 조회할 때, 먼저 캐시에서 데이터를 찾고, 없을 경우에만 데이터베이스에 접근하여 성능을 향상시킵니다.

 

트랜잭션 관리

JPA는 데이터의 일관성을 유지하기 위해 트랜잭션을 지원합니다. Spring에서는 @Transactional 어노테이션을 사용하여 트랜잭션을 관리합니다.

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    @Transactional
    public Long join(Member member) {
        memberRepository.save(member);
        return member.getId();
    }

    @Transactional(readOnly = true)
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }
}

위 코드에서는 회원 가입(join) 메서드에 @Transactional 어노테이션을 사용하여 트랜잭션 범위를 설정하였습니다. 이로 인해 join 메서드 내부의 작업들은 모두 한 트랜잭션에서 실행됩니다.

만약 중간에 예외가 발생하면 트랜잭션이 롤백되어 데이터의 일관성을 유지합니다.

다음 포스트에서는 JPA의 다른 고급 기능에 대해 알아보도록 하겠습니다.

감사합니다.