스프링부트 강좌 72강(블로그 프로젝트) - 회원가입 문제와 게시글 삭제 문제 해결
<회원가입 문제>
동일한 이름을 회원가입 할시 화면에서 마치 회원가입이 나온 것처럼 다시 HOME으로 돌아가지만 사실 db에는 반영되지 않고 있음.
@Column(nullable = false, length = 100, unique = true)
private String username; //아이디
모든 Exception을 GlobalException에 들고 간다.
2020-09-08 13:45:20.028 WARN 5496 --- [nio-8000-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1062, SQLState: 23000
2020-09-08 13:45:20.028 ERROR 5496 --- [nio-8000-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry 'love' for key 'UK_jreodf78a7pl5qidfh43axdfb'
2020-09-08 13:45:20.034 WARN 5496 --- [nio-8000-exec-9] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [UK_jreodf78a7pl5qidfh43axdfb]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement]
package com.yuri.blog.handler;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import com.yuri.blog.dto.ResponseDto;
@ControllerAdvice //어디에서 발생하던 간에 이쪽으로 오게 하기 위해서, 전역적으로 예외 처리
@RestController
public class GlobalExceptionHandler {
// IllegalArgumentException 이 발생하면 스프링은 그 exception에 대한 error를 이 함수에게 전달해준다.
@ExceptionHandler(value=Exception.class)
public ResponseDto<String> handleArgumentException(Exception e) {
return new ResponseDto<String>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
}
}
또또또 자바스크립트 업데이트가 제대로 반영 안된다....!!!!!!!!!!!!!!!!!!!!!! sts 뭐야....ㅠㅠㅠ 껐다가 키면 되는데 너무 귀찮음 ....;;;
<게시글 삭제 문제>
댓글이 달린 게시글을 삭제하려고 할때 db에서 실제로 삭제가 이루어지지 않는다. 삭제 완료되었다고는 뜨는데 삭제가 안됨
2020-09-08 14:07:53.709 WARN 7868 --- [nio-8000-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1451, SQLState: 23000
2020-09-08 14:07:53.709 ERROR 7868 --- [nio-8000-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : Cannot delete or update a parent row: a foreign key constraint fails (`blog`.`reply`, CONSTRAINT `FKayalcledc3l0g5lt1balg0jwf` FOREIGN KEY (`boardId`) REFERENCES `board` (`id`))
2020-09-08 14:07:53.710 INFO 7868 --- [nio-8000-exec-2] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements
2020-09-08 14:07:53.714 WARN 7868 --- [nio-8000-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement]
Cannot delete or update a parent row: a foreign key constraint fails
내가 지금 게시글을 삭제하게 되면 댓글이 게시글과 연관되어있는데, 이때 어떻게 해야하는 연관이 지금 없는 상태이다. 그래서 이런 설정들을 해줘야 한다.
옵션의 종류가 여러가지 있는데
ascade = CascadeType.persist
Board라는 오브젝트를 만들어서 save를 하게 되는데
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER, cascade = CascadeType) //mappedBy 연관관계의 주인이 아니다. (난 FK가 아니다). DB에 컬럼을 만들지 마시오. @JsonIgnoreProperties({"board"}) @OrderBy("id desc") private List<Reply> replys;
얘를 DB에 넣을 필요는 없다. 얘는 연관관계의 주인이 아니기 때문에 id, title, content , 조회수는 자동, user 오브젝트에 대한 정보를 넣고 회원가입을 하면 된다. 근데 이 값을 만들어서 넣고 싶으면 이 Board 게시글을 save할 때 board object 안에 reply를 넣어서 save하면 저장이 안된다. board 게시글을 넣을 때 연관관계의 주인이 아니기 때문이다.
이때 persist라는 옵션을 넣으면 board 오브젝트를 넣을 때 댓글들을 board 오브젝트에 담아서 save하게 되면 실제 디비에 반영이 된다..근데 이걸 쓰진 않고 우리는 REMOVE를 할 것이다.
만약 board 게시글을 지울때 댓글들을 한꺼번에 다 날리겠다는 것이다.
-이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.-