Mary's log 2024. 10. 19. 23:43

 

JPA는 sql 쿼리를 직접 쓰는 대신 함수로 대체.

h2는 따로 로컬에 설치하지 않고 인메모리로 사용하는 데이터베이스, 앱을 재시작할때마다 초기화돼서 테스트용으로 잘 쓰임.

 

 

 

build.gradle.kts

 

AS-IS

plugins {
    id ("org.springframework.boot") version ("2.7.1")
    id ("io.spring.dependency-management") version ("1.0.11.RELEASE")
    id("java")
}

group = "com.jojoldu.book"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("junit:junit:4.13.1")
    compileOnly("org.projectlombok:lombok")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation(platform("org.junit:junit-bom:5.10.0"))
    testImplementation("org.junit.jupiter:junit-jupiter")
}

tasks.test {
    useJUnitPlatform()
}

 

TO-BE

plugins {
    id ("org.springframework.boot") version ("2.7.1")
    id ("io.spring.dependency-management") version ("1.0.11.RELEASE")
    id("java")
}

group = "com.jojoldu.book"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("junit:junit:4.13.1")

    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("com.h2database:h2")
    
    compileOnly("org.projectlombok:lombok")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation(platform("org.junit:junit-bom:5.10.0"))
    testImplementation("org.junit.jupiter:junit-jupiter")
}

tasks.test {
    useJUnitPlatform()
}

 

h2 디비와 connect 되고 수행되는 query문을 확인하기 위한 설정 파일 생성.

 

src.main.resources \ application.properties 생성

# jpa sql show setting
spring.jpa.show_sql=true

# h2 : create table - id setting
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.datasource.hikari.jdbc-url=jdbc:h2:mem://localhost/~/testdb;MODE=MYSQL

* properties 주석은 # 으로 시작.  한글로 적어도 되지만, 나중에 파일 설정 잡지 않으면 한글이 깨져서

  걍 귀찮아서 알아보기 쉬운 영어로 주석 적어둠...

* 마지막 설정 추가 이유 : 현재 내 로컬 플젝의 JDBC URL 설정이 application.properties와 달라서 오류 발생. (참고 문헌 링크)

  오류가 없다면 추가 안해도 됨. (게시글 하단에 오류나서 여기에 미리 추가해줌)

 


 

src.main.java.com.jojoldu.springboot.domain.posts 경로 생성

src.main.java.com.jojoldu.springboot.domain.posts \ class Posts.java 생성

package com.jojoldu.springboot.domain.posts;

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

import javax.persistence.*;

@Getter // lombok
@NoArgsConstructor
@Entity // for JPA
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.jojoldu.springboot.domain.posts \ interface PostsRepository.java 생성

package com.jojoldu.springboot.domain.posts;

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

public interface PostsRepository extends JpaRepository<Posts, Long> {
    
}

 

 

 


test.java.com.jojoldu.book.springboot.domain.posts\ class PostRepositoryTest.java 생성

package com.jojoldu.springboot.domain.posts;

import org.junit.Test;
import org.junit.After;
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.AssertionsForClassTypes.assertThat;

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

    @Autowired
    PostsRepository postsRepository;

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

    @Test
    public void readPosts(){
        String title = "테스트 게시글";
        String content = "테스트 본문";

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

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

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

 

@Test 어노테이션이 달려있는

readPosts 함수를 테스트한다.

 

 

 

위에서 h2 디비와 connect해서 sql query를 어떻게 날리는지 설정했던 결과의 로그는

Hibernate: 로 시작하는 로그에서 확인 가능.

 

h2 create table 의 id 설정 여부도.... 이 'MySQL57Dialect' 설정값을 추가하기 전까진 잘됐는데ㅠ...

추가하자마자 Error executing DDL create table 오류난다...ㅠ 그래서 application.properties에 'jdbc-url' 설정을 추가.