Spring

JPA(Java Persistence Api) 사용하기

비뀨_ 2022. 3. 26. 13:34

JPA(Java Persistence Api) 란 무엇인가??

말 그대로 자바 영속성 API이다.

프로그래밍에서 영속성이란 데이터를 생성한 프로그램이 종료되어도 남아있는 데이터의 특성을 얘기한다.

 

우리가 네이버 회원가입을 한 번만 하고 다음부터는 가입 시의 아이디와 비밀번호만 입력하면 로그인이 되는 것처럼

데이터를 파일 또는 데이터베이스에 저장시키는 것이다.

 

JPA는 

  • 자바 ORM(Object Relation Mapping : 객체-관계 매핑) 기술의 표준 명세로 Java에서 제공하는 API이다.
  • 기존 EJB (Enterprise Java Bean)에서 제공되던 Entity Bean을 대체하는 기술이다.

JPA의 등장배경?

관계형 DB는 성능이 좋고, 기능이 많지만, 객체지향언어인 Java에서 접근하려면 불편하다.

SQL을 직접 작성하고, 데이터를 조작할 때 파라미터를 바인딩해야하고, 결과를 객체에 매핑해야한다.

정리하자면 관계형 DB자바 객체성격이 다르기 때문에 발생하는 문제를 다 처리해야 하기 때문

품질이 저하될 수 있다.

그렇다면 ORM은 뭔가?

 

ORM(Object-Relation Mapping)은 객체-관계 매핑이란 뜻이다.

Java의 객체와 테이블을 자동으로 연결(Mapping)해 준다.

 

  • Java 객체에 저장된 데이터를 테이블의 Row 정보로 저장한다.
  • 테이블에 저장된 Row 정보를 자바 객체로 매핑해준다.

이 얘기를 풀어보면 데이터베이스에 저장하거나, 읽어오게 도와주는 것이다.

ORM을 사용하면 SQL문을 짤 필요없이 객체를 통해 DB를 조작할 수 있게 된다.

 

Java의 ORM Framework는 JPA, Hibernate 등이 있다.

 

 

JPA 특징

JPA의 구조

JPA는 모든 ORM 구현체들의 공통 인터페이스를 지원하기 때문에 개발시 Hibernate를 사용하다

다른 ORM으로 변경이 용이하다. (JPA는 어떻게 써라라는 기술 명세서이다.)

 

Spring Data JPA

비유하자면 물고기를 쉽게 잡기 위한 낚시대JPA라면

자동으로 줄을 당겨주는 전동 낚시대 Spring Data JPA라고 볼 수 있을 것 같다.

 

JPA에서 DB의 Entity를 관리해주는 EntityManager를 Spring Data JPA는 자동으로 관리해준다.

그 외에도 

- 공통 인터페이스 제공해 CRUD 처리를 도와줌. 

- Repository 개발 시 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입

- 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있도록 지원

- 공통 메소드는 스프링 데이터 JPA가 제공하는 org.springframework.date.jpa.repository.JpaRepository 인터페이스에

  count, delete, deleteAll, deleteAll, deleteById, existsById, findById, save ..

출처: https://data-make.tistory.com/621 

 

 

등의 특징이 있다.

 

스프링 데이터 프로젝트 종류

  • 스프링 데이터 JPA : 관계형 DB의 JPA 퍼시스턴스(영속성)
  • 스프링 데이터 MongoDB :  몽고 DB의 퍼시스턴스 
  • 스프링 데이터 Neo4 : 그래프 DB의 퍼시스턴스
  • 스프링 데이터 Redis : 레디스 Key-Value 스토어의 퍼시스턴스
  • 스프링 데이터 Cassandra : 카산드라 DB의 퍼시스턴스

 

 

 

 

 

스프링 데이터 JPA 사용

1.pom.xml에 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

 

data-jpa에는 기본적으로 Hibernate까지 들어가 있다.

만약 Hibernate 말고 다른 ORM을 사용하고 싶으면 Hibernate를 아래와 같이 제외시키면 된다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <exclusions>
    	<exclusion>
        	<artifactId>hibernate-entitymanager</artifactId>
            <groupId>org.hibernate</groupId>
        </exclusion>
    </exclusions>
</dependency>

제외 후 사용할 ORM의 의존성을 추가하면 된다.

 

2.도메인 객체에 어노테이션 추가

어노테이션 설명
@Entity 엔티티 클래스로 설정하고, 어노테이션이 붙은 클래스는 테이블과 Mapping 된다.
@Table @Table(name="테이블이름") 으로 사용하며 "테이블이름" 테이블과 매핑된다.
@Id 기본키와 매핑한다. @Id가 없는 엔티티 클래스는 JPA가 처리 불가.
@GeneratedValue @Id가 선언된 필드에 기본 키를 자동으로 생서앟여 할당할 때 사용.
@Temporal 날짜 타입 변수에 선언.@TemporalType(TemporalType.DATE|Time|TIMESTAMP 중 하나)
@ManyToMany @ManyToMany(targetEntity=클래스이름.class)로 여러개의 객체를 가질 때 사용

 

3.JPA 레포지토리 설정하기

CRUD할 때에는 interface 클래스가 CRUDRepository<Entity클래스,id자료형>를 상속받는다.

@Repository
public interface MemberRepository  extends CrudRepository<Member, Long>{
	public List<Member> getMemberList();
	public long joinMemberAndGetKey(Member member);
}

 

4.JPA 레포지토리 커스터마이징

레포지토리 구현체의 이름을 분석해 저장되는 객체의 Context에서 메서드의 용도를 파악한다.

Spring Data는 도메인 특정 언어 ( DSL) 을 정의하고 있어 퍼시스턴스에 관한 내용이 리포지토리 메서드의 시그니처에 표현된다.

List<Member> findBySeq(long seq);

위는 Member의 seq로 회원 목록을 찾겠다는 것이다.