[E-2-3] 스프링 부트에서 JPA로 데이터베이스 조작

2020. 1. 30. 14:55Project E/Project E 파트2

반응형

프로젝트에 Spring Data Jpa 적용

 

의존성 등록

build.gradle

더보기
buildscript {
    ext {
        springBootVersion = '2.1.7.RELEASE'
    }
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group 'com.minokuma.book'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('com.h2database:h2')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

도메인 패키지 생성

 

src/main/java

com.minokuma.book.springboot

domain.posts

Posts.java

더보기
package com.minokuma.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;
    }
}

 


src/main/java

com.minokuma.book.springboot

domain.posts

PostsRepository.java 인터페이스

 

더보기
package com.minokuma.book.springboot.domain.posts;

import org.springframework.data.jpa.repository.JpaRepository;

public interface PostsRepository extends JpaRepository<Posts,Long> {

}

 


 

게시글 저장 불러오기

 

src/test/java

com.minokuma.book.springboot

domain.posts

PostsRepository.java 

 

더보기
package com.minokuma.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 retrieveBoardSave(){
        String title = "테스트 게시글";
        String content = "테스트 본문";

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

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

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

실행된 쿼리 확인

 

src/main/resources

application.properties

 

더보기
spring.jpa.show-sql=true

 


다시 테스트 파일을 실행하면, 쿼리문이 표시된다.

 

(*) 하지만, H2의 쿼리 문법적용으로 인해 create table 쿼리에 id bigint generated by default as identify 라는 옵션으로 생성된다.

출력 쿼리 로그를 MySQL 버전으로 변경한다.

 


MySQL 버전 출력 쿼리로그

 

src/main/resources

application.properties

 

더보기
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

 

이로 인해 JPA, H2에 대한 기본기능과 설정이 됐다.

 

적용 전

create table posts (

id bigint generated by default as identify

)

 

적용 후

create table posts (

id bigint not null auto_increment

)

 

반응형