프로젝트 와사비는 WiSoft 연구실의 기술 블로그를 제작하는 프로젝트이다.

요구사항에는 게시글에는 여러 사진이 포함될 수 있다가 존재하며, 아래와 같이 코드를 작성 할 수 있다.

💡 초기 설계

BoardService

@Transactional
public WriteBoardResponse writeBoard(final WriteBoardRequest request) {

		...

		final Board board = ... //게시글 생성 코드
		**boardRepository.save(board); //게시글 저장**

		final String[] images = request.imageUrls();
		if (images != null) {
		    Arrays.stream(images)
		        .forEach(image -> {
								final BoardImage boardImage 
										= BoardImage.createBoardImage(image, board);
								**boardImageRepository.save(boardImage); //게시글 이미지 저장**
								});
		}

    return boardMapper.entityToWriteBoardResponse(board);
}

현재 게시글 저장 & 게시글 이미지 저장 로직이 각각 호출되는 상황이다.

→ 이를 하나로 합칠 수는 없을까? ex) 게시글이 저장되면.. 게시글 이미지가 저장되도록..

💡 1차 개선

Board.java : cascade 설정 변경

@Entity
public class Board {

		...

		@OneToMany(mappedBy = "board", **cascade = CascadeType.PERSIST**)
    private Set<BoardImage> boardImages = new HashSet<>();
}

수정된 BoardService

@Transactional
public WriteBoardResponse writeBoard(final WriteBoardRequest request) {

		final Board board = ... // 게시글 생성 코드

		boardRepository.save(board); //게시글 저장
    saveImages(board, request);  //이미지 저장

    return boardMapper.entityToWriteBoardResponse(board);
}

private void saveImages(final Board board, final WriteBoardRequest request) {

		final String[] images = request.imageUrls();

	  if (images != null) {
		    Arrays.stream(images) //매핑 후 저장 로직을 호출하지 않음.
		        .map(image -> BoardImage.createBoardImage(image, board))
	          .toList();
		}
}