🌱 Spring Boot와 JPA
- Spring Boot는 JPA 설정을 자동 구성해 줌
- 개발자는 직접
EntityManagerFactory나 트랜잭션을 만들지 않고,
application.properties에 설정만 하면 바로 사용 가능
🧾 전통적인 JPA 코드 (순수 JPA)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Tutor tutor = new Tutor(1L, "wonuk", 100);
em.persist(tutor); // 영속화
tx.commit();
em.close();
emf.close();
→ EntityManagerFactory, EntityManager, Transaction을 직접 생성
→ close()도 직접 처리
→ 트랜잭션을 수동으로 시작하고 종료
☕ Spring Boot + JPA 통합 구조

✅ spring-boot-starter-data-jpa 의존성 추가로 설정 자동화
✅ application.properties에 DB 설정만 해 주면 작동
✅ 내부적으로 EntityManagerFactory, TransactionManager가 자동 Bean 등록됨
✅ @PersistenceContext로 EntityManager 주입
🔐 동시성 처리 방식
EntityManager는 싱글톤처럼 보이지만,📘 예시: Spring 환경에서의 JPA 사용
@Repository
public class TutorRepository {
@PersistenceContext
private EntityManager em;
public void save(Tutor tutor) {
em.persist(tutor);
}
public Tutor findById(Long id) {
return em.find(Tutor.class, id);
}
public List<Tutor> findAll() {
return em.createQuery("SELECT * FROM tutor", Tutor.class).getResultList();
}
public void delete(Tutor tutor) {
em.remove(tutor);
}
}
→ @Repository + @PersistenceContext로 Spring이 관리
→ 직접 em.close()나 begin/commit 필요 없음
→ 트랜잭션은 @Transactional 어노테이션으로 처리
📝 Spring Data JPA
- Spring Framework에서 JPA를 더욱 쉽게 사용할 수 있도록 만든 모듈
- CRUD 반복 코드를 줄이고, 인터페이스만으로 SQL 없이 DB 접근이 가능해짐
📚 JPA vs Spring Data JPA 비교
⚙️ 기존 JPA
@PersistenceContext
private EntityManager em;
public void save(Member member) { em.persist(member); }
→ 반복되는 코드 많음
→ SQL을 직접 작성하거나 JPQL 필요
🌿 Spring Data JPA
public interface MemberRepository extends JpaRepository<Member, Long> {
Member findById(Long id);
}
→ JpaRepository 상속만으로 CRUD 기본 기능 자동 제공
→ 메서드 이름만으로 쿼리 생성 (Query Method)
🔧 Spring Data JPA 주요 기능

| 기능 | 설명 |
|---|---|
| ✅ Repository 추상화 제공 | CrudRepository, JpaRepository 등 기본 인터페이스 제공 |
| ⚙️ JPA 구현체와 통합 | Hibernate 등과 연동하여 SQL 자동 생성 |
| 🔍 Query Methods | 메서드 이름만으로 JPQL 자동 생성 복잡한 경우 @Query 사용 가능 |
| 🔄 트랜잭션 + 지연로딩(Lazy) | Spring과 트랜잭션 통합, 연관 객체는 필요할 때 로딩 |
🧱
SimpleJpaRepository란?
JpaRepository인터페이스의 기본 구현체- Spring이 이 클래스를 자동으로 생성하여 내부에서 CRUD 수행
📦 내부 구조
EntityManager를 내부에서 사용📘 사용 방법
public interface MemberRepository extends JpaRepository<Member, Long> {
}
save(), findById(), delete() 등 사용 가능🧪 내부 메서드 예시
| 메서드 | 설명 |
|---|---|
save(entity) | 엔티티 저장 (insert or update) |
findAll() | 전체 데이터 조회 |
delete(entity) | 데이터 삭제 |
findById(id) | 단건 조회 |
| + 페이징, 정렬 등 추가 지원 |
☝️ 직접 구현할 필요 없이 Spring이 자동으로 생성해 줌
🧠 요약 정리
| 구분 | 순수 JPA | Spring Boot + JPA | Spring Data JPA |
|---|---|---|---|
| 설정 | 수동 구성 | 자동 구성 | 자동 구성 + 기능 확장 |
| 트랜잭션 | 직접 관리 | @Transactional 사용 가능 | 완전 자동 처리 |
EntityManager | 직접 생성 | 자동 주입 | 내부적으로 자동 주입 |
| 코드 작성량 | 많음 | 줄어듦 | 극단적으로 줄어듦 |
| 장점 | 세밀한 제어 | 편리한 관리 | 빠른 생산성, 간결함 |