포인터 사용에서 잘못이 있을 때 발생하는 에러이다 (포인터나 슬라이스에 접근할때 빈값에 접근하면 발생)
나의 경우 테스트코드를 돌리다가 에러가 발생했다. 아래 토큰 생성 코드에 대해서 테스트 코드를 돌리면 시크릿 키의 길이가 최소 기준을 통과하지 못했기 때문에 NewJWT 함수에서 &JWTM{secretkey}가 반환되지 않고 nil이 반환된 상태이다. 그런데 이 상태에서 테스트 코드의 CreateToken은 &JWTM을 기다리고 있기 때문에 panic이 발생하였다.
문제가 된 코드
// 테스트 코드
func TestShortPw(t *testing.T) {
jwtmm, err := NewJWT(util.RandomString(3))
require.Error(t, err)
_, err = jwtmm.CreateToken(util.RandomOwner(), time.Minute)
require.Error(t, err)
}
// 토큰 생성 코드
func NewJWT(secretkey string) (*JWTM, error) {
if len(secretkey) < minSecretKeySize {
return nil, fmt.Errorf("invalid key size: must be at leat %d characters", minSecretKeySize)
}
return &JWTM{secretkey}, nil
}
func (jwtm *JWTM) CreateToken(username string, duration time.Duration) (string, error) {}
문제 해결한 코드
CreateToken이 &JWTM을 기다리고 있는 것이 문제였으니, 해결은 아주 간단하게 해당 부분을 삭제해주는 것. 애초에 토큰이 안 만들어지는 경우를 테스트하는 것이었고, &JWTM이 안 만들어진다면 CreateToken도 사용하지 못하게 되는 것이니 테스트 내용에도 영향이 없다.
// 테스트 코드
func TestShortPw(t *testing.T) {
jwtmm, err := NewJWT(util.RandomString(3))
require.Error(t, err)
}
// 토큰 생성 코드
func NewJWT(secretkey string) (*JWTM, error) {
if len(secretkey) < minSecretKeySize {
return nil, fmt.Errorf("invalid key size: must be at leat %d characters", minSecretKeySize)
}
return &JWTM{secretkey}, nil
}
func (jwtm *JWTM) CreateToken(username string, duration time.Duration) (string, error) {}