오류발생과 해결

오류명 : java.lang.assertionerror: status expected:<200> but was:<401> 및 소스 코드의 변경, 부제 : 스프링 부트와 AWS로 혼자 구현하는 웹서비스 -저자: 이동욱

지팡구 2022. 3. 8. 21:16

정보처리기사 필기가 무사히 끝이나고 다시 스프링 부트 공부를 해보려고 책을 열었다.

본가에서도 해결하지못한 오류를, 학교에 와서 곰곰히 생각해보고 해결한 과정을 한 번 설명하고 어떻게 해결했는지, 뭐가 문제였던건지 나름의 분석을 해보려고 한다.

 

일단 우선 해당 이 책은 출판된지가 어느덧 3년을 향해 달려가고 있다. 그 사이에는 많은 버전이 업데이트 되었고, 다양한 기능들이 추가되고 삭제되며 코드가 변하기 충분하였다.

 

앞서 작성한 글 중에 compile과 implement처럼, 책의 버전을 그대로 사용함으로써 코드를 따라가는 것도 좋지만, 나는 그래도 최신버전으로 업데이트 된 상황으로 코드를 작성해보고 싶어서 지속적으로 찾아보고, 코드를 수정해 나아갔다.

 

일단 우선적으로 제가 실습환 환경은 다음과 같습니다.

 

spring-boot : 2.6.3

gradle : 7.3.3

JUnit : 5

InteliJ : 2021.2

 

책에서는 아마 버전들이 다 과거 버전일 것이고, JUnit도 아마 4버전인가 그럴겁니다. 저는 맨처음 실습 환경을 이렇게 설정했기에 크게 뭐 바꿀 것은 없었고, build.gralde 파일에 dependencies 이 부분에 compile 대신 implementation로 교체했습니다 (교체 방법 및 자세한 내용은 직접 찾으셔서 바꿔보시는게 더욱 도움이 될 것이라 생각합니다.)

 

아무래도 버전이 올라가고 성능에 대한 이슈라던지 그런 부분은 분명히 업그레이드 될 것이지만, 안정성이라던지 여러 부분은 그 전 버전에 비해 부족할 수있다고 생각하고, 또 이미 대기업에서는 개발이 거의 끝났는데 이제와서 버전이 업그레이드되서 기존에 코드를 다 수정하기엔 비용이 너무 많이 들어갈 수 있다고 생각해 과거 버전을 사용하거나 뭐 그런 이유가 있지 않을까 개인적으로 생각해봅니다. 

 

 

1. 기존의 의존성부분 코드를 compile -> implementaion으로 교체  

   이에 따라서 compile 관련 어노테이션들을 수정했다 

2. @Runwith -> @ExtendRunwith

3. @SpringRunner -> SpringExtention

 

이것 이외에도 더욱 바꿔야 할 것이 많지만, 아직 그 부분까지 코드를 실행하지 않아서 나머지 부분은 또 오류가 발생하거나, 그 부분에 도달하면 수정하겠습니다.

 

(책 저자님의 블로그입니다. 찾아보시면 변경한 코드들에 대한 설명 및 방법들이 기술되어 있습니다.)

https://jojoldu.tistory.com/539

 

(2020.12.16) 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 최신 코드로 변경하기

작년 11월 말에 스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 출판 하였습니다. Spring Boot가 2.1 -> 2.4로, IntelliJ IDEA가 2019 -> 2020으로 오면서 너무 많은 변화가 있다보니, 집필할 때와 비교해 실습

jojoldu.tistory.com

 

본론으로 넘어가 발생한 오류인 java.lang.assertionerror: status expected:<200> but was:<401> 에 대해서 알아보고자 한다. 여러 개발자의 블로그에 있는 글이나, 관련 강의들을 보면 결국 성장하는 지름길은 혼자 해보고, 오류를 해결하는 그 과정 속에서 발전이 있다고 말하는데 이 역시 그 부분 중 하나였으면 좋겠다.

 

우선 테스트 코드를 작성하는 과정에서 책에 있는 순서대로 따라가고 내가 선택한 버전을 통해 책을 진행하게 되면

기존에 코드를 롬복을 적용시켜 Dto를 만들었고, 만든 Dto가 잘 작동하는디 Test 코드를 통해 확인하는 작업을 가질 것이다.

 

과연 이렇게 코드를 작성했을 때, 무사히 성공하냐? 일단 내가 작성한 코드에서는 No였다.

발생한 오류

 

이때 발생한 오류가 java.lang.assertionerror: status expected:<200> but was:<401> 오류였는데,

 

그래서 이 오류를 해결하기 위해 많은 검색을 했지만 해답을 찾을 수 없었다. 단지 이 오류 로그를 복사해 검색만 해보았고, 혹시나 내가 의존성 주입이라던지, 코드를 수정할 때 놓친 부분이 있는지 저서님의 git과 블로그를 찾아보았고 해결방법을 찾기 힘들었다.

 

그래서 이 코드를 나름?의 분석을 통해 해결책을 찾게 되었다.

 

​일단 200번 상태는 HTTP 요청이 성공한 상태인데, test를 통해 성공한 상태를 원했지만, 401번 오류가 발생했다. 

그럼 과연 401번 오류는 정확하게 무엇일까? 라는 생각이 들었고, 인터넷에 검색을 해보았다.

 

https://developer.mozilla.org/ko/docs/Web/HTTP/Status/401

결국 401 오류가 인증관련 오류임을 알게되었고, 내가 작성한 코드중에 인증과 연관된 오류가 무엇이 있을까 고민해보았고, 그 결과 dependencies 부분에 spring-security 부분이 생각이 났다. 과거에 security-JTW 토큰을 이용해 로그인을 만들어 본 적은 있는데, 거의 이해를 하지 못했던지라 그냥 사용만 해봤고, security에 대해 전혀 무지했는다.

 

그래서 혹시나 하는 마음에 implemetation 부분의 security를 지웠고 결과 정상적으로 작동된다.

(드디어 고침, 진짜 오래 걸림... 포기할까하다가 내가 이 책도 제대로 한 권 못 끝낼 끈기를 가지고 있는가? 라는 생각 때문에 개껌마냥 물고 늘어짐)

 

나중에 security 파트를 학습하게되면 그때 다시 그 부분에 대해서 공부해보려고 한다.

지금은 우선 책의 코드를 따라가면서 발견되는 오류를 해결하거나, 학습을 진행하기 위함이다.

(시큐리티 관련 학습은 나중에 다시 하도록 하고 우선 오류를 해결한 것으로 만족한다.)

 

요약 : 오류를 해결할땐 로그 기록을 잘 보자, 그리고 그 것을 분석해서 논리적으로 추론을 해보자. 로그 속엔 답이 있는법..