Spring

스프링부트 게시판 만들기 - 3 (Board Entity, Repository, Service, Test)

it's woo 2022. 6. 28. 23:51

Board Entity, Repository, Service를 만들어 보고 Test를 통해 검증해보자

 

Board

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String title;

    @Column
    private String writer;

    @Column
    private String content;

    @Column
    private Integer view;

    @Builder
    public Board(String title, String writer, String content, Integer view) {
        this.title = title;
        this.writer = writer;
        this.content = content;
        this.view = view;
    }
}

Board는 5개의 필드 값을 가집니다.(id, 제목, 작성자, 내용, 조회수)

생성자나 Setter를 대신하여 @Builder를 사용합니다.

 

BoardRepository

 

JpaRepository를 상속받지 않고 직접 구현하여 보았습니다.

@Repository
@RequiredArgsConstructor
public class BoardRepository {

    private final EntityManager em;
    //게시글 저장
    public Long save(Board board) {
        em.persist(board);
        return board.getId();
    }
    //게시글 한개 찾기
    public Board findById(Long id) {
        return em.find(Board.class, id);
    }
    //전체 게시글 찾기
    public List<Board> findAll(){
        return em.createQuery("select m from Board m")
                .getResultList();
    }
}

BoardRepository는 3가지 기능이 있습니다.

  • save

전달받은 게시글을 저장하며 이를 통해 생성된 Id를 반환합니다.

  • findById

Id를 통하여 찾는 일치하는 게시글을 반환합니다.

  • findAll

전체 게시글을 List에 저장하여 반환합니다.

 

BoardService

@Service
@RequiredArgsConstructor
public class BoardService {

    private final BoardRepository boardRepository;

    @Transactional
    public Long save(Board board) {
        Long id = boardRepository.save(board);
        return id;
    }

    public Board findBoard(Long id){
        Board board = boardRepository.findById(id);
        return board;
    }

    public List<Board> findBoards() {
        List<Board> boardList = boardRepository.findAll();
        return boardList;
    }
}

Service 계층은 다음과 같다.

 

BoardServiceTest

@SpringBootTest
class BoardServiceTest {

    @Autowired
    BoardService boardService;

    @Autowired
    BoardRepository boardRepository;
    
    @Test
    @Transactional
    void save() {
        //given
        Board board = Board.builder()
                .title("hello")
                .content("hi")
                .writer("Lee")
                .view(1)
                .build();

        //when
        Long savedId = boardService.save(board);

        //Then
        Assertions.assertThat(board).isEqualTo(boardRepository.findById(savedId));
    }
}

 

 

게시글 추가가 정상적으로 이루어지는 확인하기 위한 테스트입니다.

Id는 @GeneratedValue로 자동 생성되기 때문에 만드는 실수는 하지 말자

테스트가 성공하여 정상적으로 작동함을 확인할 수 있습니다.

 

다음에는 BootStrap을 사용하여 화면을 만들고 Controller를 만들어 MVC패턴을 완성해 보자