댓글과 게시글을 연결시키기 전에는 게시글 삭제가 됐는데댓글과 게시글을 @ManyToOne으로 연결시킨 후부터 게시글 삭제가 되지 않고 

Referential integrity constraint violation: 
"FKNC3NOT052XESL2NHJ9NDNB5DK: PUBLIC.COMMENT FOREIGN KEY(POSTS_ID) REFERENCES PUBLIC.POST(ID) 
(CAST(4 AS BIGINT))"; SQL statement:

콘솔창에 이런 오류가 떴다.

찾아보니 댓글과 게시글 연관관계를 단방향으로 설정하고 게시글을 삭제 했을 시에 게시글은 삭제되고 댓글은 남아있는 상태가 되어 무결성이 깨지는 현상이 일어난 것이었따.

 

그래서 이를 해결하기 위해

public class Comment extends TimeStamped{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(nullable = false)
private String username;

@Column(nullable = false)
private String contents;

@ManyToOne
@JoinColumn(name = "posts_id",nullable = false)
private Post post;

nullable = false라는 조건을 걸어보기도 했지만 이는 상관없는 것을 확인했다.

 

두번째 방법으로

이를 막기위해 게시글 삭제시 댓글 삭제를 먼저 진행 후 게시글 삭제 로직을 진행하였다.

@Transactional
public MsgResponseDto deleteAll(Long id, HttpServletRequest request) {
Post post = postRepository.findById(id).orElseThrow(
() -> new NullPointerException("게시글이 존재하지 않습니다.")
);
String token = jwtUtil.resolveToken(request);
Claims claims;
if (token == null) {
return null;
}
if (!jwtUtil.validateToken(token)) {
throw new IllegalArgumentException("토큰이 유효하지 않습니다.");
}
claims = jwtUtil.getUserInfoFromToken(token);
String username = claims.get(SUBJECT_KEY, String.class);
String role = claims.get(AUTHORIZATION_KEY, String.class);

if (StringUtils.equals(role, UserRoleEnum.USER.name())) {
if (!StringUtils.equals(post.getUsername(), username)) {
return new MsgResponseDto("아이디가 같지 않습니다.", HttpStatusCode.valueOf(400));
} else {
commentRepository.deleteByPost_Id(post.getId())// 게시물 삭제시 댓글 같이 삭제를 추가함
postRepository.delete(post);
return new MsgResponseDto("삭제 성공", HttpStatusCode.valueOf(200));
}
}
postRepository.delete(post);
return new MsgResponseDto("삭제 성공", HttpStatusCode.valueOf(200));
}
}

 

하지만 이러한 방법은 무결성을 지키지 못한채 임시 방편으로 진행시킨 것으로 어떻게 수정하면 좋을지 잘 모르겠다ㅜㅜ

 

좀 더 찾아보고 생각해보아야겠다.

+ Recent posts