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' 설정을 추가.
'스프링부트와 AWS로 혼자 구현하는 웹서비스' 카테고리의 다른 글
08. CRUD API 만들기2 (0) | 2024.10.20 |
---|---|
07. CRUD API 만들기 (0) | 2024.10.20 |
05. 롬복 플러그인 설치 후 테스트 (0) | 2024.10.19 |
04. Hello Controller 테스트 코드 작성하기 (0) | 2024.10.19 |
03. Gradle 프로젝트 만들기 (0) | 2024.10.19 |