정보처리기사 필기가 무사히 끝이나고 다시 스프링 부트 공부를 해보려고 책을 열었다.
본가에서도 해결하지못한 오류를, 학교에 와서 곰곰히 생각해보고 해결한 과정을 한 번 설명하고 어떻게 해결했는지, 뭐가 문제였던건지 나름의 분석을 해보려고 한다.
일단 우선 해당 이 책은 출판된지가 어느덧 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
본론으로 넘어가 발생한 오류인 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번 오류는 정확하게 무엇일까? 라는 생각이 들었고, 인터넷에 검색을 해보았다.
결국 401 오류가 인증관련 오류임을 알게되었고, 내가 작성한 코드중에 인증과 연관된 오류가 무엇이 있을까 고민해보았고, 그 결과 dependencies 부분에 spring-security 부분이 생각이 났다. 과거에 security-JTW 토큰을 이용해 로그인을 만들어 본 적은 있는데, 거의 이해를 하지 못했던지라 그냥 사용만 해봤고, security에 대해 전혀 무지했는다.
그래서 혹시나 하는 마음에 implemetation 부분의 security를 지웠고 결과 정상적으로 작동된다.
(드디어 고침, 진짜 오래 걸림... 포기할까하다가 내가 이 책도 제대로 한 권 못 끝낼 끈기를 가지고 있는가? 라는 생각 때문에 개껌마냥 물고 늘어짐)
나중에 security 파트를 학습하게되면 그때 다시 그 부분에 대해서 공부해보려고 한다.
지금은 우선 책의 코드를 따라가면서 발견되는 오류를 해결하거나, 학습을 진행하기 위함이다.
(시큐리티 관련 학습은 나중에 다시 하도록 하고 우선 오류를 해결한 것으로 만족한다.)
요약 : 오류를 해결할땐 로그 기록을 잘 보자, 그리고 그 것을 분석해서 논리적으로 추론을 해보자. 로그 속엔 답이 있는법..
'오류발생과 해결' 카테고리의 다른 글
[Error] QueryExecutionRequestException : Not supported for DML operations (0) | 2023.01.14 |
---|---|
2번째 맞닥드린 오류 : could not prepare statement (DB 관련 오류) (0) | 2022.03.11 |