본문 바로가기
에러 모음/단거리

[ERROR] java.lang.IllegalArgumentException: No enum constant 에러

by 지지 2022. 3. 6.

구글 로그인을 구현하다 거의 다와서 에러가 발생했다.

사실 해결은 했지만, 이 에러는 이동욱님의 '스프링부트로 웹 서비스 출시하기' 라는 서적의 블로그 글을 읽으며 따라해보다가 발생한 에러이다. 이 프로젝트를 따라 만들면서 mustache, jpa, tdd등을 처음 접했기 때문에 해당 지식이 엄청 얕다. 그렇게 때문에 이 글은 에러에 대한 물음표를 느낌표로 바꾸지는 못한다.

공부를 더 해서 얕게 설명한 부분들을 더 이해가 가기 쉽도록 수정할 예정이다.

지금은 나중에 또 이런 에러가 발생했을 때 헤메지 않기 위해 기록을 남겨두려고 한다.


1. 의문점 (에러)

1번 에러
2번 에러

1. 구글로그인을 구현하고부터 잘되던 글 등록, 수정, 삭제가 불가능해졌다.

에러 내용을 보니 권한접근 에러인 403에러가 떴고, 콘솔엔 처음보는 에러 메시지가 두 개가 떴다.

처음엔 콘솔의 에러 메시지를 확인하지 못하고 403에러에 대한 구글링을 했는데, 구글 API를 사용하려면 처음 클라이어트ID를 생성했던 곳에서 Google+ API를 활성화 시켜야한다는 글이 많았다. 실제로 나는 Google+ API를 활성화시키지 않은 상태였다.

이 부분에 대한 해결 방법은 밑의 링크로!!! ↓↓↓

Google API를 통한 Oauth2 로그인 구현 시 403 Forbidden 에러 해결 (tistory.com)

 

Google API를 통한 Oauth2 로그인 구현 시 403 Forbidden 에러 해결

1. 의문점(에러) 구글에서 제공해주는 API를 이용해 구글 로그인을 구현했지만 403 Forbidden에러가 발생하였다. 403 Forbidden에러란? 400번대 에러는 클라이언트 쪽에서 오류가 났음을 알려주는 HTTP 상

jee2memory.tistory.com

 

2. 나의 경우는 Google+ API를 활성화시켜도 계속 403권한 에러가 발생했고, 나중이 되서야 콘솔의 에러메시지를 발견했다.(바보바보ㅜㅜㅜㅜ)

콘솔 에러의 의미는 무엇일까! 알아보도록 하자.

2. 해결방법

블로그를 따라하며 권한이 'USER'인 사용자만 게시판에 글을 등록, 수정, 삭제할 수 있게 했다.

enum에 GUEST와 USER를 열거해줬는데, 부끄럽지만 현재 enum이 뭔지 잘 모른다.... 조만간(1주일 내에) enum을 학습하여 더 정확한 정보로 수정할 것이다.

그리고 h2 db에서 update문을 사용해 로그인한 사용자의 role컬럼(권한)을 user로 바꾸어 주었다.

update user set role='user'

권한이 USER인 사용자만 게시판에 접근할 수 있도록 구현했지만 db에 들어간 값이 enum에 정의한 값과 같아야 하는지 정말 몰랐다.....

 

그러니까! 위 에러는 enum에 존재하지 않은 값이 db에 존재할 경우 나타나는 에러였다.(대소문자 구분!!!!)

update user set role='USER'

나 같은 경우 enum의 정확한 개념도 모를 뿐더러, 쿼리를 적을 때 update로 쓰던, UPDATE로 쓰던 상관이 없다 라는 생각이 너무 강하게 잡혀있어서 DB에 들어갈 값 마저 생각없이 소문자로 적은 케이스이다.

role컬럼의 값을 user가 아닌 enum에 열거한 USER로 바꿔주니 에러가 해결되었다.

3. why?

위 에러 이미지 중 2번 에러를 보면 valueOf라는 키워드가 있다.

enum의 valueOf() 메서드는 String타입의 매개변수와 열거형에서 일치하는 이름을 갖는 원소를 반환하는 메서드이다.

매개변수와 일치하는 데이터가 enum안에 있으면 enum데이터를 그대로 리턴한다.

enum안에 데이터가 없으면 java.lang.IllegalArgumentException: No enum constant 에러(예외)가 출력된다.

내가 enum에는 USER로 열거했고, db에는 user로 값을 넣었으니 두 값이 일치하지 않아 에러가 발생한거였다.

 

4. 생각

jpa는 처음이니까 그렇다 치고, enum은 자바에서 학습을 한 후 넘어왔어야 했는데, 그러지 못했기 때문에 헤멧다고 생각한다. enum에 대해 알고 있었다면 2번 에러를 보고 힌트를 얻었을텐데... 정말 기초가 많이 부족하다는 것을 많이 느낀다.

이 에러에 대해 알아보고 해결하면서도 enum을 아예 모르기 때문에 속이 시원하지가 않다. 조만간(1주일 이내) enum을 꼭 공부해서 이 글에 더 많은 살을 붙여야겠다.

 

학원에서 배운 스프링부트와 너무 다르다보니 새로 익혀야해서 힘든점이 많다. 그래도 재밌기 때문에 계속 할 수 있는 것 같다. 에러를 해결했을 때의 쾌감도 너무 좋다. 얼릉 발전해서 더 많은 것을 알고싶다.

반응형

댓글