본문 바로가기
Spring

[Spring] JPA

by sozr 2025. 10. 1.

 

 

 

1. JPA

2. 스프링 데이터 JPA

 

 

 

 

 

1. JPA

JPA란 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다.

실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.

 

 

 

 

스프링 부트에 JPA 설정을 추가

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

 

show-sql: JPA가 생성하는 SQL을 출력하는 설정이다.

ddl-auto: JPA는 테이블을 자동으로 생성하는 기능을 제공하는데 none을 사용하면 해당 기능을 끈다.

 

 

 

 

JPA 엔티티 매핑

@Entity
public class Member {
	
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
	
    private Long id;
	private String name;

	public Long getId() {
		return id;
	}
	
    public void setId(Long id) {
		this.id = id;
	}
	
    public String getName() {
		return name;
	}
	
    public void setName(String name) {
		this.name = name;
	}
}

 

 

 

JPA 회원 리포지토리

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

public class JpaMemberRepository implements MemberRepository {
	
    private final EntityManager em;
	
    public JpaMemberRepository(EntityManager em) {
		this.em = em;
	}
    
    public Member save(Member member) {
    	em.persist(member);
        return member;
    }
	
	public Optional<Member> findById(Long id) {
		Member member = em.find(Member.class, id);
		return Optional.ofNullable(member);
	}

	public List<Member> findAll() {
		return em.createQuery("select m from Member m", Member.class).getResultList();
	}

	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();
	}
}

 

 

 

member 객체 저장

em.persist(member)

 

 

 

-> JPA는 쿼리로 변환해서 실행

INSERT INTO MEMBER(ID, NAME)

 

 

 

 

 

JPA가 사용하도록 스프링 설정 변경

 

@Configuration
public class SpringConfig {
	
    private final DataSource dataSource;
    private final EntityManager em;
    
    public SpringConfig(DataSource  dataSource, EntityManager em) {
    	this.dataSource = dataSource;
        this.em = em;
    }
    
    @Bean
    public MemberService memberService() {
    	return new MemberService(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
    	return new JpaMemberRepository(em);
    }
}

 

 

 

 

 

2. 스프링 데이터 JPA

 

스프링 프레임워크에서 JPA를 더 쉽고 간편하게 사용할 수 있도록 지원하는 라이브러리다.

 

 

스프링 데이터 JPA 회원 리포지토리

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
	Optional<Member> findByName(String name);
}

 

 

 

스프링 설정 변경

@Configuration
public class SpringConfig {


	private final MemberRepository memberRepository;
	
    public SpringConfig(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
    }
    
    @Bean
    public MemberService memberService() {
    	return new MemberService(memberRepository);
    }
}

 

 

이때 스프링 데이터 JPA가 SpringDataJpaMemberRepository를 스프링 빈으로 자동 등록해줘서

이전에 사용하던 MemoryMemberRepository의 @Repository 어노테이션을 제거해줘야 한다.

 

 

제거하지 않으면 MemoryMemberRepository가 빈으로 등록되어 있어

MemberRepository 타입의 구현체가 2개라 주입 오류가 발생한다.

 

 

 

 

'Spring' 카테고리의 다른 글

[Spring] 객체 지향 프로그래밍  (0) 2025.10.18
[Spring] AOP  (0) 2025.10.08
[Spring] 스프링 통합테스트 / JdbcTemplate  (0) 2025.09.29
[Spring] 스프링 DB 접근 기술  (0) 2025.09.28
[Spring] 웹 MVC 개발 - 회원 관리 예제  (0) 2025.09.25