본문 바로가기
따라 공부하기/Spring boot 혼자 개발하는 웹 서비스

[Spring Boot]JPA 적용과 테스트 코드 작성

by DawIT 2020. 12. 22.
320x100

이 글은 이 책을 참고하여 쓰여졌습니다.

 

오늘은 데이터베이스를 사용하기 위해 필요한 JPA를 적용하고 간단한 테스트 코드를 작성해 보았다.

 

build.gradle

 

먼저 jpa와 h2 의존성을 추가해 준다. h2는 인메모리 관계형 데이터베이스로, 따로 설치가 필요 없을뿐더러 메모리 상에서 실행되기 때문에 테스트 용도로 많이 사용되는 데이터베이스라고 한다.

 

package com.david.book.springboot.domain.posts;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class Posts {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 500,nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT",nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title,String content,String author){
        this.title = title;
        this.content = content;
        this.author = author;
    }
}

 

포스트를 관리하게 될 Posts.java 이다

 

  • @Getter : 모든 필드의 Get 메소드를 자동 생성
  • @NoArgsConstructor : 기본 생성자 자동 추가
  • @Entity : 테이블과 연결될 클래스라는 것을 나타냄
  • @Id : 해당 테이블의 Primary Key 속성을 나타냄
  • @GeneratedValue : Primary Key의 생성 규칙을 나타냄, Spring Boot 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment 속성을 가진다고 함
  • @Column : 테이블의 칼럼을 나타내며, 굳이 안 써도 모든 필드가 칼럼이 되지만, 기본값 이외의 추가로 사용하고 싶은 옵션이 있다면 써줘야 함
  • @Builder : 해당 클래스의 빌더 패턴 클래스 생성, 생성자 상단에 표기 시, 생성자에 포함된 필드만 빌더에 포함

 

이제 Posts 클래스가 Database에 접근하게 하기 위해서 JpaRepository를 생성해야 한다.

 

PostsRepository.java

 

그냥 인터페이스 생성 후, JpaRepository<연결할 Entity 클래스,Primary Key 타입> 만 입력해줘도, 기본적인 CRUD 메소드가 자동으로 생성된다고 한다.

 

package com.david.book.springboot.domain.posts;


import org.junit.After;
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.context.junit4.SpringRunner;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

    @After
    public void cleanup(){
        postsRepository.deleteAll();
    }

    @Test
    public void 게시글저장_불러오기(){
        //given
        String title = "테스트 게시글";
        String content = "테스트 본문";

        postsRepository.save(Posts.builder()
        .title(title)
        .content(content)
        .author("jangdawit@gmail.com")
        .build());

        //when
        List<Posts> postsList = postsRepository.findAll();

        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
    }
}

 

JPA가 성공적으로 적용되었는지 테스트해보기 위한 코드이다.

 

  • @After : Junit에서 단위 테스트가 끝날 때마다 실행될 메소드를 지정 -> 여기서는 H2 DB를 테스트마다 초기화하기 위해 사용
  • postsRepository.save() : 해당 테이블에 insert 혹은 update 쿼리를 실행 (PK인 id가 있다면 update를, 없다면 insert를 실행)
  • postsRepository.findAll() : 해당 테이블에 있는 모든 데이터를 조회

 

 

이렇게 진행하고 테스트도 통과하였다. 그리고 테스트 시 log에서 실제로 실행된 쿼리를 확인하고 싶다면,

 

application.properties

 

application.properties 를 추가하고 첫 번쨰 옵션을 주면 된다.

 

 

이렇게 실제로 실행된 쿼리를 확인할 수 있다. 그런데 id 를 생성하는 문법이 좀 다른데 이것은 H2의 문법이 적용되어서 그렇다고 한다.

 

application.properties

 

MySQL의 문법으로 보고 싶다면 두 번쨰 옵션을 추가해주면 된다.

 

 

익숙한 문법으로 바뀐 것을 확인할 수 있다.

댓글