[Spring Boot] aLog Project - 환경세팅 에 이어서 환경세팅을 진행합니다. 🏆
build.gradle
에 jpa와 h2 의존성을 추가 작성합니다.
// jpa 의존성
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// h2 의존성
runtimeOnly 'com.h2database:h2'
domin
패키지에 Posts 패키지와 Posts 클래스를 만듭니다.
package com.aLog.entity;
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;
}
}
📁 코드 설명
1. @Entity
- 테이블과 링크될 클래스임을 나타냅니다.
-기본`값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭합니다.
- ex) HelloController.java → hello_controller.java
2. @Id
- 해당 테이블의 PK 필드를 나타냅니다.
3. @GeneratedValue
- PK의 생성 규칙을 나타냅니다.
4. @Column
- 테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 됩니다.
5. @NoArgsConstructor
- 기본 생성자 자동 추가
- public Posts() {}와 같은 효과
6. @Builder
- 해당 클래스의 빌더 패턴 클래스를 생성
- 생성자 상단에 선언 시 생성자에 포함된 필드만 빌드에 포함
⚠️ Entity 클래스에서는 절대 Setter 메소드를 만들지 않습니다.
Post.java로 Database를 접근하게 해 줄 JpaRepository를 생성합니다.
package com.aLog.domain.posts;
import com.aLog.domain.posts.Posts;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
⚠️ Entity 클래스와 기본 Repository는 함께 움직여야 하므로 도메인 패키지에서 함께 관리합니다.
PostsRepositoryTest.java에서는 save
, findAll
기능을 테스트합니다.
package com.aLog.repository;
import com.aLog.domain.posts.Posts;
import com.aLog.domain.posts.PostsRepository;
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 게시글저장_불러오기() {
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("invdev778@gmail.com")
.build());
List<Posts> postsList = postsRepository.findAll();
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
}
📁 코드 설명
1. @After
- Junit에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정
- 배포 전 전체 테스트를 수행할 때 테스트간 데이터 침범을 막기 위해 사용합니다.
2. postsRepository.save
- 테이블 posts에 insert/update 쿼리를 실행합니다.
- id 값이 있다면 update, 없다면 insert 쿼리가 실행됩니다.
3. postsRepository.findAll
- 테이블 posts에 있는 모든 데이터를 조회해오는 메소드입니다.
아래 코드를 작성합니다.
spring:
jpa:
show_sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.MySQL8Dialect
storage_engine: innodb
datasource:
hikari:
jdbc-url: jdbc:h2:mem://localhost/~/testdb;MODE=MYSQL
📁 코드 설명
1. show_sql: true
- 콘솔에서 쿼리 로그를 확인하는 코드입니다.
2. dialect: org.hibernate.dialect.MySQL8Dialect
- 출력되는 쿼리 로그를 MySQL 버전으로 변경해주는 코드입니다.
Spring Boot 버전이 올라가면서 기존 dialect: org.hibernate.dialect.MySQL8Dialect
만 추가하면 오류가 생깁니다.
추가 작성(변경) 코드는 [기억보단 기록을] 블로그 를 참고했습니다.
✔ 다음 포스트와 내용이 이어집니다. 👏