development/spring

JPA를 활용한 기본 CRUD 구현

bokshiri 2023. 1. 28. 00:16

안녕하세요 복실복실 개발자 입니다.

이번 포스팅에서는 Persistence Framework 중 ORM(Object Relational Mapping)을 활용한 기술인 JPA-Hibernate 에 대해 살펴보려고 합니다. 그 동안 개인적인 공부나 업무에서 SQL mapper 기술인 mybatis를 기반으로 개발을 진행해왔었는데, 통계적으로 최근 트랜드를 살펴보면 mybatis보다 JPA를 사용하는 비중이 높아지고 있다는 소식을 보고 이번 기회에 혼자 공부를 진행하며 그 내용을 정리해보고자 합니다.

*Persistence Framework란?

데이터베이스와 연동되는 시스템을 빠르게 개발하고 안정적으로 구동할 수 있도록 하는 프레임워크로 크게 SQL mapper와 ORM이 있습니다.

SQL mapper: sql을 활용하여 직접적으로 데이터베이스를 다루는 기술

ORM(Object Relational Mapping): 테이블과 객체를 매핑시킨 후 객체를 활용하여 간접적으로 데이터베이스를 다루는 기술

mybaits는 .xml 파일에 sql을 직접 작성한 후 VO/DTO 객체를 활용하여 DB의 데이터를 저장하는 형태로 사용합니다. sql을 직접 작성해야 하므로 간단한 CRUD작업도 모두 개발자가 직접 쿼리를 작성하며, dynamic sql을 사용할 수 있다는 장점이 있습니다.

하지만 JPA와 JPA의 구현체인 Hibernate(JPA는 Hibernate외에도 EclipseLink, DataNucleus와 같은 구현체가 있습니다.) 를 활용한 ORM 기술에서는 데이터베이스의 테이블과 객체가 매핑되어 직접적인 쿼리 작성 없이도 메소드 형태로 데이터를 제어할 수 있습니다. 또한 추후에 다루겠지만 JPA에서 데이터를 제어할 때 사용하는 JPQL과, 정적 타입을 활용하여 JPQL을 코드로 작성할 수 있도록 해주는 오픈소스인 queryDSL은 sql 추상화를 통해 특정 벤더에 의존하지 않고 개발을 진행할 수 있도록 한다는 장점이 있습니다.

 

이번 포스팅의 목표는 JPARepository에서 제공하는 기본적인 CRUD 메소드를 활용하여 별도의 쿼리작성 없이 DB 데이터를 조작해보는 것입니다. JPQL과 queryDSL은 다음 포스팅에서 다루도록 하겠습니다.

 

application.yml

테스트를 위해 우선 application.yml에서 jpa의 dialect옵션을 postgreSQL로 지정하였습니다. (현재 사용하고 있는 DB는 AWS의 RDS / DBMS는 postgresql을 사용하고 있습니다.)

012
@Entity 어노테이션을 활용하여 member 테이블을 생성하는 작업

* insert시에 서버의 현재 시각을 저장하기 위해 vo의 필드 중 regDt 항목에 해당 @CreationTimestamp를 추가로 적용하였습니다. 

@CreationTimestamp

@SequenceGenerator를 사용하여 member_seq 시퀀스를 자동으로 생성하도록 하였습니다. 해당 시퀀스는 member 테이블의 pk로 사용합니다.

테스트를 위한 view(.html)는 따로 개발하지 않고, 크롬 브라우저에서 제공하는 rest api 툴을 활용하도록 하겠습니다.

012
Controller, Service, Repository 구성

Repository의 경우 JPARepository에서 insert를 위한 기본 메소드인 save()를 제공하므로, 별도의 메소드를 작성하지 않고 상속받은 것을 그대로 사용할 수 있습니다.

rest api 툴을 활용하여 json 객체를 전송
insert 성공!

save() 메소드 외에도 JPARepository에서는 findAll(), findById(), deleteById()를 제공하므로 JPQL 없이도 기본적인 CRUD 구현이 가능합니다. 다음 포스팅에서는 JPQL과 queryDSL을 사용하여 데이터베이스를 활용해보도록 하겠습니다.