관리 메뉴

공부 기록장 💻

[Spring] 스프링 DB 접근 기술 3 - JPA ORM 개념 및 실습 (Jakarta Persistence API, Object-Relation Mapping) 본문

# Tech Studies/Java Spring • Boot

[Spring] 스프링 DB 접근 기술 3 - JPA ORM 개념 및 실습 (Jakarta Persistence API, Object-Relation Mapping)

dream_for 2023. 1. 17. 15:04

인프런 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"  정리

 

스프링 DB 접근 기술 시리즈  정리

1. 순수 JDBC 

2. JdbcTemplate

3. JPA

4. Spring Data JPA


지금까지 DB에 접근하기 위해 순수 JDBC API를 이용해보았고, 이후에 JDBC에서 중복되는 코드를 상당 부분 제거하여 만든 JdbcTemplate을 사용해보았다. JDBC, JdbcTemplate API 모두 개발자가 프로그램 내에서 sql문을 작성해야 한다는 공통점을 지녔지만, 이번에는 sql문까지 프레임워크 내에서 관리해주는 JPA에 대해 알아보자. 

 

 

JPA란?

 

JPA(Java Persistence API) Spring 내에서 만든 Model의 객체와 DB 테이블의 관계를 매핑해주는 Java ORM(Object-Relation Maaping)의 표준 API로, 기존의 반복 코드는 물론이고 기본적인 SQL문 생성 및 전달 등 대부분의 SQL 관리를 직접 수행한다. JPA를 사용하면 SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있으며, 개발 생산성을 크게 높일 수 있다는 장점이 있다.

 

 

 

 

 

 

전세계적으로는 DB 접근 기술로 jpa 프레임워크가 가장 많이 사용되고 있으며, 우리나라에서도 마찬가지로 최근 jpa가 큰 주목을 받고 있는 추세이다. (2021년 이전에는 MyBatis가 가장 많이 사용되었다.)

JPA 도 스프링만큼이나 넓이, 깊이가 있는 기술이므로 공부할 양이 무지 많다고 한다. 

 

 

 


환경설정 및 구현

JPA를 사용하기 위해 먼저 간단한 환경 설정을 해보자.

 

 

build.gradle

기존에 추가한 jdbc 관련 라이브러리인 spring-boot-starter-data-jpa 의존성은 제거하고,

spring-boot-starter-data-jpa와 testImploementation 부분의 일부를 변경하자.

 

 

application.properties

기존에 datasource 관련했던 속성들은 그대로 놔두고,

JPA가 생성하는 sql을 출력하는 spring.jpa.show-sql 속성을 true값으로, 

테이블을 자동으로 생성하는 기능을 제공하는 ddl-auto 값은 none으로 설정하여 해당 기능은 끄도록 하자.

(create 값으로 설정하는 경우 엔티티 정보를 바탕으로 직접 db 테이블을 생성해준다.)

 

 

 

 

 

 

Member Domain

기존 Member 클래스 내부의 일부를 변형해보자.

jpa에 Member 클래스가 Entity 클래스임을 알리기 위한 @Entity 어노테이션을 추가해주고,

id 변수 위에는 엔티티의 primary key 값임을 알리는 @Id와 자동적으로 값을 생성해주는 @GeneratedValue 어노테이션과

name 변수 위에는 칼럼임을 알리는 @Column 어노테이션을 추가해주자.

 

 

 

JpaMemberRepository

이제 JPA를 사용하는 레포지터리인 JpaMemberRepository 구현체를 다음과 같이 구현해보자.

 엔티티를 관리하는 EntityManager 클래스의 API를 이용해 각 메서드를 아래와 같이 구현할 수 있다.

 

 

save(), findById()

primary key 값인 id와 관련된 회원 등록, id에 따른 회원 탐색 기능의 경우 EntityManager에서 직접적으로 제공하는 메서드를 사용하여 구현할 수 있다. 

 

 

findByName(), findAll()

pk가 아닌 name 을 이용해 회원을 탐색하거나 전체 회원 리스트를 가져와야 하는 경우,

createQuery() 를 이용해 쿼리 스트링을 직접 작성해주어야 한다.

 

 

MemberService

서비스 계층에는 @Transactional을 추가해주자. MemberService 클래스 메서드가 실행될 때 트랜잭션이 시작되고, 메서드가 정상 종료되면 트랜잭션을 커밋한다. 런타임 예외가 발생하면 롤백을 한다.

(JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.)

 

 

SpringConfig 설정 변경

Configuration은 다음과 같이 변경해준다.

엔티티를 관리하는 EntityManager 클래스의 객체를 JpaMemberRepisotry의 파라미터로 추가해준다.

 

 

 


Test

 

이제 통합 테스트를 진행해보자. 먼저 application.properties에서 ddl-auto 값을 create으로 변경하고 이가 잘 작동하는지 확인해보도록 하자.

h2 db 콘솔 로컬 서버에 접속하면, 기존에 저장했던 member 테이블을 삭제해보자.

 

 

 

이제 통합 테스트를 실행해보자.

테스트가 성공적으로 실행이 되었으며, 로그 창에 새로운 테이블이 생성되는 ddl 문장들이 나타나는 것을 확인할 수 있다.

 

 

이제 콘솔 화면을 다시 보면, member 테이블이 성공적으로 생성 된 것을 확인할 수 있다.

통합 테스트에서 @Transactional 어노테이션을 이전에 명시한 바가 있으므로, 각 독립적인 테스트 케이스 수행 후 롤백을 진행하였기 때문에 테이블에 남아있는 데이터 값은 없다.

 

 


 

지금까지 JPA에 대해 살펴보았다.

순수 JDBC, JdbcTemplate과 비교하면 sql문 작성을 하지 않아도 되며 이전보다 repository의 구현이 훨씬 간단해진 것을 확인할 수 있었지만 여전히 qlString 문을 작성해야 한다. 이를 더욱 쉽게 해주는 스프링 데이터 JPA에 대해 다음 시간에 살펴보도록 하자.

728x90
반응형
Comments