병맛나는병
130
2022-08-06 13:56:09 작성 2022-08-06 14:24:19 수정됨
3
126

스프링으로 테이블 조인을 해보고 있는데 왜 에러가 나는걸까요?


post 테이블을 comment가 참조하게 만들었습니다.


이처럼 데이터 베이스에는 잘 저장되지만 intelj console 창에는 stackoverflowererror가 뜨며 다음과 같은 에러가 출력됩니다.



포스트맨에 comment 테이블이 출력되게 리턴값을 보내줬는데 이처럼 리스폰을 찾지 못하는걸 보니 리턴 부분에서 문제가 나는 거같은데... 왜 에러가 뜨는지 모르겠습니다.


다음은 리턴까지의 과정입니다.

@PostMapping("/api/post/{postId}/comment")
public ResponseDto<?> CommentCreate(@PathVariable Long postId, @RequestBody CommentRequestDto requestDto) {
System.out.println(postId);
return ResponseDto.success(commentService.createComment(postId, requestDto));
}

다음과 같이 commentService의 createComment 메소드의 리턴값이 오게 해주었습니다.

public Comment createComment(Long postId, CommentRequestDto requestDto){
Post post = postRepository.findById(postId).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
Comment comment = new Comment();
comment.commentCreate(requestDto);

post.addComment(comment);
commentRepository.save(comment);
postRepository.save(post);
System.out.println("값 확인"+comment);

return comment;
}

commentService 는 위와 같이 comment를 리턴하게 만들었고요.


첫번째 보여준 controller 코드의 ResponseDto 역시 제네릭으로 선언되어 다음과 같이 이루어져 있습니다.

@Getter
@AllArgsConstructor
public class ResponseDto<T> {

private boolean success;
private T data;
private Error error;

public static <T> ResponseDto<T> success(T data) {
System.out.println("값확인2"+data);
return new ResponseDto<>(true, data, null);
}
public static <T> ResponseDto<T> fail(String code, String message) {
return new ResponseDto<>(false,null,new Error(code,message));
}

@Getter
@AllArgsConstructor
static class Error {
private String code;
private String message;
}
}


저기 제네릭으로 선언된 data에 서비스에서 리턴받은 comment가 들어갈테니 문제가 없어 보이는데 왜 에러가 나는 걸까요?

data가 제대로 들어갔나 값확인도 해봤는데 정상적으로 responseDto에 들어가는 상태였습니다.

0
  • 답변 3

  • 아리가또
    56
    2022-08-06 16:01:07 작성 2022-08-06 16:03:43 수정됨

    오호 JPA를 사용하시는 거겠죠?
    Domain 클래스도 함께 첨부해주시면 좋을 것 같긴한데 ㅎㅎ

    만약 JPA라면 Comment에도 연관관계를 설정해주셨나요?

    Comment를 저장하기전에 postId도 같이 값을 채워주셨을까요?

    그리고 서비스 레이어 메서드도 @Transactional이 필요해보이네요 ㅎㅎ JPA를 사용하고 계시면요

  • 병맛나는병
    130
    2022-08-06 16:25:56
    아 감사합니다! comment랑 post도 첨부해 볼게요
  • 병맛나는병
    130
    2022-08-06 16:27:43

    이건 comment 테이블입니다.

    @Getter
    @Setter
    @NoArgsConstructor
    @Entity(name = "comment")
    public class Comment extends Timestamped {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    @Column(nullable = false)
    private String content;

    @Column(nullable = false)
    private boolean done = false;
    @Column(nullable = false)
    private String username;

    @ManyToOne
    @JoinColumn(name = "postId")
    private Post post;

    public void commentCreate(CommentRequestDto requestDto){
    this.content = requestDto.getContent();
    this.username = requestDto.getUsername();
    }
    }


    이건 post 엔터티고요.

    @Getter
    @NoArgsConstructor
    @Entity(name = "post")
    public class Post extends Timestamped {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    @Column(nullable = false)
    private String title;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "post")
    private List<Comment> comments = new ArrayList<Comment>();

    public void addComment(Comment comment)
    {
    comments.add(comment);
    comment.setPost(this);
    }

    public Post(PostRequestDto requestDto){
    this.title = requestDto.getTitle();
    }


    }

    보시는 바와 같이 comment를 post와 조인해주었습니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.