먹었으면 뇌를 쓰자

JPA 학습 내용을 정리한 로드맵 - 1. JPA란 무엇인가 본문

Framework/JPA

JPA 학습 내용을 정리한 로드맵 - 1. JPA란 무엇인가

뇌이비 2022. 12. 19. 10:19

 

 

1. JPA란 무엇인가
     1.1 기본 CRUD
     1.2 기초 지식

2. 연관관계
     2.1 다대일 연관관계 
     2.2 일대다 연관관계 

3. 상속
     3.1 상속관계
     3.2 CASCADE

4. SQL
     4.1 JPQL
     4.2 Querydsl

 

 

 

1. JPA란 무엇인가

 

- JPA는 자바 ORM

- JPA의 장점은 무엇일까

- 스프링 데이터 JPA

 

 

 

 

 

 

<JPA는 자바 ORM>

 

자바는 객체 지향이지만 데이터베이스는 객체 지향 개념이 없다. 

ORM(객체 관계 매핑)은 객체 지향 프로그래밍과 관계형 데이터베이스의 간극을 채우는 기술이다.

JPA는 자바에서 사용하는 표준 ORM이다.

 

JPA를 파자해보면 다음과 같다. 'Java Persistence API'

JPA는 자바가 RDB를 사용하는 방식을 정의하는 인터페이스이다. 

 

인터페이스는 일종의 형식으로, 실제 내용은 구현체가 구현한다. 

JPA를 사용하는 구현체에는 대표적으로 Hibernate가 있다. 

 

자바와 RDB의 소통을 도와주는 방법을 JPA라고 하고, Hibernate 프로그램으로 실행한다.

 

 

덧. JPA와 JDBC

 

예전에 사용하던 ORM은 JDBC 였다.

그런데 JDBC는 RDB별로 서로 다른 드라이버가 필요했다.

MySQL은 JDBC MySQL Driver, Oracle은 JDBC Oracle Driver 를 따로 설치해야 했다. 

RDB별로 드라이버를 설치해야 하는 단점을 고쳐 범용성을 확장한 것이 JPA이다.

JPA의  'Dialect'(방언) 기능을 통해 어떤 RDB든 추가 설치 없이 조작할 수 있다.

 

 

 

 

 

<JPA의 장점은 무엇일까>

 

프로그래머는 직접 SQL문을 작성하여 데이터를 CRUD한다. 

그러나 JPA에는 CRUD에 필요한 SQL문의 기능을 실행하는 api가 있다.  

 

INSERT문 - persist(엔티티명)

SELECT문 - find(엔티티 타입, 식별자)

DELETE문 - remove(엔티티명)으로 가능하다.

UPDATE문은 따로 api 사용 없이 자동으로 변경을 감지한다. 

 

 

또한 앞서 언급했듯 Dialect 기능이 아주 유용하다.

JPA에는 Dialect 라는 추상 클래스가 존재하고,

Dialect를 RDB에 맞게 구현하는 각각의 구현체가 내장되어 있다. 

따라서 RDB가 바뀌어도 JPA 설정만 변경하면 프로그래머가 따로 수정할 것이 없다.

 

 

JPA에서 SQL문은 개별 단위로 처리되지 않는다. 

프로그래머가 persist 하나를 작성했다고 해서 바로 데이터가 생성되지 않는다.

JPA는 '영속성 컨텍스트'라는 창고에 SQL문을 차곡차곡 모아둔다.

그리고 모든 SQL문 작성이 종료되는 시점에 DB로 일괄 전송하여 처리한다. 

 

 

여기서 알 수 있는 또 다른 장점은 Auto-DDL 기능이다.

선 DDL로 테이블을 정의하고 데이터를 넣는 것이 아니라,

데이터를 넣는 동시에 자동 DDL이 실행된다.

 

즉, 변경사항이 있을 때 테이블을 수정하고 데이터도 수정하는 이중 작업이 불필요하다.

데이터만 수정하면 테이블이 알아서 수정된다. 

 

 

JPA는 기본 SQL문을 자동 실행하는 api가 있다. (persists,find,remove)
JPA는 RDB가 바뀌어도 Dialect 할 수 있다.
JPA는 한번에 트랜잭션 처리한다.
JPA는 데이터와 테이블이 동시에 처리된다.

 

 

 

 

 

<스프링 데이터 JPA>

 

앞서 봤듯 JPA에는 persist, find와 같이 CRUD를 실행해주는 api들이 있었다.

실제 비즈니스 모델을 설계할 때는 

DAO 계층(DB 접근 객체, SQL 실행)을 만들어 api를 실행할 메소드를 작성한다.

 

이는 비즈니스 로직에서 늘 쓰이지만 

프로그래머가 일일이 작성해야 하는 관습적인 메소드(보일러 플레이트 코드)라 할 수 있다.

 

 

<DAO(Database Access Object)>
*CRUD에 필요한 엔티티 매니저 em도 필요하다.

findById(Long id){
return em.persist(id)} // 게시물 조회 메소드 작성

deleteById(Long id){
return em.delete(id)} // 게시물 삭제 메소드 작성

/...

 

 

 

스프링 데이터 JPA에는 DAO의 역할을 하는 'Repository' 인터페이스가 존재한다.

 

Repository 계층에서 

JpaRepository(Repository 하위 인터페이스)를 상속하는 인터페이스를 정의하고

이곳에서 필요한 SQL문을 작성하고 실행한다.

SQL문을 통해 실행된 결과를 이전 계층에 전달할 수 있다. 

 

 

 

<Repository 계층>


public interface SeedStarterRepository extends JpaRepository<SeedStarter,Long>

*데이터 타입에는 CRUD를 실행할 엔티티명과, 엔티티의 pk 타입을 적어준다.


@Query("SELECT DISTINCT s FROM SeedStarter s")
List<SeedStarter> findWithFeature();

*실행할 SQL문을 작성한다. 
*결과 값을 받아 이전 계층(CRUD 요청 계층, 즉 Service 계층)에 넘기는 메소드를 작성한다.

 

 

비교하자면 다음과 같은 차이가 있다.

 

 

(JPA) DAO 계층에서 CRUD 기능을 수행하는 메소드를 작성한다.

(스프링 데이터 JPA) Repository 계층의 인터페이스에 SQL문을 작성하고 반환 결과를 이전 계층으로 넘긴다.

 

 

 

스프링 데이터 JPA는 JPA의 개정판이다. (보일러 플레이트 보완, JpaRepository 인터페이스 방식)

 

 

 

 

 

Comments