Post

TODO에서 기여까지

Spring Framework Jackson 3 테스트 코드 마이그레이션

개요

개인 프로젝트에서 TODO를 남기던 중, 다른 프로젝트에서는 이런 주석을 어떻게 사용하고 있는지 궁금해졌다. 이전에 Spring 코드를 살펴보며 코드와 관련 이슈, PR, 커밋, 테스트의 맥락을 함께 따라갈 수 있었던 경험이 인상적이었고, 자연스럽게 Spring Framework에 남아 있는 TODO를 찾아보게 됐다.

Spring 코드에서 발견한 두 개의 TODO

첫 번째: 설명 없이 남아 있던 TODO

TODO를 따라 Spring Framework 코드를 살펴보다가, 별다른 설명 없이 남아 있던 TODO 주석 하나를 발견했다.

설명 없이 남아 있던 TODO
의미 없이 남아 있던 TODO

원본 커밋을 확인해 보니 기능 코드와 테스트를 추가하는 과정에서 함께 남은 주석이었고, 해당 TODO가 가리키는 후속 작업은 따로 남아 있지 않았다. 그래서 의미 없이 남아 있던 TODO만 제거하는 작은 PR을 올렸다.


두 번째: Jackson 3 마이그레이션 TODO

첫 번째 TODO를 정리한 뒤, 다른 TODO를 더 살펴보던 중 Jackson 2로 남아 있는 테스트를 발견했다. Spring Framework 7이 이미 Jackson 3로 넘어간 버전이라는 것을 알고 있었고, 해당 TODO는 Jackson 3로의 마이그레이션을 가리키고 있었다.

Jackson 2 호환성 테스트를 제외한 다른 테스트들은 Jackson 3로 넘어갔는데, 해당 테스트만 Jackson 2 기반으로 남아 있어 왜 아직 마이그레이션되지 않았는지 의문이 들었다.

Jackson 3 마이그레이션 TODO
Jackson 3 마이그레이션을 가리키고 있던 TODO

해당 테스트는 RequestBodyAdvice와 ResponseBodyAdvice를 모두 구현한 Advice의 응답 변환 로직이 RequestMappingHandlerAdapter에서 한 번만 적용되는지 검증하고 있었다. Jackson 2에 의존해야 할 이유는 없었고, TODO도 Jackson 3로의 마이그레이션을 가리키고 있었다. 그래서 기존 검증을 유지하는 범위에서 마이그레이션을 진행했다.


먼저 해당 테스트에서 응답 객체를 JSON으로 변환하던 converter를 Jackson 2용에서 Jackson 3용으로 교체했다.

Jackson 3용 converter 교체 diff
Jackson 3용 converter로 교체

하지만 converter만 바꿔서는 기존 테스트의 검증 결과를 유지할 수 없었다. 기존에는 이 검증을 위한 전용 Advice가 추상 Advice 클래스를 상속하고, 그 내부 흐름에서 응답 body와 상태 코드를 변경하는 구조였다.

Jackson 3용 converter는 내부 처리 구조가 달라 전용 Advice가 기존과 같은 방식으로 응답을 변경할 수 없었다. 이번 테스트는 응답 자체를 변경해야 했기 때문에 추상 클래스 상속을 제거하고 필요한 Advice 동작을 직접 구현했다. beforeBodyWrite()에서 기존과 동일한 응답을 만들었고, 상태 코드와 JSON 본문 검증은 그대로 유지했다.

Jackson 2·3 Advice 변경 diff
Jackson 2용 추상 Advice 상속을 제거하고 Jackson 3 기준의 Advice 구현으로 변경한 부분

변경 사항은 PR로 제출했고, Spring Framework 7.1.0에 병합되었다.

TODO에서 기여까지

처음에는 TODO 주석을 어떻게 활용하는지에 대한 막연한 궁금증이 두 건의 기여로 이어졌다.

그전까지는 주로 간단한 변경에 기여했지만, 이번에는 테스트의 의도와 내부 동작을 이해하고 수정하는 데까지 기여의 범위를 넓힐 수 있었다. 다음에는 운영 코드에도 기여해 @author 태그에 내 이름을 남기는 일에 도전해보려 한다.

This post is licensed under CC BY 4.0 by the author.