반응형
이번 포스팅에서는 JpaMemberRepository 코드를 예로 들어 JPA의 핵심 객체인 EntityManager와,
이를 이용한 대표적인 메서드인 persist, find, createQuery 사용법을 정리해보겠습니다.
💡 EntityManager란?
- EntityManager는 JPA에서 엔티티(객체)를 데이터베이스에 저장, 조회, 수정, 삭제하는 등
모든 데이터베이스 작업을 담당하는 핵심 객체입니다.
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
위처럼 생성자 주입을 통해 EntityManager를 전달받으면, 해당 Repository 클래스 내부에서 자유롭게 데이터베이스를 조작할 수 있습니다.
1. em.persist(entity)
엔티티를 데이터베이스에 저장하는 메서드입니다.
@Override
public Member save(Member member) {
em.persist(member);
return member;
}
- persist()는 주어진 객체를 영속성 컨텍스트에 저장합니다.
- 트랜잭션이 커밋될 때 실제로 INSERT SQL이 실행되어 데이터베이스에 반영됩니다.
✅ 요약: 새로운 엔티티를 저장할 때 사용합니다.
2. em.find(엔티티 클래스, 기본키)
기본키(PK)를 기준으로 엔티티를 단건 조회할 때 사용하는 메서드입니다
@Override
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
- 첫 번째 파라미터는 조회할 엔티티의 클래스 타입,
- 두 번째 파라미터는 기본키 값입니다.
- 존재하지 않는 엔티티라면 null이 반환됩니다.
- cf. 만약 기본키가 아닌 조건으로 조회하고 싶다면 createQuery()를 사용해야 합니다.
✅ 요약: 기본키(PK)로 단건 조회할 때 사용합니다.
3. em.createQuery(JPQL, 결과 타입)
JPQL을 사용해서 원하는 조건으로 조회할 때 사용하는 메서드입니다.
3.1. 이름으로 조회하기
@Override
public Optional<Member> findByName(String name) {
List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
return result.stream().findAny();
}
- createQuery 메서드를 통해 JPQL(객체지향 쿼리)를 작성합니다.
- :name은 파라미터 바인딩을 위한 자리표시자이며,
setParameter("name", name)으로 실제 값을 전달합니다. - 결과가 여러 개일 수 있으므로 getResultList()를 사용하고,
그 중 하나를 꺼낼 때는 stream().findAny()를 사용합니다.
✅ 요약: 특정 필드 조건으로 조회할 때 사용합니다.
3.2. 전체 조회하기
@Override
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
- 모든 Member를 조회하는 JPQL입니다.
- 결과를 List<Member>로 반환합니다.
✅ 요약: 전체 엔티티 목록을 조회할 때 사용합니다.
EntityManager는 JPA에서 가장 중요한 객체이며,
persist, find, createQuery는 가장 기본적이면서 자주 사용되는 대표 메서드입니다.
이 3가지 메서드만 제대로 이해해도 JPA 사용에 있어서 기본기를 다질 수 있습니다.
반응형
'Back end > Spring Project' 카테고리의 다른 글
| [Spring Project] 반복되는 로직? AOP로 한 방에 해결하기 (예제 포함) (0) | 2025.05.08 |
|---|---|
| [Spring Project] 스프링 데이터 JPA 완전 정복: CRUD부터 메서드 자동 생성까지 (0) | 2025.04.30 |
| [Spring Project] JPA(Java Persistence API) - 사용 이유부터 설정 방법까지 (0) | 2025.04.25 |
| [Spring Project] 반복되는 JDBC 코드, JdbcTemplate으로 깔끔하게 정리하기 (0) | 2025.04.24 |
| [Spring Project] 스프링 부트 정적 컨텐츠와 Welcome Page 동작 원리 (0) | 2025.03.26 |