2022 Masters Course/Project Course

2022 마스터즈 코스(백엔드) 114일차 회고(2022. 6. 23.) - "테스트 코드 없는 리팩토링은 미친 짓이다"

ikjo 2022. 6. 24. 00:30

해당 글은 코드스쿼드 2022 마스터즈 코스 "Java 웹 백엔드" 과정을 수강하면서 학습한 내용 등에 대한 회고 글입니다. :)

 

수강 회고

마지막 팀 프로젝트의 절반이 넘어가는 시점 이제 슬슬(?) 데드라인의 압박(?)이 느껴지고 있다. 🤣 마스터즈 코스 과정의 장점(?)은 각 미션마다 다소 짧은(?) 제한 시간이 주어지는데, 나태해질 겨를 없이 미션 과제 수행을 위해 정신 없이 프로그래밍을 하게 된다는 점이다. 이는 물론 나중에 현업에 들어가서도 마찬가지일거라는 생각이 든다. 💦

 

아무쪼록 마지막 미션 과제인 만큼 난이도도 어려운데, 진도가 빨리 빨리 나가지 못해 조급한 마음도 든다. 이번주는 기능 구현보다는 프론트 엔드와의 연동 과정에서 발생하는 오류들에 대응하고 팀원들의 추가적으로 수정이 필요한 사항들을 처리하느라 상당한 시간을 소모하게 되었다.

 

특히, 연동 과정에서 발생하는 오류들을 처리하느라 시간을 가장 많이 썼는데, 백엔드인 나의 실수로 인한 부분이 굉장히 많았다. 개발할 때는 나름대로 철저하게(?) 코드를 작성했다고 생각했었지만, 실제 연동 과정에서 곳곳에 빈틈들이 굉장히 많았다. 하나를 처리하면 다음 문제가 발생하고 이런 식으로 많은 시간들이 지나만 갔다.

 

이번 미션 과제를 하면서 약간의 벽(?)을 조금씩 느끼고 있지만 일단 내가 할 수 있는 것에만 집중하고자 한다. 차근차근 하다보면 또 좋은 결과가 있을 것이라고 기대해본다.

 

 

학습 회고

앞서 나는 지난 숙소 예약 서비스 팀 프로젝트 때 구현했었던 JWT 로그인 검증 로직을 좀 더 개선하기 위해 이번 팀 프로젝트 때 리팩토링하는 작업을 진행해보았었다. 지난 리뷰어 Dan이 공유해주신 자료로 나의 로직을 보완해나가면서 나름대로 철저하게 잘 고쳐나가고 있다고 생각했었다.

 

문자열로만 관리하던 토큰 값을 객체 형태로 관리하면서 기존에 토큰 검증 등과 관련된 로직들을 토큰 객체 내에 관리함으로써 역할과 책임 분리 등 좀 더 객체지향적으로 프로그래밍해볼 수 있었다. 하지만 이렇게 리팩토링을 하면서 내가 고려하지 않았던 것이 있었는데 바로 테스트 코드 작성 부분이었다.

 

이전에 호눅스 강의에서 이런 말을 들어본 적이 있었다. "테스트 코드가 없는 리팩토링은 미친 짓이다." 강의를 들을 때 나름대로 공감을 했었던 것 같긴하지만 "테스트 코드가 있어야 리팩토링할 때 좀 더 편하겠지 뭐" 이정도 생각이었던 것 같다. 역시 일이란 직접 겪어봐야 안다라는 말이 있듯이 이번에 나에게 그 일이 일어났다.

 

나름대로 오만하게 리팩토링을 마치고 프론트 엔드와 연동을 하던 중 JWT 검증 로직과 관련된 부분에서 지속적으로 오류들이 발생했다. 어떤 오류 중에는 처음에는 됐다가 나중에 가서는 안 되는 것도 이었다. (차라리 안 될거면 처음부터 안 되든가..😡) 내가 "어느 부분에서 실수한 거지?"라는 의문과 함께 시간은 지나만 갔다.

 

"어느 부분에서 실수한 거지?"에 정답이 있었던 것 같다. 만일 테스트 코드를 작성했으면 리팩토링을 하고나서 내가 어떤 부분에서 실수를 했는지를 바로바로 알았을 것이다. 어떤 오류를 해결하기 위해서는 첫번째로 해야할 일이 "원인"을 찾는 것이다. "원인"을 알면 생각보다 오류를 해결하기 쉽다. 문제는 "원인"을 모를 때이다.

 

코드 로직이 복잡할수록 이 원인을 찾기가 더욱 힘들어진다. 사실 이번 미션 과제에서 내가 겪은 것은 현업에서 일어날 일에 비하면 새발의 피에 불과할 확률이 매우 높다. 실 서비스를 제공하는 현업에서의 코드 로직의 복잡도는 토이 프로젝트 대비 월등히 높을 것이기 때문이다.

 

아무쪼록 오늘 발견된 이 오류들의 원인은 굉장히 초보적인 부분의 실수들이 많았다. 예를 들어, convert 라는 메서드를 호출했어야 했는데 create 라는 메서드를 호출했다거나(메서드의 파라미터과 반환 타입이 동일), 그때 그때 변해야하는 값(Date 객체)을 Spring Bean에 할당하는 등등..

 

디버깅을 통해 순차적으로 어디서 난 오류인지를 찾아가며 오류의 원인들을 찾기는 했지만 이를 발견하는데 들어간 시간 손실이 너무 많았다는 생각이 들었다. 이외에도 응답 헤더 관련 CORS 이슈, 쿠키 SameSite 이슈 등 여러가지 예상치 못한 일(리팩토링과 무관한 일)들도 있어 오늘 하루는 기능 구현 보다는 장애 대응에 시간을 많이 소요하게 되었다. 😂

 

 

좋았던 점

  • 오늘 예상치 못한 많은 오류들을 접하며 여러 이슈들을 접해볼 수 있었고, 학습 교훈도 하나 얻어갈 수 있었던 것 같습니다. 👍

 

 

아쉬웠던 점

  • 어제에 이어서 프론트 엔드와의 연동 과정에서 수많은 오류들이 발생해 다음 기능 구현 작업에 착수하지 못한 점이 아쉬웠습니다. 😥

 

 

이전 보다 개선되었던 점

  • 이번 미션 과제를 수행하면서 리팩토링을 할 때는 테스트 코드 작성의 중요성을 다시금 느낄 수 있었습니다. 💦