개발일지/2023_한이음

[spring boot] 게시판(이미지 처리) Create, Read 기능 구현

기억지기 개발자 2023. 8. 5. 20:47

🏕️상황

post men

  • 원래 게시판 쪽은 내 담당이 아니었지만 사성으로 인하여 게시판도 내가 맡게 되었다.
  • 이번에 내가 맡으면서 글 작성만 가능했던 게시판에 이미지 기능도 추가하였다.

성공한 post men 화면

 

🗝️개발 코드

게시글 작성 코드

// 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);
    }