inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

JPA 문제

220

유요한

작성한 질문수 49

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에 적은 내용은 안나오는 상황입니다. 로그까지 찍혔는데 왜 리턴이 안되는 걸까요?? 아무 에러 표시도 안나옵니다.

스프링부트 jpa

답변 1

0

인프런 AI 인턴

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

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

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

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

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

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

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

리뉴얼 시기

0

9

1

JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문

0

35

2

설계 트레이드 오프 링크 접속 안됨

0

75

2

테스트 질문, 어떤것을 사용할것인것에 대해서

0

38

1

service-discovery 프로세스 가동 이유

0

40

1

트래잭션 전파 기본- 에 대한 개념 질문? 이렇게 생각해도 맞나요?

0

42

1

헥사고날 아키텍처와 DDD를 적용할 때, 화면에 강하게 연관된 조회 데이터를 어떻게 다루는 게 좋은지 궁금합니다.

0

118

2

h2 database

2

51

2

Request DTO에서 Entity를 생성할 때 의존성 방향을 반대로 하면 어떨까요?

0

106

2

Querydsl 설정 할때 - run and test 다르게 설정 할때? 질문

0

54

1

new 패키지명.Dto명 생략가능

0

67

2

변경감지(더티체킹) 이후 플러시할 경우의 쿼리

0

61

1

단일 테이블 시 null 값과 연관관계 필요성 질문

0

58

1

SpringBoot4 버전 Hibernate5JakartaModule 라이브러리 오류

0

60

1

aws 관련 질문드립니다.

1

61

3

setter 사용하지 않기

0

53

1

세션을 제대로 이해한게 맞는지 궁금합니다

0

53

1

안녕하세요 토비님 혹시 완성된 코드의 repository 주소는 없을까요?

0

113

2

자막 오타 제보

0

47

1

rabbitmq에 configservice 연결에 대해 질문있습니다.

0

58

1

안녕하세요 치킨 디도스 이벤트 보고 흉내내보려 들어왔습니다..

0

67

2

join에대해 질문드립니다.

0

46

1

코드 질문

0

51

2

To-Do App

0

44

1