참치코더의 꿈 메모장

JPA / @PersistenceContext + EntityManager VS JpaRepositroy 상속 방식 본문

Spring

JPA / @PersistenceContext + EntityManager VS JpaRepositroy 상속 방식

참치깡 2025. 9. 27. 13:34
728x90

 

@PersistenceContext + EntityManager 방식

 

장점

 

- JPA 내부 동작을 직접 학습이 가능하다. (요즘엔 잘 사용하지 않는다....)

- 복잡한 커스텀 쿼리나 특수한 트랜잭션 제어 시 유연함

 

단점

 

- 반복 코드 많음(save, find 등)

- 스프링 데이터가 제공하는 편리한 기능 활용 불가

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Repository
@Transactional
public class MemberRepository {
    
    @PersistenceContext // DB 선언
    private EntityManager em;
 
    public Long save(Member member) {
        em.persist(member);
        return member.getId();
    }
 
    public Member find(Long id) {
        return em.find(Member.class, id);
    }
    
}
cs

 

주요 메서드

 

1. 엔티티 저장,수정,삭제

 

persist(Object entity)

: 새로운 엔티티를 DB에 저장, 영속 상태가 됨, 트랜잭션 커밋 시 INSERT 발생

 

merge(Object entity)

: 준영속 상태(Detached)의 엔티티를 영속 상태로 병합. DB에 없는 경우 INSERT

  있으면 UPDATE

 

remove(Object entity)

: 영속 상태 엔티티 삭제, 트랜잭션 커밋 시 DELETE 발생

 

detach(Object entity)

: 엔티티를 영속성 컨텍스트에서 분리, 더 이상 자동 변경 감지 안됨

 

clear()

: 영속성 컨텍스트 초기화, 모든 엔티티 분리

 

flush()

: 영속성 컨텍스트의 변경 내용을 DB에 즉시 반영

 

2. 엔티티 조회

 

find(Class<T> entityClass, object primaryKey)

: PK로 단일 엔티티 조회

 

getReference(Class<T> entityClass, Object primaryKey)

: 프록시 조회(지연 로딩, 실제 DB 쿼리는 필요 시점에 실행)

 

contains(Object entity)

: 엔티티가 현재 영속성 컨텍스트에 포함되어 있는지 확인

 

3. 쿼리 실행(직접 SQL 입력)

 

createQuery(String jpql)

: JPQL 쿼리 생성, Query 반환

 

createQuery(String jpql, Class<T> resultClass)

: 타입 지정 JPQL 쿼리 생성, TypedQuery<T> 반환

 

createNamedQuery(String name)

: NamedQuery 호출

 

createNativeQuery(String sql)

: Native SQL 쿼리 실행

 

createNativeQuery(String sql, Class<T> resultClass)

: Native SQL + 엔티티 매핑

 

4. 캐시 관련

 

refresh(Object entity)

: DB의 최신 값으로 엔티티 재조회

 

lock(Object entity, LockModeType mode)

: 락 모드 적용

 

setProperty(String, object)

: 영속성 컨텍스트 옵션 설정

 

JpaRepositroy 상속 방식

 

장점

 

- CRUD 기본 기능 (save, findById, findAll, delete) 자동 제공

- 페이징, 정렬 등 기본 내장

- 코드가 훨씬 간결하고 유지보수 편리

 

단점

 

- JPA 동작 원리 학습에는 EntityManager 직접 사용만큼 직관적이지 않음

- 아주 특수한 커스텀 동작 시 EntityManager 필요

1
2
3
4
public interface MemberRepository extends JpaRepository<Member, Long> {
    // 필요한 커스텀 쿼리만 추가
    Optional<Member> findByName(String name);
}
cs

 

결론!!! ->  학습용으로는 EntityManager, 실 프로젝트에서는 JpaRepository가 표준

 

 

728x90
Comments