안녕하세요 Dev JaeIn 입니다.
이번 포스팅은 JPA 테스트, 설정 , 실습까지 진행하겠습니다.
우선 JPA에 대해 간단히 설명드리고 시작하겠습니다.
JPA(Java Persistence API) 란 ?
자바의 ORM(Object-relational mapping) 의 기술 표준으로 인터페이스의 모음입니다.
반복적인 DB 커넥션, SQL 재사용성 , 그리고 Mybatis 와 같은 xml로 관리되어 지는 쿼리의 유지보수 과정에서 많은 문제가 발생하였다고 합니다.
그래서 JPA 라는 표준 프레임워크가 만들어졌다고 합니다.
하지만, 다른 서비스와 관련이 많은 비지니스 로직에는 불편한 점이 존재합니다.
간단한 쿼리는 JPA로 가능하지만, 여러테이블간의 JOIN 이 들어간 경우에는 복잡하기 때문입니다.
대체적인 JPA에 대한 설명은 여기까지 드리겠습니다.
그러면 직접 스프링 부트를 사용하여 JPA를 셋팅 및 사용해본 내용을 리뷰합니다.
1.다음과 같이 JPA 에 필요한 설정들을 체크 후 프로젝트 생성을 진행합니다.
2.프로젝트 생성 후 application.properties 에 다음 정보들을 채워줍니다.
저는 오라클을 사용하여 오라클 드라이버를 사용했습니다.
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=name
spring.datasource.password=1234
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#sql 구문 로그 출력 여부
spring.jpa.show-sql=true
3.테이블을 생성했습니다. 저는 다음과 같이 만들었습니다.
CREATETIME, UPDATETIME 은 생성시간, 업데이트시간을 담기 위해 만들었습니다.
CREATE TABLE JPAUSER(
USERID varchar2(100),
USERNAME VARCHAR2(100),
USERAGE NUMBER(3),
CREATETIME TIMESTAMP,
UPDATETIME TIMESTAMP
);
4.객체 생성을 진행합니다. 객체는 다음과 같이 만들었습니다.
우선 lombok을 사용했습니다. getter,setter,tostring과 같은 코드량을 줄이기 위해서 입니다.
5.다음은 JUnit 테스트 코드입니다.
테스트 코드는 다음과 같이 진행했습니다.
성공적으로 진행된것을 알 수 있었습니다.
그리고 수행된 쿼리도 알 수 있습니다.
6.스프링 어플리케이션이 수행되는 부분에 객체 생성 시 AuditingEntityListener.class가 수행되도록 @EnableJpaAuditing를 설정해준다.
7.Repository를 생성하여 JPA를 사용 할 수 있도록 합니다.
public List<JPAUser> findByUserName(String name)
이 부분은 테스트를 하기 위해 만든 부분입니다.
findBy멤버필드명 이렇게 지정해주시면 멤버필드가 존재할 경우 해당 메소드를 사용 가능합니다.
만약 멤버필드가 없는 경우 다음과 같은 예외가 발생합니다.
8.컨트롤러를 통해 테스트 진행을 위해 Controller를 생성해줍니다. 테스트는 POST MAN을 설치하여 테스트합니다.
9.POST MAN으로 테스트한 결과입니다.
정상적으로 Insert 된 것을 확인 할 수 있습니다.
select 진행 후 Insert 진행이 됩니다.
성공시 데이터 반환 없이 결과가 나타납니다.
없는 데이터 삭제 시 다음과 같은 예외가 나타납니다.
지금까지 실무에서는 MyBatis를 사용했었습니다.
하지만, 이번에 JPA를 사용한 결과 기본적인 CRUD 작성 시간을 줄일 수 있다는 장점을 알 수 있었습니다.
간단한 쿼리라도 기본적인 메소드로만 처리 가능하다는 것은 매우 큰 장점이라 생각합니다.
또한, Builder 패턴을 사용하여 객체에 데이터를 Set 할 때 훨씬 명확하게 할 수 있다는 장점이 있습니다.
이상 JPA에 대한 설정, 실습 결과였습니다.
읽어주셔서 감사합니다!
소스코드는 github에 올려놨으니 필요하신분들은 사용하시면 됩니다
https://github.com/jjjwodls/JPAIntro