개발일지/2023_한이음
[spring boot] 게시판(이미지 처리) Create, Read 기능 구현
기억지기 개발자
2023. 8. 5. 20:47
🏕️상황
- 원래 게시판 쪽은 내 담당이 아니었지만 사성으로 인하여 게시판도 내가 맡게 되었다.
- 이번에 내가 맡으면서 글 작성만 가능했던 게시판에 이미지 기능도 추가하였다.
🗝️개발 코드
게시글 작성 코드
// BoardService
public ResponseDTO<?> create(final Board entity, final List<MultipartFile> imageList) {
try {
validate(entity);
boardRepository.save(entity); //이미지를 뺀 나머지 컬럼 저장
imageService.upload(imageList, entity.getId()); //이미지 저장 코드
return ResponseDTO.success(boardRepository.findById(entity.getId()));
} catch (Exception e) {
String error = e.getMessage();
return ResponseDTO.fail("Error", error);
}
}
게시글 전체 조회
//BoardRepositoryImpl
@Override
public List<BoardWithImageDTO> findBoardList(Long schId, Long cateNo) {
QBoard qBoard = QBoard.board;
QImage qImage = QImage.image;
List<Tuple> tuples = jpaQueryFactory
.select(qBoard, qImage.imageUrl)
.from(qBoard)
.leftJoin(qImage)
.on(qImage.boardId.eq(qBoard.id))
.where(qBoard.school.id.eq(schId))
.where(qBoard.category.eq(cateNo))
.fetch();
Map<Board, List<String>> boardImageMap = new HashMap<>();
tuples.forEach(tuple -> {
Board board = tuple.get(qBoard);
String imageUrl = tuple.get(qImage.imageUrl);
if (imageUrl != null) {
boardImageMap.computeIfAbsent(board, k -> new ArrayList<>()).add(imageUrl);
}
});
List<BoardWithImageDTO> resultList = boardImageMap.entrySet().stream()
.map(entry -> new BoardWithImageDTO(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
return resultList;
}
게시글 상세 조회
// BoardRepositoryImpl
@Override
public Optional<ResponseBoardDTO> findBoardDetail(Long userNo, Long boardId) {
QBoard qBoard = QBoard.board;
QHeart qHeart = QHeart.heart;
QImage qImage = QImage.image;
ResponseBoardDTO responseBoardDTO = jpaQueryFactory
.select(new QResponseBoardDTO(qBoard, qHeart, qBoard.user))
.from(qBoard)
.leftJoin(qHeart)
.on(qBoard.id.eq(qHeart.board.id))
.on(qHeart.user.id.eq(userNo))
.fetchJoin()
.where(qBoard.id.eq(boardId))
.fetchOne();
List<String> imageUrls = jpaQueryFactory
.select(qImage.imageUrl)
.from(qImage)
.where(qImage.boardId.eq(boardId))
.fetch();
assert responseBoardDTO != null; //responseBoardDTO의 null값 여부 확인
responseBoardDTO.setImageUrls(imageUrls);
return Optional.of(responseBoardDTO);
}
