s00jin 님의 블로그

8. [게시판] Spring Boot/Mysql을 사용한 CRUD 게시판 만들기 | Repository 생성 및 JUnit 테스트 본문

프로젝트/하고 싶은거 다해보는 내 사이트

8. [게시판] Spring Boot/Mysql을 사용한 CRUD 게시판 만들기 | Repository 생성 및 JUnit 테스트

s00jin 2025. 8. 21. 15:56

리포지터리 패키지 생성

우선 webBoard 패키지 안에 repository 패키지를 생성해줬다. (생략가능)


BoardRepository 생성

repository 패키지 안에 BoardRepository 파일을 생성해준 후 아래 코드를 작성한다.

package org.mySite.webBoard.repository;

import org.mySite.webBoard.domain.Board;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {

}


Comment Repository 생성

repository 패키지 안에 CommentRepository 파일 생성 후 아래 코드를 작성한다.

package org.mySite.webBoard.repository;

import org.mySite.webBoard.domain.Comment;
import org.springframework.data.jpa.repository.JpaRepository;

public interface CommentRepository extends JpaRepository<Comment, Long> {
}


JUnit으로 실행 테스트


JUnit 설치

JUnit을 사용하기 위해 설치해줘야 한다.

 

buil.gradle에 아래 코드를 작성한 후 새로 고침 해준다.

    // JUnit
    testImplementation 'org.junit.jupiter:junit-jupiter'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

JPA 작동 테스트 코드 작성

src/test/java 디렉터리의 org.mySite 패키지에 MySiteApplicationTests 파일을 만들고 아래 코드를 작성해줬다.

 

JPA가 정상적으로 작동하는 확인하기 위한 JUnit 테스트 코드이다.

package org.mySite;

import org.junit.jupiter.api.Test;
import org.mySite.webBoard.domain.Board;
import org.mySite.webBoard.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDateTime;

@SpringBootTest
class MySiteApplicationTests {

    @Autowired
    private BoardRepository boardRepository;

    @Test
    void testJpa() {
        Board b1 = new Board();
        b1.setSubject("안녕하세요");
        b1.setContent("jpa 테스트 중입니다");
        b1.setCreateDate(LocalDateTime.now());
        this.boardRepository.save(b1);
    }
}

 

@SpringBootTest

  • MySiteApplicationTests 클래스가 테스트 클래스임을 의미

@Autowired

  • 의존성 주입 (DI)
    • 스프링이 객체를 대신 생성하여 주입하는 것

@Test

  • testJpa 메서드가 테스트 메서드임을 나타냄

실행 시 테스트 성공


Repository 작동 테스트 코드 작성

위에 작성한 테스트 코드에서 추가해줬다.

package org.mySite;

import org.junit.jupiter.api.Test;
import org.mySite.webBoard.domain.Board;
import org.mySite.webBoard.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
class MySiteApplicationTests {

    @Autowired
    private BoardRepository boardRepository;

    @Test
    void testJpa() {
        Board b1 = new Board();
        b1.setSubject("안녕하세요");
        b1.setContent("jpa 테스트 중입니다");
        b1.setCreateDate(LocalDateTime.now());
        this.boardRepository.save(b1);

        List<Board> all = this.boardRepository.findAll();
        assertEquals(1, all.size());

        Board b = all.get(0);
        assertEquals("안녕하세요", b.getSubject());

        Optional<Board> oq = this.boardRepository.findById(1L);
        if (oq.isPresent()){
            Board bb = oq.get();
            assertEquals("안녕하세요", bb.getSubject());
        }
    }
}

 

assertEquals(기댓값, 실제값)

  • 기댓값과 실제값이 동일한지 조사

findById()

  • id 값으로 데이터를 조회
  • 호출한 값이 존재할 수도 있고, 존재하지 않을 수도 있어 리턴 타입으로 Optional 사용

Optional

  • null값을 유연하게 처리하기 위한 클래스
  • isPresent() 메서드로 값이 존재하는 확인
    • 존재한다면 get 메서드를 통해 값을 얻음

findBy+속성명

Repository에서 findBy+속성명을 정의하여, 해당 속성으로 데이터 조회가 가능하게 해줬다.

package org.mySite.webBoard.repository;

import org.mySite.webBoard.domain.Board;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {
    Board findBySubject(String subject);
    Board findBySubjectAndContent(String subject, String content);
}

 

findBy + 엔티티의 속성명

  • 입력한 속성의 값으로 데이터 조회 가능
  • 데이터를 조회하는 쿼리문의 where 조건을 결정하는 역할
  • 두 개의 열을 조회하기 위해서는 And 연산자 사용하면 됨 (ex. findBySubjectAndContent)

출처 : 점프 투 스프링부트 본문


특정 문자열 데이터 조회

package org.mySite.webBoard.repository;

import org.mySite.webBoard.domain.Board;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface BoardRepository extends JpaRepository<Board, Long> {
    Board findBySubject(String subject);
    Board findBySubjectAndContent(String subject, String content);
    // 특정 문자열 포함하는 지 데이터 조회
    List<Board> findBySubjectLike(String subject);
}

 

위에 코드에서 추가해줬다.

 

Like 사용

  • 특정 문자열을 포함하는 데이터 조회

 

테스트 코드 추가

테스트 코드는 작성할 때마다 테스트 파일을 실행시켜보면 좋다!

package org.mySite;

import org.junit.jupiter.api.Test;
import org.mySite.webBoard.domain.Board;
import org.mySite.webBoard.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
class MySiteApplicationTests {

    @Autowired
    private BoardRepository boardRepository;

    @Test
    void testJpa() {
        // jpa
        Board b1 = new Board();
        b1.setSubject("안녕하세요");
        b1.setContent("jpa 테스트 중입니다");
        b1.setCreateDate(LocalDateTime.now());
        this.boardRepository.save(b1);

        // repository
        List<Board> all = this.boardRepository.findAll();
        assertEquals(1, all.size());

        Board b = all.get(0);
        assertEquals("안녕하세요", b.getSubject());

        // findById
        Optional<Board> oq = this.boardRepository.findById(1L);
        if (oq.isPresent()){
            Board bb = oq.get();
            assertEquals("안녕하세요", bb.getSubject());
        }

        // findBySubject
        Board qq = this.boardRepository.findBySubject("안녕하세요");
        assertEquals(1, qq.getId());

        // findBySubjectAndContent
        Board sc = this.boardRepository.findBySubjectAndContent("안녕하세요", "jpa 테스트 중입니다");
        assertEquals(1, sc.getId());

        // like
        List<Board> bList = this.boardRepository.findBySubjectLike("안녕%");
        Board bL = bList.get(0);
        assertEquals("안녕하세요", bL.getSubject());
    }
}


댓글 데이터 저장 테스트 코드

package org.mySite;

import org.junit.jupiter.api.Test;
import org.mySite.webBoard.domain.Board;
import org.mySite.webBoard.domain.Comment;
import org.mySite.webBoard.repository.BoardRepository;
import org.mySite.webBoard.repository.CommentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
class MySiteApplicationTests {

    @Autowired
    private BoardRepository boardRepository;

    @Autowired
    private CommentRepository commentRepository;

    @Test
    void testJpa() {
        // jpa
        Board b1 = new Board();
        b1.setSubject("안녕하세요");
        b1.setContent("jpa 테스트 중입니다");
        b1.setCreateDate(LocalDateTime.now());
        this.boardRepository.save(b1);

        // repository
        List<Board> all = this.boardRepository.findAll();
        assertEquals(1, all.size());

        Board b = all.get(0);
        assertEquals("안녕하세요", b.getSubject());

        // findById
        Optional<Board> oq = this.boardRepository.findById(1L);
        if (oq.isPresent()){
            Board bb = oq.get();
            assertEquals("안녕하세요", bb.getSubject());
        }

        // findBySubject
        Board qq = this.boardRepository.findBySubject("안녕하세요");
        assertEquals(1, qq.getId());

        // findBySubjectAndContent
        Board sc = this.boardRepository.findBySubjectAndContent("안녕하세요", "jpa 테스트 중입니다");
        assertEquals(1, sc.getId());

        // like
        List<Board> bList = this.boardRepository.findBySubjectLike("안녕%");
        Board bL = bList.get(0);
        assertEquals("안녕하세요", bL.getSubject());

        // comment test
        Comment c = new Comment();
        c.setContent("안녕하세용가리빵");
        c.setBoard(bL);
        c.setCreateDate(LocalDateTime.now());
        this.commentRepository.save(c);
    }
}

 

위에 comment test 부분을 테스트 파일에 추가해주고 실행하면 댓글이 정상적으로 추가된 것을 확인할 수 있다.