springboot - blog project (72)

Yuri Lee·2020년 9월 8일
0

springboot - blog project

목록 보기
47/49

스프링부트 강좌 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 게시글을 지울때 댓글들을 한꺼번에 다 날리겠다는 것이다.

-이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.-

profile
Step by step goes a long way ✨

0개의 댓글