• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

500 Internal Server Error

21.05.06 18:29 작성 조회수 1.16k

0

안녕하세요 선생님, 수업 잘 듣고있습니다.

POST 방식으로 http://localhost:8088/jpa/users/9001/posts를  Request했을 때 500 Internal Server Error가 나오는데, 어떻게 해결해야할 지 모르겠습니다ㅠㅠ

[Postman]

[UserJpaController.java]


@PostMapping ("/users/{id}/posts")
public ResponseEntity<Post> createPost(@PathVariable int id, @RequestBody Post post){
Optional<User> user = userRepository.findById(id);

if (!user.isPresent()) {
throw new UserNotFoundException(String.format("ID{%s} not found",id));
}

//Post의 User를 방금 조회한 User정보로 설정


post.setUser(user.get());
// logger.info(String.valueOf(user.get()));
Post savedPost = postRepository.save(post);

//id 값을 자동으로 지정
URI location =ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedPost.getId())
.toUri();

return ResponseEntity.created(location).build();
}

[Debugging시 에러 메세지]

UserJpaController.java 파일에서 post.setUser(user.get());에서 발생

[Post.java]

public class Post {
@Id
@GeneratedValue
private Integer id;

private String description;

@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
private User user;
}

[User.java]

@OneToMany(mappedBy = "user")
private List<Post> posts;

public User(int id, String name, Date joinDate, String password, String ssn) {
this.id = id;
this.name = name;
this.joinDate = joinDate;
this.password = password;
this.ssn = ssn;
}

답변 1

답변을 작성해보세요.

0

안녕하세요, 이도원입니다.

올려주는 오류는 디버그 시 나왔던 메시지하고는 다른 원인인것 같습니다. 

디버그 시 보여지는 "Method threw 'java.lang.StackOverflowError" 오류는 Optional 데이터를 사용했기 때문에 보여지는 오류인데, 실제 에러라기 보다는 디버깅 모드에서만 보여지는 현상입니다. 물론 Optional 객체에서 데이터가 존재하지 않는 null 상태일 수도 있겠지만, 그건 바로 위 코드인 isPresent() 메소드에서 확인하고 있기 때문에, user.get()을 사용하는 부분에서는 null 데이터는 아닙니다. 

IntelliJ에서 디보깅 시 위와 같은 메시지를 보지 않으시려면, 디버깅 창에서 해당 부분을 선택하시고, 마우스 우측버튼을 클릭하신다음, View as > Object로 선택하시면, 됩니다. 

위에 말씀드린 것 처럼, 디버그 모드에 보여주는 에러 메시지 외에 다른 오류가 있을 것 같습니다. 콘솔화면에 출력된 메시지를 다시 한번 공유해 주시면, 오류 원인을 찾아보도록 하겠습니다. 

감사합니다.