[Spring / JPA] JPA 방식으로 DB에 접근해보자

clean·2023년 12월 30일
0

이 글은 김영한님의 인프런 강의 '스프링 입문'을 듣고 작성하였습니다.

JPA와 ORM

JPA는 ORM 방식이다.
O는 Object, R은 Relational, M은 Mapping을 의미한다.
말그대로 자바 객체(Object)를 관계형 데이터베이스에 매핑을 해주는 것이다.

JPA Entity Mapping

우선 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;
    }

}

JPA Repository 구현

다음과 같이 인터페이스를 만들어준다.

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 인터페이스에 이미 내장되어 있기 때문이다.

SpringConfig에서 DI

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가 된다.

profile
블로그 이전하려고 합니다! 👉 https://onfonf.tistory.com 🍀

0개의 댓글