- 강의 질문
- 개발/데이터
course 3 게시글 생성 500 에러 발생
코드도 다 똑같이 한 상태에서 게시글 생성을 누르면 500에러가 뜨고 인텔리제이에서
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null] with root cause
이 오류 문구 발생합니다.
찾아보니 게시글 작성할 때 json에 board_id가 없다는 이유로 오류가 뜬거라는데, PostRequest 클래스에서는 board_id = 1L로 해놨고, 강의에서도 따로 boartd_id를 json에 넣어 요청하지 않아도 잘 만들어 졌는데 제 환경에서는 저런 오류가 뜨네요.
package com.example.simpleboard.post.model;import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.*;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
Getter
Setter
ToString
Builder
NoArgsConstructor
AllArgsConstructor
JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class PostRequest {
private Long boardId = 1L;
NotBlank
private String userName;
NotBlank
Size(min = 4, max = 4)
private String password;
NotBlank
private String email;
NotBlank
private String title;
NotBlank
private String content;
}
package com.example.simpleboard.post.service;import com.example.simpleboard.board.db.BoardRepository;
import com.example.simpleboard.post.db.PostEntity;
import com.example.simpleboard.post.db.PostRepository;
import com.example.simpleboard.post.model.PostRequest;
import com.example.simpleboard.post.model.PostViewRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
RequiredArgsConstructor
Service
public class PostService {
private final PostRepository postRepository;
private final BoardRepository boardRepository;
public PostEntity create(
PostRequest postRequest
) {
var boardEntity = boardRepository.findById(postRequest.getBoardId()).get();
PostEntity entity = PostEntity.builder()
.board(boardEntity)
.userName(postRequest.getUserName())
.password(postRequest.getPassword())
.email(postRequest.getEmail())
.status("REGISTERED")
.title(postRequest.getTitle())
.content(postRequest.getContent())
.postedAt(LocalDateTime.now())
.build();
return postRepository.save(entity);
}
public PostEntity view(
Valid PostViewRequest postViewRequest
) {
return postRepository.findFirstByIdAndStatusOrderByIdDesc(postViewRequest.getPostId(), "REGISTERED")
.map(
it-> {
// entity 존재
if(!it.getPassword().equals(postViewRequest.getPassword())) {
var format = "패스워드가 맞지 않습니다 %s vs %s";
throw new RuntimeException(String.format(format, it.getPassword(), postViewRequest.getPassword()));
}
return it;
}
)
.orElseThrow( // 해당 데이터가 없다면
() -> {
return new RuntimeException("해당 게시글이 존재하지 않습니다 : " + postViewRequest.getPostId());
}
);
}
public List<PostEntity> all() {
return postRepository.findAll();
}
public void delete(Valid PostViewRequest postViewRequest) {
postRepository.findById(postViewRequest.getPostId())
.map(
it-> {
// entity 존재
if(!it.getPassword().equals(postViewRequest.getPassword())) {
var format = "패스워드가 맞지 않습니다 %s vs %s";
throw new RuntimeException(String.format(format, it.getPassword(), postViewRequest.getPassword()));
}
it.setStatus("UNREGISTERED");
postRepository.save(it);
return it;
}
)
.orElseThrow( // 해당 데이터가 없다면
() -> {
return new RuntimeException("해당 게시글이 존재하지 않습니다 : " + postViewRequest.getPostId());
}
);
}
}
PostRequest랑 PostService 코드도 첨부하겠습니다.
어노테이션은 금칙어라 제하고 올립니다.