[코드로 배우는 스프링부트 웹 프로젝트] - 연관관계(2) : Repository와 테스트 데이터 생성

Jongwon·2023년 1월 2일
0

다음으로는 JpaRepository를 상속받는 인터페이스를 생성하겠습니다.

MemberRepository

package org.zerock.board.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.board.entity.Member;

public interface MemberRepository extends JpaRepository<Member, String> {
}

BoardRepository

package org.zerock.board.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.board.entity.Board;

public interface BoardRepository extends JpaRepository<Board, Long> {
}

ReplyRepository

package org.zerock.board.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.board.entity.Reply;

public interface ReplyRepository extends JpaRepository<Reply, Long> {
}

다음으로는 테스트코드를 생성하겠습니다.

테스트 아래에 RepositoryTests들을 생성합니다.

먼저 MemberRepositoryTests에서 100명의 멤버를 생성하여 DB에 저장합니다.

MemberRepositoryTests

package org.zerock.board.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.board.entity.Member;

import java.util.stream.IntStream;

@SpringBootTest
public class MemberRepositoryTests {

    @Autowired
    private MemberRepository memberRepository;

    @Test
    public void insertMembers() {
        IntStream.rangeClosed(1,100).forEach(i -> {
            Member member = Member.builder()
                    .email("user" + i + "@aaa.com")
                    .password("1111")
                    .name("USER" + i)
                    .build();

            memberRepository.save(member);
        });
    }
}

다음으로는 BoardRepositoryTests에서 100개의 Board를 생성합니다. 멤버는 테스트에서 id값인 email만 지정하여 생성한 후, 게시판에 넣어줍니다.

BoardRepositoryTests

package org.zerock.board.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.board.entity.Board;
import org.zerock.board.entity.Member;

import java.util.stream.IntStream;

@SpringBootTest
public class BoardRepositoryTests {

    @Autowired
    private BoardRepository boardRepository;

    @Test
    public void insertBoard() {

        IntStream.rangeClosed(1, 100).forEach(i -> {
            Member member = Member.builder().email("user"+i+"@aaa.com").build();

            Board board = Board.builder()
                    .title("Title..."+i)
                    .content("Content..."+i)
                    .writer(member)
                    .build();

            boardRepository.save(board);
        });
    }
}

마지막으로 임의의 게시글을 대상으로 댓글을 추가하는 테스트를 ReplyRepositoryTests에 추가합니다.

ReplyRepositoryTests

package org.zerock.board.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.board.entity.Board;
import org.zerock.board.entity.Reply;

import java.util.stream.IntStream;

@SpringBootTest
public class ReplyRepositoryTests {

    @Autowired
    private ReplyRepository replyRepository;

    @Test
    public void insertReply() {
        IntStream.rangeClosed(1, 300).forEach(i -> {
            long bno = (long)(Math.random()*100) + 1;

            Board board = Board.builder().bno(bno).build();

            Reply reply = Reply.builder()
                    .text("Reply........" + i)
                    .board(board)
                    .replier("guest")
                    .build();

            replyRepository.save(reply);
        });
    }
}

연관관계가 설정된 엔티티 사이에서 검색 등의 작업이 발생하면, Join연산이 발생하게 됩니다. 글이 길어질 수 있어 Join과 Lazy Loading에 관해서는 다음 글에 작성하고자 합니다.

profile
Backend Engineer

0개의 댓글