Coding Note

JPA로 데이터베이스 다루기! 본문

SpringBoot/AWS_PJ

JPA로 데이터베이스 다루기!

jinnkim 2022. 3. 8. 09:00

 

 

스프링에서 JPA로 데이터베이스 다루기

 


 

1.  domain 패키지 생성하고 posts 패키지 생성 후 클래스 인터페이스 생성

도메인(소프트웨어 요구사항)을 담을 패키지를 생성한다.

기존 MyBatis은 쿼리 매퍼를 사용하여 dto 패키지를 떠올리지만 다름.

 

 

 

- Posts 클래스 코드

package com.bs.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;
    }
}

 

< 간략히 코드 공부하기 >

@Entity

- 테이블과 링크될 클래스임

- Setter 클래스를 만들지 않음

 

 

 @Id

- 해당 테이블의 PK 필드를 나타냄

 

@GeneratedValue

- PK의 생성 규칙을 나타냄

 

 @Column

- 테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 됨

- 사용하는 이유는 기본 값

 

@NoArgsConstructor

- 기본 생성자 자동 추가

- public Posts() {}와 같은 효과

 

@Getter

- 클래스 내 모든 필드의 Getter 메소드를 자동 생성

 

@Builder

- 해당 클래스의 빌더 패턴 클래스를 생성

- 생성자 상단에 선언시 생성자에 포함된 빌드만 빌더에 포함

 

 

 

- PostsRepository 인터페이스

package com.bs.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.AssertionsForClassTypes.assertThat;

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

    @Autowired
    PostsRepository postsRepository;

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

    @Test
    public void 게시글저장_불러오기() {
        //given
        String title = "테스트게시글";
        String content = "테스트본문";

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

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

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

    }
}

 

 

 

 

- PostsRepositoryTest

아래 사진과 동일하게 패키지, 클래스를 생성한다.

 

 

package com.bs.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.AssertionsForClassTypes.assertThat;

@RunWith(SpringRunner.class)
//H2 데이터베이스를 자동으로 실행해줌
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

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

    @Test
    public void 게시글저장_불러오기() {
        //given
        String title = "테스트게시글";
        String content = "테스트본문";

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

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

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

    }
}

 

< 간략히 코드 공부하기 >

 

 @After

- Junit에서 단위테스트가 끝날 때마다 수행되는 메소드를 지정함

- 보통은 배포 전 전체 테스트를 수행할때 테스트 간 데이터 침범을 막기 위해 사용함.

- 여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그대로 남아있어 다음 테스트 실행 시 테스트가 실패할 수 있음

 

 

postsRepository.save

- 테이블 posts에 insert/update 쿼리를 실행합니다.

- id 값이 있다면 update, 없으면 insert 쿼리가 실행됩니다.

 

postsRepository.findAll();

- 테이블 posts에 있는 모든 데이터를 조회

 

 

 

 

2. 결과 

 

 

 

3. 실행된 쿼리는 어떤 형태일까?

src/main/java/resources 디렉토리 아래 파일 생성

spring.jpa.show-sql=true

 

콘솔에서 쿼리 로그를 확인할 수 있음!!

 

 

 

4. MySQL 쿼리 로그 확인

출력되는 쿼리 로그를 MySQL 버전으로 변경해보자!

application.properties 파일에 아래 코드 추가 후 테스트 코드를 수행하면 잘 적용된 걸 확인할 수 있다.

import org.springframework.boot.autoconfigure.SpringBootApplication;

 

 

완성!!

 

오류는 오답에서 발생했으나 무사히 해결 완성!

Comments