Backend/Java

Spring - PersistRepository

개발자의 첫 걸음 2026. 1. 6. 10:05

안녕하세요. 오늘은 리포지토리(Repository)를 하나로 통합해서 사용하지 않고,

 

PersistRepository를 따로 생성해서 사용하는 이유에 대해 알아볼까 해요.

 

 

리포지토리를 따로 만드는 이유?

 

우리가 흔히 보는 방식은 보통 이렇게 설정할 거예요.

public interface BoardRepository extends JpaRepository<Board, Long> {}

 

이건 CRUD를 전부 한 곳에 몰아넣는 방식이에요.

 

PersistRepository는 역할을 분리하는 구조예요.

BoardPersistRepository  // 저장 전용
BoardQueryRepository    // 조회 전용 (보통 따로 만듦)

 

 

 

분리하는 이유?

 

분리하는 이유는 "저장하는 코드""조회하는 코드"의 성격이 다르기 때문이에요.

그래서 책임을 나누면 이해하기 쉬워지고, 유지보수가 쉬워져요.

 

 

 

JpaRepository는 왜 인터페이스(interface)일까?

 

public interface BoardRepository extends JpaRepository<Board, Long>

이건 Spring Data JPA가 구현체를 자동으로 만들어주기 때문에 우리가 구현할 필요가 없어요.

 

그런데 EntityManager를 직접 쓰는 경우는

entityManager.persist(board);

자동 구현대상이 아니고 우리가 로직을 작성해야 해요. 그래서 클래스여야 해요.

 

만약에 인터페이스로 만든다면

public interface BoardPersistRepository {
    Board save(Board board);
}

어딘가에 구현 클래스가 반드시 필요하기 때문에 결국 다시

public class BoardPersistRepositoryImpl implements BoardPersistRepository

이렇게 처리해야 하기 때문에 결국은 처음부터 클래스 하나로 끝내는 게 더 단순해요.

 

 

 

왜 @Repository + EntityManager 구조일까?

@Repository
@RequiredArgsConstructor
public class BoardPersistRepository {
    private final EntityManager entityManager;
}

이 구조의 의미는 다음과 같아요.

 

@Repository는 스프링에게 말하는 것으로 "이 클래스는 DB 접근 담당이야"하고 하고 있어요.

 

장점은 예외를 Spring의 DataAccessException으로 변환과 IoC 컨테이너에 등록이 돼요.

 

EntiryManager는 JPA의 핵심 객체로

 

SQL을 직접 쓰지 않아도 persist(저장), remove(삭제), merge(병합) 가능해요.

 

즉 JPA의 본체라고 생각하면 돼요.

 

 

 

Entity를 직접 사용하는 이유?

 

우선 한 줄로 선요약한다면 "JPA가 실제로 어떻게 동작하는지 명확히 이해하기 위해서"입니다.

즉 위의 내용들을 보면서 연습할 수 있어요.

 

한 덩어리 Repository에 비해 초보자가 어떤 것이 저장인지, 조회인지, 언제 트랜젝션이 필요한지 알 수 있고,

 

초보자의 연습뿐만 아니라 각 코드의 역할이 보여요.

 

실수할 확률이 감소하며 나중에 성능 튜닝도 쉬울 수 있어요.

 

지금 코드를 보며 정리하면

public class BoardPersistRepository {
    public Board save(Board board) {
        entityManager.persist(board);
        return board;
    }
}

이 코드는 "Board 엔티티를 DB에 저장하는 책임만 가진 클래스"라는 걸 아주 명확하게 표현하는 구조예요.

 

마지막으로 요약입니다.

 

 

 

여기까지 Repository 구조를 분리하는 이유에 대해 알아봤는데요.

 

이번 정리를 통해 왜 Repository를 인터페이스와 클래스로 구분해 사용하는지,

 

그리고 EntityManager가 어떤 역할을 하는지 알 수 있었어요.

'Backend > Java' 카테고리의 다른 글

Spring - SSE  (0) 2026.01.16
Spring - Polling  (0) 2026.01.13
결제 시스템 구축 - 핵심 개념 정리  (0) 2026.01.02
이메일 중복방지  (0) 2025.12.31
회원가입 이메일 인증 기능 (Google smtp 활용)  (0) 2025.12.29