본문 바로가기

TIL(Today I Learned)

TIL-230906(항해99 실전 프로젝트-행동대장(26))

📝오늘 공부한 것

  • 실전프로젝트 - '행동대장' 코드리팩토링

 

⛔문제점

 수정 전 RefreshToken Entity

package com.sparta.actionboss.domain.auth.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor
public class RefreshToken {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String refreshToken;

    @Column(nullable = false)
    private String nickname;

    public RefreshToken(String refreshToken, String nickname){
        this.refreshToken = refreshToken;
        this.nickname = nickname;
    }

    public void updateToken(String refreshToken) {
        this.refreshToken = refreshToken;
    }
}

 

 수정 후 RefreshToken Entity

package com.sparta.actionboss.domain.auth.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor
public class RefreshToken {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String refreshToken;

    @Column(nullable = false)
    private Long userId;

    public RefreshToken(String refreshToken, Long userId){
        this.refreshToken = refreshToken;
        this.userId = userId;
    }
}

 

닉네임이 변경되면 다른 User로 인식해 refresh token을 재발급할때 이전 refresh token이 삭제되지 않음.

따라서 코드를 리팩토링하여 nickname 필드를 userId로 변경.

변경 사항을 배포 환경에서 테스트할 때 에러 발생

 

[에러메시지]

SQL Error: 1364, SQLState: HY000 2023-09-06T15:21:14.768+09:00 ERROR 70118 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Field 'nickname' doesn't have a default value 2023-09-06T15:21:14.773+09:00 ERROR 70118 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: could not execute statement [Field 'nickname' doesn't have a default value] [/* insert for com.sparta.actionboss.domain.auth.entity.RefreshToken */insert into refresh_token (refresh_token,user_id) values (?,?)]] with root cause java.sql.SQLException: Field 'nickname' doesn't have a default value at com.mysql.cj.jdbc.exceptions.

 

💯해결

local에서 test를 할때 DB를 날리고 test하는 경우가 많다.

그래서 local에서 확인했을때는 잘 작동했던 것이 배포환경에서는 에러가 나버린 것이었다ㅠㅠ

배포환경 DB의 nickname column을 삭제하고 재실행시켰더니 성공!!

 

 

배포환경에서 DB 관리를 더 신중하게 해야한다는 것을 배웠다