첨부파일이 있는 게시물은 각 작업에 따라서 엔티티 설계와 다르게 처리될 부분이 많기때문에 엔티티 클래스와 달리 DTO 클래스는 상황에 따라 여러 개의 클래스를 작성해서 처리하도록 함
게시물 등록 시에 첨부파일은 이미 업로드된 파일의 정보를 문자열로 받아서 처리, 따라서 등록에 사용할 BoardDTO에는 파일 이름을 리스트로 처리하도록 구성

BoardDTO의 List<String> fileNames는 Board에서 Set<BoardImage> 타입으로 변환되어야함
기존의 ModelMapper는 단순한 구조의 객체를 다른 타입의 객체로 만드는 데는 편리하지만 다양한 처리가 필요한 경우에는 오히려 더 복잡하기 때문에 DTO 객체를 엔티티 객체로 변환하는 메소드를 작성하도록 한다
BoardService 인터페이스가 DTO와 엔티티를 모두 처리하는 경우가 많으므로 BoardService 인터페이스의 default 메소드를 이용해서 이를 처리해보도록 함

추가된 dtoToEntity()를 이용해서 BoardServiceImpl의 register()를 수정하고 테스트 코드를 이용해서 확인
BoardServiceImpl

BoardServiceTests

결과


x3출력
testRegisterWithImages()는 하나의 게시물에 3개의 이미지 파일이 추가된 경우를 테스트
실행 결과에는 board 테이블과 board_image 테이블에 insert 문이 실행되는지 확인
Board 엔티티 객체를 BoardDTO 타입으로 변환하는 처리 역시 BoardService 인터페이스의 default 메소드를 이용해서 처리
BoardService

BoardServiceImpl에서는 entityToDTO()를 이용해서 BoardDTO를 반환하도록 수정
BoardServiceImpl

readOne()에서는 @EntityGraph를 이용하는 findByIdWithImages()를 이용
BoardServiceTests

testReadAll() 테스트 시에 첨부파일이 있는 게시물의 번호를 이용해서 게시물과 첨부파일의 정보가 한번에 처리되는지 확인


게시물 수정 시 첨부파일은 아예 새로운 파일로 대체되기 때문에 Board의 clearImages()를 실행한 후에 새로운 파일들의 정보를 추가하도록 구성
Board

테스트 코드는 첨부파일이 있는 게시물을 대상으로 첨부파일을 변경할 것

testModify()는 Board 객체의 BoardImage들을 삭제하고 새로운 첨부파일 하나만을 가지도록 변경
testModify()를 실행한 후에 testReadAll()을 이용해서 수정된 게시물을 조회
게시물의 삭제 처리는 '댓글'이 존재하지 않는 경우만을 고려해서 작성
만일 댓글이 있는 경우에도 삭제하려면 ReplyRepository를 BoardService에 주입하고 특정한 게시물의 모든 댓글을 삭제한 후에 게시물을 삭제하도록 작성
Board 클래스에는 CascadeType.ALL과 orphanRemoval 속성값이 true로 지정되어 있으므로 게시물이 삭제되면 자동으로 해당 게시물의 BoardImage 객체들도 같이 삭제되도록 구성
BoardServiceTests

테스트 코드의 1번 게시글은 2개의 첨부파일이 있으므로 먼저 board_image 테이블에서 2번의 delete가 실행되고 board 테이블에서 삭제가 일어나게 됨

BoardService의 마지막은 검색과 페이징 처리가 필요한 목록을 처리하는 기능의 구현
Querydsl을 적용하기 전에 이미 BoardService에 listWithAll()을 정의해 둔 상태
BoardService

BoardServiceImpl에는 BoardListAllDTO 타입으로 반환되는 게시물 목록을 PageResponseDTO로 처리
BoardServiceImpl

목록 데이터를 테스트하는 코드 ↓
BoardServiceTests

테스트 코드를 실행한 결과 게시글의 첨부파일이 존재하는 경우 모든 첨부파일의 순번(ord)대로 출력하는 것을 확인 가능.