이 글은 김영한님의 인프런 강의 '스프링 입문'을 듣고 작성하였습니다.
JPA는 ORM 방식이다.
O는 Object, R은 Relational, M은 Mapping을 의미한다.
말그대로 자바 객체(Object)를 관계형 데이터베이스에 매핑을 해주는 것이다.
우선 JPA 방식으로 DB에 접근하기 위해서는 'build.gradle'에 다음과 같이 dependency를 추가해 주어야 한다.
아래는 Member class의 내용이다.
JPA 방식으로 DB에 접근하기 위해서는
'@Entity'을 클래스에 붙여주고
'@jakarta.persistence.Id'를 Primary key에 해당하는 필드에 붙여주어야 한다.
'@GeneratedValue(startegy = GenerationType.IDENTITY)'는 id를 자동생성해주는 어노테이션이다.
package hello.hellospring.domain;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import org.springframework.data.annotation.Id;
@Entity
public class Member {
@jakarta.persistence.Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
다음과 같이 인터페이스를 만들어준다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
Optional<Member> findByName(String name);
}
JpaRepository를 상속 받으면 스프링 컨테이너가 JPA 구현체를 자동으로 만들어서 스프링 빈에 등록해 준다고 한다.
여기서 보면 'Optional findByName(String name);'만 써준 것을 볼 수 있는데, 이렇게 하면 JPA 구현체가 내부적으로 'select m from Member m where m.name=?'이런식으로 쿼리를 작성하여 날린다고 한다.
그 외의 'findById', 'save' 같은 메소드를 써주지 않은 이유는 JPA 인터페이스에 이미 내장되어 있기 때문이다.
package hello.hellospring;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.*;
import hello.hellospring.service.MemberService;
import jakarta.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class SpringConfig {
// private DataSource dataSource;
// private EntityManager em;
private final MemberRepository memberRepository;
@Autowired
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
// 스프링 빈에 등록돼있는 멤버 리포지토리를 스프링 빈에 넣어준다.
return new MemberService(memberRepository);
}
}
스프링 컨테이너가 JPA 구현체를 만들어서 스프링 컨테이너에 등록해주었기 때문에 이렇게 하면 DI가 된다.