JPA 문제

23.11.16 19:34 작성 조회수 68

0

 public ResponseEntity<?> updateBoard(Long boardId,
                                         CreateBoardDTO boardDTO,
                                         String memberEmail) {
        try {
            // 게시글 조회
            BoardEntity findBoard = boardRepository.findByBoardId(boardId)
                    .orElseThrow(EntityNotFoundException::new);
            log.info("게시글 닉네임 : " + findBoard.getMember().getNickName());
            // 유저 조회
            MemberEntity findUser = memberRepository.findByEmail(memberEmail);
            log.info("유저 : " + findUser);

            // 받아온 유저를 조회하고 그 유저 정보와 게시글에 담긴 유저가 일치하는지
            boolean equalsEmail = findUser.getEmail().equals(findBoard.getMember().getEmail());
            if(equalsEmail) {
                // 수정할 내용, 유저정보, 게시글을 작성할 때 받은 상품의 정보를 넘겨준다.
                findBoard = BoardEntity.builder()
                        .boardId(findBoard.getBoardId())
                        .title(boardDTO.getTitle())
                        .content(boardDTO.getContent())
                        .item(findBoard.getItem())
                        .member(findBoard.getMember())
                        .boardSecret(BoardSecret.UN_LOCK)
                        .build();
                BoardEntity updateBoard = boardRepository.save(findBoard);
                BoardDTO returnBoard = BoardDTO.toBoardDTO(updateBoard, findUser.getNickName());
                log.info("게시글 : " + returnBoard);
                return ResponseEntity.ok().body(returnBoard);
            } else {
                return ResponseEntity.badRequest().body("일치하지 않습니다.");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.badRequest().body("수정하는데 실패했습니다. : " + e.getMessage());
        }
    }
package com.example.shopping.entity.board;

import com.example.shopping.domain.board.BoardDTO;
import com.example.shopping.domain.board.BoardSecret;
import com.example.shopping.domain.board.CreateBoardDTO;
import com.example.shopping.domain.comment.CommentDTO;
import com.example.shopping.entity.Base.BaseEntity;
import com.example.shopping.entity.comment.CommentEntity;
import com.example.shopping.entity.item.ItemEntity;
import com.example.shopping.entity.member.MemberEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity(name = "board")
@Table
@Getter
@NoArgsConstructor
public class BoardEntity extends BaseEntity {
    @Id
    @GeneratedValue
    @Column(name = "board_id")
    private Long boardId;

    @Column(length = 300, nullable = false)
    private String title;
    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private MemberEntity member;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "item_id")
    private ItemEntity item;

    @Enumerated(EnumType.STRING)
    private BoardSecret boardSecret;


    // 댓글
    // 여기에 적용해야 합니다. 보통 게시물을 삭제해야 이미지가 삭제되므로
    // 게시물이 주축이기 때문에 여기에 cascade = CascadeType.ALL을 추가
    // orphanRemoval = true도 게시글을 삭제하면
    // 댓글도 삭제되므로 여기서 작업을 해야합니다.
    @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true)
    @OrderBy("commentId asc ")
    private List<CommentEntity> commentEntityList = new ArrayList<>();

    @Builder
    public BoardEntity(Long boardId,
                       String title,
                       String content,
                       MemberEntity member,
                       ItemEntity item,
                       BoardSecret boardSecret,
                       List<CommentEntity> commentEntityList) {
        this.boardId = boardId;
        this.title = title;
        this.content = content;
        this.member = member;
        this.item = item;
        this.boardSecret = boardSecret;
        this.commentEntityList = commentEntityList;
    }

    // 게시글 DTO를 엔티티로 변환
    public static BoardEntity toBoardEntity(BoardDTO board,
                                            MemberEntity member,
                                            ItemEntity item) {
        BoardEntity boardEntity = com.example.shopping.entity.board.BoardEntity.builder()
                .boardId(board.getBoardId())
                .title(board.getTitle())
                .content(board.getContent())
                .member(member)
                .item(item)
                .build();

        // 댓글 처리
        List<CommentDTO> commentDTOList = board.getCommentDTOList();

        for (CommentDTO commentDTO : commentDTOList) {
            CommentEntity commentEntity = CommentEntity.toCommentEntity(commentDTO, member, boardEntity);
            boardEntity.commentEntityList.add(commentEntity);
        }
        return boardEntity;
    }

    /* 비즈니스 로직 */
    // 게시글 작성
    public static BoardEntity createBoard(CreateBoardDTO boardDTO,
                                          MemberEntity member,
                                          ItemEntity item) {
        return com.example.shopping.entity.board.BoardEntity.builder()
                .title(boardDTO.getTitle())
                .content(boardDTO.getContent())
                // 본인이 작성한 글은 읽을 수 있어야하기 때문에 UN_ROCK
                .boardSecret(BoardSecret.UN_LOCK)
                .member(member)
                .item(item)
                .build();
    }


    // 문의글 상태 변화
    public void changeSecret(BoardSecret secret) {
        this.boardSecret = secret;
    }
}
package com.example.shopping.domain.board;

import com.example.shopping.domain.comment.CommentDTO;
import com.example.shopping.entity.board.BoardEntity;
import com.example.shopping.entity.comment.CommentEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Getter
@ToString
@NoArgsConstructor
public class BoardDTO {
    @Schema(description = "문의글 번호", example = "1", required = true)
    private Long boardId;

    @Schema(description = "문의글 제목", required = true)
    @NotNull(message = "문의글 제목은 필 수 입력입니다.")
    private String title;

    @Schema(description = "문의글 본문")
    private String content;

    @Schema(description = "유저 닉네임")
    private String nickName;

    @Schema(description = "문의글 작성 시간")
    private LocalDateTime regTime;

    @Schema(description = "관리자 답변")
    private List<CommentDTO> commentDTOList = new ArrayList<>();

    @Schema(description = "문의글이 본인글인지 확인")
    private BoardSecret boardSecret;


    @Builder
    public BoardDTO(Long boardId,
                    String title,
                    String content,
                    String nickName,
                    LocalDateTime regTime,
                    List<CommentDTO> commentDTOList,
                    BoardSecret boardSecret) {
        this.boardId = boardId;
        this.title = title;
        this.content = content;
        this.nickName = nickName;
        this.regTime = regTime;
        this.commentDTOList = commentDTOList;
        this.boardSecret = boardSecret;
    }

    // 엔티티를 DTO로 변환하는 작업
    public static BoardDTO toBoardDTO(BoardEntity board, String nickName) {
        // 게시글 댓글 처리
        List<CommentEntity> commentEntityList = board.getCommentEntityList();
        List<CommentDTO> commentDTOS = new ArrayList<>();

        // 엔티티 댓글을 DTO 리스트에 담아주는 작업을 진행하고 있다.
        if (commentEntityList != null) {
            for (CommentEntity commentEntity : commentEntityList) {
                CommentDTO commentDTO = CommentDTO.toCommentDTO(commentEntity);
                commentDTOS.add(commentDTO);
            }
        } else {
            // commentEntityList가 null일 경우 빈 리스트로 초기화
            commentDTOS = Collections.emptyList();
        }

        return BoardDTO.builder()
                .boardId(board.getBoardId())
                .title(board.getTitle())
                .content(board.getContent())
                .nickName(nickName)
                .commentDTOList(commentDTOS)
                .regTime(LocalDateTime.now())
                .boardSecret(board.getBoardSecret())
                .build();
    }

}

수정 문구인데

로그를 확인하면 게시글 로그까지 제대로 나오는 것을 볼 수있는데 근데 리턴이 안되고 400번 오류가 발생하는데 body에 적은 내용은 안나오는 상황입니다. 로그까지 찍혔는데 왜 리턴이 안되는 걸까요?? 아무 에러 표시도 안나옵니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.11.17

안녕하세요 유요한 님, 인프런 AI 인턴이에요.

로그를 확인해보니 리턴이 안되고 400번 오류가 발생하는 상황인 것 같아요. 상세 내용이 에러 로그에 표시되지 않고 있어서 원인을 정확히 파악하기는 어렵지만, 몇 가지 가능한 원인과 해결 방법을 안내해드릴게요.

  1. ResponseEntity.badRequest().body()의 인자로 전달되는 내용이 올바른 형태인지 확인해주세요. 문자열 형태로 전달되어야 하므로, 내용을 감싸는 큰따옴표가 필요한지 다시 한 번 확인해보세요.

  2. 필요에 따라 서버의 에러 로그가 기록되는 곳을 확인해보세요. Spring Boot의 경우, 기본적으로 application.properties 파일에서 로깅 설정을 볼 수 있습니다. logging.level.rootlogging.level.<your_package>를 조정하여 로깅 레벨을 변경하고, 에러 내용을 더 자세히 볼 수 있도록 설정해보세요.

  3. 예외 처리를 하고 있지만, 혹시 발생한 예외가 EntityNotFoundException이 아닌 다른 예외일 수도 있습니다. 모든 예외를 다 처리하기 위해 Exception 클래스로 예외를 잡는 것은 좋지 않습니다. 가능하면 예외의 세부적인 타입에 맞춰서 처리해보세요.

  4. 해당 메서드가 정상적으로 실행된 이후에 리턴되는지 확인해보세요. 만약 어쩌다가 메서드가 종료되기 전에 예외가 발생하면 리턴되지 않을 수도 있습니다. 이런 경우에는 상위에 있는 try-catch 구문을 다시 한 번 확인해보고, 예외가 발생하는 경우에도 리턴되도록 수정해야 합니다.

위 네 가지 사항을 확인하고 수정해보아도 문제가 해결되지 않는다면, 해당 부분의 코드를 더 자세히 살펴봐야 할 것 같습니다. 추가적인 정보가 필요하다면 알려주세요. 감사합니다!