계속 널값이 뜬다고 오류가 뜨길래 코드에 문제가 있어서 정보를 못 읽어오는 줄 알고 삽질한 오류이다.

이후에 다시 생각해보니 객체 생성관련 문제인 것 같았다.

 

이전에 jdbc를 사용할 때와 달리 jpa는 객체 단위로 데이터를 처리한다.

해당 DTO 클래스에서 다른 객체의 서비스단,레포지토리단 코드를 활용해 다른 객체의 정보를 가져오는 코드들이 있었다.

생각해보니 다른 객체는 생성이 안된 상태이므로 객체 자체가 null이라 널포인터 에러가 뜨는 것 같았다. 그래서 DTO 클래스에 직접 해당 객체들을 주입해서 디버깅을 하려고 했는데 그러면 더이상 DTO가 아니라 서비스 클래스가 되는 문제가 생겼다.

어떻게 하면 좋을까 생각하다가 문제가 되는 다른 서비스단이나 레포지토리를 사용하는 코드들을 다 서비스단으로 옮겼다.

그리고 서비스에서 해당 코드를 통해 받은 값들을 파라미터에 넣어 DTO 생성자를 통해 값을 넣어줬다.

이 방식을 통해 에러를 디버깅할 수 있었다.

 

관련된 내가 작성한 코드는 아래와 같다.

DTO

package backend.whereIsMyTeam.board.dto;

import backend.whereIsMyTeam.board.domain.*;
import backend.whereIsMyTeam.board.repository.CommentRepository;
import backend.whereIsMyTeam.board.repository.PostLikeCustomRepository;
import backend.whereIsMyTeam.board.repository.PostLikeCustomRepositoryImpl;
import backend.whereIsMyTeam.board.service.PostLikeService;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GetBoardResponseDto {

    private Long boardIdx;
    private String category; //프로젝트, 스터디, 대회 중 1
   // @JsonFormat
    List<TechStackBoard> stackList= new ArrayList<>();; //모집하는 스택 기술들 리스트
    private String title;
    private postDetailDto detail;
    private String postText;
    private List<BoardStatus> boardStatus=new ArrayList<>(); //게시물 상태(삭제,임시저장,모집중,모집완료)
    private postUserDto writer; //게시물 작성자 정보
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "Asia/Seoul")
    private LocalDateTime createdAt;
    private Long watch;
    private Long heart; //찜 총 수
    private String isHeart; //해당 유저가 찜 눌렀는지 안눌렀는지
    private List<postCommentDto> commentList= new ArrayList<>();; //댓글 부분 작성자 인덱스와 comment 인덱스도


    public GetBoardResponseDto(Board post,Long heart, String isHeart,List<postCommentDto> c){
        this.boardIdx=post.getBoardIdx();
        this.category=post.getCategory().getCategoryName();
        this.title=post.getTitle();
        this.detail=new postDetailDto(post);
        this.postText=post.getContent();
        this.boardStatus=post.getBoardStatuses();
        this.writer= new postUserDto(post.getWriter()); //userImg 구현중
        this.createdAt=post.getCreateAt();
        this.watch=post.getCnt();
        this.heart=heart;
        this.isHeart=isHeart;
        this.commentList=c;
    }

    public GetBoardResponseDto(Board post,Long heart,List<postCommentDto> c){
        this.boardIdx=post.getBoardIdx();
        this.category=post.getCategory().getCategoryName();
        this.title=post.getTitle();
        this.detail=new postDetailDto(post);
        this.postText=post.getContent();
        this.boardStatus=post.getBoardStatuses();
        this.writer= new postUserDto(post.getWriter()); //userImg 구현중
        this.createdAt=post.getCreateAt();
        this.watch=post.getCnt();
        this.heart=heart;
        this.isHeart="not exist";
        this.commentList=c;
    }


}

 

/**
     * 게시물 단건 조회
     * @return GetBoardResponseDto
     */
    @Transactional
    public GetBoardResponseDto boardDetail(Long boardIdx,Long userIdx) {
        Optional<Board> optional = boardRepository.findByBoardIdx(boardIdx);
        if(optional.isPresent()) {
            Board board = optional.get();
            //방문자 수 1 증가
            board.setHitCnt(board.getHitCnt() + 1);
            boardRepository.save(board);
            //조회 로직 회원,비회원 구분 해야함
            if(userIdx!=0) { //회원
                long heart=postLikeRepository.findPostLikeNum(boardIdx);
                String isHeart=postLikeService.checkPushedLikeString(userIdx,boardIdx);
                List<postCommentDto> commentList=postCommentDto.toDtoList(commentRepository.findAllWithUserAndParentByBoardIdxOrderByParentIdxAscNullsFirstCommentIdxAsc(boardIdx));
                return new GetBoardResponseDto(boardRepository.findByBoardIdx(boardIdx).orElseThrow(BoardNotExistException::new),heart,isHeart,commentList);
            }
            else{ //비회원
                long heart=postLikeRepository.findPostLikeNum(boardIdx);
                List<postCommentDto> commentList=postCommentDto.toDtoList(commentRepository.findAllWithUserAndParentByBoardIdxOrderByParentIdxAscNullsFirstCommentIdxAsc(boardIdx));

                return new GetBoardResponseDto(boardRepository.findByBoardIdx(boardIdx).orElseThrow(BoardNotExistException::new),heart,commentList);
            }

        }
        else {
            throw new NullPointerException();
        }
    }

+ Recent posts