본문 바로가기
T.I.L. :: Today I Learned/항해99 14기 본과정

Day 30. Column user_user_name cannot be null

by DaSsom 2023. 5. 2.

회원탈퇴 기능을 구현하는 중에, 계속해서 만난 오류

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)
);

 

일대일 연관관계

 

[JPA-4] JPA 일대일(1:1) @One-To-One 연관관계

1. 들어가며 이번 포스팅에서는 일대일 (1:1) 매핑에 대해서 알아보겠습니다. 2. 개발 환경 포스팅에서 작성한 코드는 깃허브에 올라가 있어요. OS : Mac OS IDE: Intellij Java : JDK 1.8 Source code…

blog.advenoh.pe.kr

 

아무튼 그래서 결국은 @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를 잘 사용하지 않는다는 것이었다. 

https://ocblog.tistory.com/70

 

JPA OneToMany 단방향 맵핑의 단점 이해하기 삽질기

JPA OneToMany 단방향 맵핑의 단점 이해하기 삽질기 JPA의 연관관계 설정에는 크게 4가지가 있습니다. OneToOne OneToMany ManyToOne ManyToMany 프로젝트를 진행하던 중 OneToMany에 관해 고민하게 되는 일이 있었

ocblog.tistory.com

 

이러한 이유에서 지양한다고 하는데, 아직은 잘 모르겠다. 아무튼 이번 프로젝트에서는 공부하는 차원에서 전부 사용해보았지만 나중에는 OneToMany를 사용하지 않아야겠다.