티스토리 뷰
디버깅이란 ?
말 그대로 디버깅하는 것이다. 우리가 개발을 할 때나 테스트 코드를 작성하고 실행해봤을 때, 의도하지 않은 결과가 나오거나 실패했을 때
비정상적인 연산(버그)를 찾아서 해결하는 과정을 말한다.
언제 디버깅을 할까 ?
앞서 말했지만,
테스트코드를 짰을 때 의도한 대로 동작하지 않을 때, 새로운 기술을 학습중인데 도대체 어떻게 흘러가는지 모를 때, 아니면
어떠한 버그가 있는데 이 버그가 어느 지점에서 무슨 값이 어떻게 들어가있길래 이런 문제가 발생하는지 잘 모를 때 등등,
즉 의도한대로 나오지 않거나 버그가 발생해서 해결해야할 때 뿐만 아니라 어떠한 기술의 동작과정을 알고싶을 때도 디버깅을 사용한다.
디버깅을 제대로 공부하기 전에는 로그를 이용해서 변수들을 하나하나 찍어본뒤 어떤 변수가 어떠한 값으로 들어오는지, 값이 들어오지 않은 변수가 있는지 확인했다. 예를 들어서 이 포스팅은 시큐리티를 구현하고 있을 때 403에러가 발생을 했고, 요청헤더에서 받아오는 토큰값을 찍어봤는데 토큰값이 헤더에서 받아오지 못하는 것을 발견하여, 해당 버그를 해결한 내용을 정리한 포스팅이다. 이러한 버그가 발생했을 때, 다음과 같이 확인했다.
1. 요청헤더에서 토큰값을 받아오는 메서드에 로그를 찍어봤다.
하지만 값이 찍히지 않았다. 그래서 나는 아예 헤더에서 값을 찾아오지 못한다고 판단을 했다.
2. 요청이 담겨있는 request에서 지원하는 요청 데이터들을 하나하나 다 찍어봤다.
거의 다찍어봤다. 하지만 값이 찍히지 않았다. 그래서 "설마 로그가 안먹히는건 아니겠지?" 라고 생각했다.
요청은 보냈는데 요청 데이터가 없다는 것은 말이 되지 않았기 때문이다.
3. 그래서 회원가입 로직에서 아무거나 찍어봤다.
로그가 제대로 찍혔다. 역시 로그가 안먹힌건 아닐테고, 그럼 뭐가 문젤까? 하고 두 로그를 비교해보았는데..
다른 점이 하나 있었다. 바로 ,와 +였다. ,는 값이 찍히지 않았던 것이다.
4. 그래서 다시 요청헤더에서 값을 받아오는 메서드에 로그를 찍어봤다.
잘 들어온다. 즉, 애초에 헤더에서 값을 받아왔었고 403에러의 원인은 다른 문제였던 것이다.
이렇게 로그를 사용했을 때의 문제점은 변수를 하나하나 찍어봐야 한다는 것, 위와 같은 문제가 발생했을 때 알아차리기 어렵다는 것이다.
이때 디버깅을 하면, 어떠한 값이 어떻게 받아오는지 한눈에 볼 수 있다.
디버깅 해보기
서론이 너무 길었다. 그럼 한번 디버깅 하는법을 알아보자.
아래는 회원가입 성공처리하는 테스트다.
이렇게 작성하고 돌려봤더니 실패에러가 떴다.
대충봐도 member.getRole은 ROLE_USER와 String의 "ROLE_USER"가 다르기 때문에 실패한 것 같다.
해결하는 방법은 member.getRole을 String형태로 바꿔서 비교하면 될 것같다. 그래서 member.getRole을 살펴보기로 했다.
이 때 전처럼 로그를 찍지말고 한번 디버깅으로 해보자.
먼저 브레이크 포인트를 걸어준다.
걸어주는 방법은 의심이 가는 코드, 즉 버그를 발생시켰다고 생각하는 코드 옆을 클릭하면 위 사진과 같이 빨간 점이 생긴다.
이 점을 브레이크 포인트라고 한다. 만약 어느 줄에 버그가 발생했는지 감도 안잡힌다면 메서드 시작하는 줄에 브레이크 포인트를 걸어주자.
그리고 테스트 옆에 실행하는 버튼이 있다. 여기서 Debug버튼을 눌러주자.
누르면 실행하다가 브레이크 포인트를 건 줄에서 멈추게 된다.
우리가 확인해야할 것은 member.getRole이기 때문에 member를 들어가보면 다음과 같이 컬럼에 추가된 데이터들이 보이게 된다.
여기서 role에 들어가보자.
그러면 name = "ROLE_USER"가 보이는데, 아마 member.getRole.name()을 찍으면 해결될 것으로 보인다.
그러면 name()을 추가해서 실행해보자.
잘 동작하는 것을 볼 수 있다.
디버깅은 개발자가 꼭 익혀야 하는 기술이다. 각 개발 툴에서 디버깅 기능이 다 있기 때문에 디버깅 기능을 어떻게 다뤄야 하는지 좀 더 공부해보자. 사실 지금까지 한 것은 기본중의 기본으로, 좀 더 익혀야 한다.
'SpringBoot' 카테고리의 다른 글
JpaRepository 확장 인터페이스에 @Repository를 붙여주지 않아도 되는 이유 (0) | 2022.08.18 |
---|---|
Refresh Token 개념과 동작 원리 정리 (0) | 2022.08.01 |
QueryDSL 문법과 다양한 검색 조건 쿼리 작성해보기 (0) | 2022.07.29 |
QueryDSL을 사용하기 위한 환경설정과 기본적인 사용방법 (0) | 2022.07.28 |
QueryDSL 개념과 코드 맛보기 (0) | 2022.07.27 |
- Total
- Today
- Yesterday