[ ORM ]/JPA

[ JPA ] JPA와 DB 설정, 동작확인

환이s 2024. 12. 19. 23:15
728x90


Intro

 

안녕하세요, 환이님! 👋
오늘은 JPA와 DB 설정하는 방법에 대해 알아보고 마지막으로 동작 확인까지 진행해보려 합니다.

블로그 내용은 강의를 들으며 작성한 수강 일지로 작성되고 별도로 프로젝트 생성하는 파트는 생략하겠습니다.


yml 파일 생성 및 세팅

 

우선 시작하기에 앞서, 프로젝트를 생성했을 때 자동으로 생성되는 application.properties 파일을 application.yml 파일로 수정하여 진행하려고 합니다.

기존에 properties 파일로 진행해도 괜찮지만, 계층적 구조인 yml 파일이 설정 파일이 많아졌을 때 더 편리하게 관리할 수 있을 것 같아서 yml로 대체하여 진행하려고 합니다.

 

application.yml

 

위 사진처럼 properties 파일을 yml로 수정하고

포스팅에 사용할 DB는 H2를 사용하려고 하는데,

그 이유는 개발이나 테스트 용도로 가볍고 편리해서 많이 사용하는 편입니다.

 

yml 파일에 H2 DB 설정과 JPA 설정 코드를 추가해 보겠습니다.

 

위 yml 설정은 다음 설명을 참고해 봅니다.

driver-class-name: org.h2.Driver
# DB connection과 관련된 data source 설정이 완료됩니다.

ddl-auto: create 
# 자동으로 table을 만들어주는 모드
#(애플리케이션 실행 시점에 내가 가지고 있는 엔티티 정보를 보고 다 지운 후 다시 생성)

show_sql: true 
# system.out에 출력 -> 
#운영 환경에서는 성능 이슈가 발생할 수 있기에 system.out에 찍으면 안됩니다
#전부 log로 찍어야 합니다.

org.hibernate.SQL: debug 
# JPA나 Hibernate가 생성하는 SQL이 모두 보이게 됩니다. -> log에 출력

 


동작 확인

 

yml 파일 설정이 끝났다면 동작 확인을 위해

간단한 엔티티 파일을 생성하고 DB 접근해서 테스트를 진행해 보겠습니다.

코드에 보이는 어노테이션은 이전 포스팅에서 다뤘기 때문에 설명은 생략하겠습니다.

 

먼저 테스트에 사용할 엔티티 매핑을 진행해 보겠습니다.

  • Member(Entity)
@Entity
@Getter @Setter
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String username;
}

 

엔티티 매핑을 통해 해당 클래스의 필드와 데이터베이스의 칼럼을 매핑하였고

id에 기본 키 자동 생성을 위한 @GeneratedValue 어노테이션을 추가했습니다.

 

다음으로는 DB 접근을 하기 위한 Repository 파일을 생성해 보겠습니다.

 

  • MemberRepository
@Repository
public class MemberRepository {

    @PersistenceContext
    private EntityManager em;

    public Long save(Member member){
        em.persist(member);
        return member.getId();
    }

    public Member find(Long id){
        return em.find(Member.class, id);
    }
}

 

JPA를 사용하려면 엔티티를 저장하는 메모리상의 데이터베이스인 EntityManager를 Spring에서 관리해 주기 위해 @PersistenceContext 어노테이션을 일반적으로 사용합니다.

@PersistenceContext를 사용하여 EntityManager를 주입받으면, Spring에서 EntityManager를 Proxy로 감싼 형태로 생성하여 주입해 주기 때문에 Thread-Safe를 보장합니다.

 

그렇다면 위 코드에서 Entity Manager를 생성하는 코드가 없는데 어떻게 사용할 수 있을까?

 

 

라이브러리 추가할 때 spring-boot-starter-data-jpa를 dependencies 하면 yml 설정 파일을 읽어서 자동으로 다 처리해 줍니다.

 

마지막으로 테스트를 통해 DB에 접근해서 값을 추가하여 동작이 제대로 되는지 확인해 보겠습니다.


Test Code 생성

 

저는 junit4를 사용해서 테스트를 진행하기 위해 dependencies에 추가해서 진행하였습니다.

 

 

 

  • MemberRepositoryTest
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    @Transactional
    @Rollback(value = false)
    public void testMember() throws Exception{
        //given
        Member member = new Member();
        member.setUsername("memberA");
        //when
        Long savedId = memberRepository.save(member);
        Member findMember =  memberRepository.find(savedId);

        //then
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        Assertions.assertThat(findMember).isEqualTo(member);
    }

}

 

위 테스트를 진행할 때  주의할 점은

Transaction을 해주지 않는다면 에러가 발생합니다.

그 이유는 Entity Manager를 통한 모든 데이터 변경은 트랜잭션을 통해 이루어져야 하기 때문입니다.

 

반대로 테스트가 끝난 후에도 데이터베이스의 변경 사항을 유지해서 확인하고 싶다면

@Rollback(value = false) 어노테이션을 추가해서 확인하는 방법도 있습니다.

 

위 코드를 통해서 Member 객체가 올바르게 저장되고 조회되는지를 검증해 보았습니다.

DB로 확인해 보겠습니다.

 

 

테스트 코드를 실행하고 DB에 접속해 보면 Member 테이블이 생성되고 memberA라는 데이터가 추가된 걸 확인할 수 있습니다.

 

위 테이블이 생성된 이유는 테스트 코드가 실행될 때 hibernate가 생성해 주는데, yml 파일에서 hibernate: ddl-auto 설정을 했기 때문입니다.

 


마치며

 

오늘은 JPA와 DB 설정하는 방법을 알아봤는데요.

비교적 간단하지만 위 설정을 기반으로 앞으로 JPA 포스팅을 이어가려고 합니다.

 

위 포스팅 글은 김영한님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발을 참고했습니다.

728x90