[Spring Boot] aLog Project - JPA 사용하기

김광현·2023년 8월 30일
0

Project - aLog

목록 보기
2/12
post-thumbnail

[Spring Boot] aLog Project - 환경세팅 에 이어서 환경세팅을 진행합니다. 🏆


build.gradle

build.gradle 에 jpa와 h2 의존성을 추가 작성합니다.

// jpa 의존성
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

// h2 의존성
runtimeOnly 'com.h2database:h2'


Posts.java

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 메소드를 만들지 않습니다.


PostsRepository.java

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

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에 있는 모든 데이터를 조회해오는 메소드입니다.


application.yml

아래 코드를 작성합니다.

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만 추가하면 오류가 생깁니다.
추가 작성(변경) 코드는 [기억보단 기록을] 블로그 를 참고했습니다.


✔ 다음 포스트와 내용이 이어집니다. 👏

profile
🅸nterest 🆂olving 🆃horough 🅹udgment

0개의 댓글