회원탈퇴 기능을 구현하는 중에, 계속해서 만난 오류
Column user_user_name cannot be null
도대체,, 어디서 user_user_name 이라는 컬럼이 만들어졌을까? 나는 user_name 만 설정해주었는데 왜 JPA 마음대로 user_user_name 이라는 컬럼으로 바꿔버린걸까? 삽으로 계속 파고 파고 또 파서 얻은 결과,
users 엔티티와 refresh Token 엔티티 간의 연관관계 문제라는 것을 알게 되었다. 실제로 회원 탈퇴를 진행하면 db에서 다 지워버리는 경우가 거의 없고 남겨놓는다고 하는데 지금은 배우는 과정이기 때문에 회원이 탈퇴를 하면 다 지워지도록 설정해줬다.
그렇게 하기 위해 user - refresh token @OneToOne 으로 설정해줌
Users
@OneToOne(cascade = CascadeType.REMOVE)
@JsonIgnore
private RefreshToken refreshToken;
Refresh Token
@NotNull
@OneToOne
private Users user;
이렇게 해주니까 jpa가 쿼리를 짜줄 때 user_user_name으로 설계해줬다.
CREATE TABLE refresh_token
(
id BIGINT AUTO_INCREMENT NOT NULL,
refresh_token VARCHAR(255) NOT NULL,
user_user_name VARCHAR(255) NOT NULL,
CONSTRAINT pk_refreshtoken PRIMARY KEY (id)
);
아무튼 그래서 결국은 @OneToOne 어노테이션에 옵션을 추가해주었고
Users
@JsonIgnore
@JsonManagedReference
@OneToOne(cascade = CascadeType.REMOVE)
private RefreshToken refreshToken;
Refresh Token
@JsonBackReference
@OneToOne
@JoinColumn(name = "user_name")
private Users user;
쿼리도 내가 원하는대로 user_name으로 생성되는 것을 확인했다.
CREATE TABLE refresh_token
(
id BIGINT AUTO_INCREMENT NOT NULL,
refresh_token VARCHAR(255) NOT NULL,
user_name VARCHAR(255) NULL,
CONSTRAINT pk_refreshtoken PRIMARY KEY (id)
);
이제서야 회원 탈퇴를 하면 관련되어 있는 게시물, 댓글, 좋아요 리스트, 리프레시토큰 까지 전부 삭제되는 것을 확인했다. 그 이후 알게 된 것은, 실무에서는 @OneToMany를 잘 사용하지 않는다는 것이었다.
이러한 이유에서 지양한다고 하는데, 아직은 잘 모르겠다. 아무튼 이번 프로젝트에서는 공부하는 차원에서 전부 사용해보았지만 나중에는 OneToMany를 사용하지 않아야겠다.
'T.I.L. :: Today I Learned > 항해99 14기 본과정' 카테고리의 다른 글
Day 32. 주특기주차까지 끝나버렸다. (0) | 2023.05.04 |
---|---|
Day 31. 연관관계야 나랑 그만 연관관계를 맺어보자~ plz🙏🏻 (0) | 2023.05.03 |
Day 29. 오류가 너무 웃겨서 배꼽 빠지게 웃으면서 개발함ㅋㅋㅋㅋ (0) | 2023.05.01 |
Day 28. 계속해서 익숙해지는 수 밖에 없지 (0) | 2023.04.30 |
Day 27. 열심히 하고 있습니다. (0) | 2023.04.29 |