개발 Note/JAVA

[JAVA] JPA

sylim95 2022. 3. 31. 03:32

 

출처: https://www.inflearn.com/

 

 

JPA(Java Persistence API)란?

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

 

 

ORM이란?

객체(Object)와 관계형 데이터베이스(RDB)를 매핑한다는 뜻이다. 즉, 패러다임의 불일치를 개발자 대신 해결해준다.

ORM의 키워드는 자동이다. JDBC는 Mapper에서 SQL을 직접 입력해주어야 하지만 ORM은 테이블을 객체와 매핑함으로써 객체간의 관계를 바탕으로 SQL을 자동으로 생성한다.

 

 

동작 과정

출처: https://ultrakain.gitbooks.io

JPA는 애플리케이션JDBC 사이에서 동작한다.

JPA 내부에서 API를 사용하여 SQL을 호출하고 DB와 통신한다.

 

 

왜 사용할까?

1. 생산성 : 반복적인 CRUD SQL을 JPA가 대신 처리해주기 때문에 객체 설계 중심 개발이 가능하다.

2. 유지보수 : 개발 중에 엔티티가 추가될 경우 관련 코드를 모두 변경해야 한다. JPA는 이 과정을 대신해줌으로써 유지보수성을 향상시킨다.

3. 불일치 해결 : JAVA의 객체지향과 DB의 관계지향의 패러다임 불일치 문제를 해결해준다. (가령 상속이나 그래프 탐색 등과 같은 불일치 문제가 있다.)

4. 벤더 독립성 : MySQL, Oracle, H2 등등 벤더마다 사용법이 다르기 때문에 데이터베이스에 종속되기 마련이다. JPA는 애플리케이션과 데이터베이스 사이에서 추상화된 데이터 접근을 제공하여 종속이 되지 않도록 한다.

 

 

Hibernate?

Hibernate는 JPA 명세의 구현체이다.

SQL을 사용하지 않고 메서드를 사용해 데이터를 조작할 수 있다.(JDBC API를 사용하지 않는 것은 아님)

출처: https://dev-coco.tistory.com/

JPA와 Hibernate는 마치 자바의 interface와 그를 구현한 class와 같은 관계이다.

JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction

Hibernate에서는 각각 SessionFactory, Session, Transaction으로 상속받고 Impl로 구현하고 있다.

 

 


 

Spring Data JPA

JPA를 사용하기 편하게 만들어 놓은 모듈이다. JPA에 대한 데이터 접근의 추상화라고 할 수 있다.

사용자가 Repository 인터페이스에 정해진 규칙대로 입력하면 Spring이 알아서 해당 메소드 이름에 맞는 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해주는 방식이다.

 

[간단 예제]

  • Entity
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "ADDRESS_TB")
public class AddrEntity {

    @Id
    @Column(name="ADDR_KEY", nullable=false)
    private String addrKey;

    @Column(name="ADDR_NM", nullable=false)
    private String addrNm;

    @Column(name="ADDR_POST", nullable=false)
    private String addrPost;

    public String getAddrKey() {
        return addrKey;
    }

    public void setAddrKey(String addrKey) {
        this.addrKey = addrKey;
    }

    public String getAddrNm() {
        return addrNm;
    }

    public void setAddrNm(String addrNm) {
        this.addrNm = addrNm;
    }

    public String getAddrPost() {
        return addrPost;
    }

    public void setAddrPost(String addrPost) {
        this.addrPost = addrPost;
    }

}

 

  • Repository
import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.stereotype.Repository;

@Repository
public interface AddrRepository extends JpaRepository<AddrEntity, String> {
    public List<AddrEntity> findByAddrKey(String addrKey);
}​

 

  • Service
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import kr.co.entity.AddrEntity;
import kr.co.repository.AddrRepository;
import kr.co.service.AddrService;

import java.util.Optional;

@Service
public class AddrServiceImpl implements AddrService {

    @Autowired
    private AddrRepository addrRepository;

    @Override 
    public Optional<AddrEntity> findByAddrKey(String addrKey) { 
        Optional<AddrEntity> addr = addrRepository.findByAddrKey(addrKey);
        return addr;
    }

}

 


 

느낀점

확실히 SQL을 직접 작성하지 않는다는 데에서 오는 편리함이 있다.

그런데 이 부분이 양날의 검일 수 있다는 생각이 든다.

직접 작성하지 않기 때문에 편리하지만 그만큼 세밀한 작업은 힘들 수 있다.

JPQL이나 QueryDSL을 함께 사용하는 것이 필연적인 것으로 보인다.

 


#References

1] https://ultrakain.gitbooks.io/jpa

 

Introduction · jpa

 

ultrakain.gitbooks.io

2] [Spring JPA] JPA 란? (tistory.com)

 

[Spring JPA] JPA 란?

이번 글에서는 JPA(Java Persistence API)가 무엇인지 알아보려고한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이

dbjh.tistory.com