개발자 이민재입니다.

POSTS

2024년 7월 회고

8min read

정처기 시험 끝내고 놀다보니 벌써 8월 중순입니다. 8월들어 좀 쉬엄쉬엄 하겠다고 블로그도 많이 밀려서, 소재들은 많이 쌓아두었는데 결국 온전한 글로 작성하진 못했네요. 여름 휴가가 끝났으니, 늦게나마 7월의 회고라도 해보려고 합니다.

구매 로직의 리팩터링

    7월에 한 프로젝트 중 하나는 구매, 판매 주문 로직을 재작성하는 일이었습니다. 회사 비즈니스 특성 상, 물품 구매 시 여러 포인트사와 연동하도록 되어 있었습니다. 제가 처음에 들어올 때는 협력사가 한 군데여서, if문 분기로 모든걸 처리하는 구조였습니다. 이를테면 if(A 협력사) A 구매 로직, else 회사 구매 로직 이런 식이었습니다. 애초에 경영진이 협력 포인트사를 여러 개로 확장할 것이라고 생각하지 않았기 때문에, 이런 구조가 문제되지 않았습니다. 만약 협력사를 하나 추가한다고 하더라도, 기존 구매 로직을 복사 붙여넣기 해서 해결할 생각이었습니다.
    최근에는 협력사를 다양하게 추가해서 유저를 모으는 전략을 세웠고, 빠르게 협력사 api를 연동할 수 있는 코드 구조를 만들어야 했습니다. 문제는 포인트사마다 연동하는 방식이 조금씩 달라서, 협력사 간 연동 공통점을 추상화해서 다른 부분들이 만들어내는 복잡성을 관리할 필요가 있었습니다.
    이런 상황을 극복하도록 구매로직의 전반적인 리팩터링을 시도했습니다. 첫번째는 포인트 협력사 API 클라이언트를 추상화하는 것, 두번째는 구매 도메인에 맞게 추상화된 도메인 클래스를 만드는 것이었습니다. 먼저, '포인트' 협력사가 제공하는 API는 공통점이 많았습니다. 거래를 식별하는 번호, 유저의 포인트 조회, 유저 식별번호(일반적으로는 ci를 사용합니다.), 포인트 사용, 사용 취소 기능 등입니다. CRUD를 API로 연동하는 셈이었습니다. 매개변수로 받는 데이터들이 다를 뿐이었습니다.
    이런 공통점을 바탕으로, 포인트협력사 api를 먼저 추상화해서 인터페이스로 만들었습니다. usePoint, cancelPoint, getPoint, auth 등의 메서드들을 제공하는 인터페이스였습니다. 각 구현체들은 포인트사의 상황에 맞게 해당 메서드들을 구현하기만 하면 되었습니다.
    또한, 포인트사의 플랫폼마다 달라지는 수수료율을 쉽게 적용하기 위해 금액, 결제 도메인을 하나의 타입(클래스)으로 만들어 추상화하고 단위테스트를 작성했습니다.
    이렇게 리팩터링 한 결과 7월에 새로 추가된 협력사의 경우 서버 코드는 3일 만에 완성했고, 출시 전 나머지 시간은 협력사의 담당자와 연락해서 통합테스트하는 데 시간을 보낼 수 있었습니다.

정보처리기사 실기

    7월 말에는 정보처리기사 실기 2회차 시험을 응시했습니다. 필기는 문제 은행 방식이어서 기출문제가 그대로 나와 쉽게 풀 수 있었지만, 실기는 문제가 새로 나와 꼼꼼하게 공부했습니다.
    사실 이 시험을 또 경험하고 싶지 않았던 마음이 컸습니다. 금방 까먹어서 의미 없어질 지식들을 계속 반복하는 것이 지겨웠습니다. 또, 출제되는 대부분 내용이 당장 실무에 직접적으로 도움이 되는 지식의 종류도 아니어서 그랬던 것 같습니다.
반면에 AWS 자격증 시험은 공부 과정에서 스트레스는 받았지만 실무와의 접점 때문에 그래도 공부하면서 꽤 도움이 된다는 느낌은 받았고, 실제로 일하면서 많이 적용하기도 했습니다.
    이래저래 정처기 실기 시험은 빨리 끝내고 싶은 마음이 컸습니다.

읽은 책

    8월 들어서 조영호 개발자님의 '객체지향의 사실과 오해'라는 책을 읽고 있습니다. 객체지향의 첫 만남이 아무래도 자바나 C++ 입문서에서 다루는 클래스 문법이기 때문에, 객체지향이라는 단어를 들으면 항상 특정 언어의 클래스 문법과 객체지향이라는 개념을 연관짓고는 했습니다. 이 책은 그런 과정에서 생기는 오해들을 해소하는 데 아주 큰 도움이 되었습니다. 쉽고 직관적인 예시와 더불어, 책에서 자주 사용하는 용어들을 착실하게 정의해나가면서 다형성, 클래스, 추상화, SOLID 원칙 등 객체지향을 관통하는 개념들을 자연스럽게 탐색할 수 있게 해주는 책입니다.
    정처기 실기시험을 끝내고 책을 읽기 시작했는데, 마침 Java의 문법 세부사항을 물어보던 실기 문제들이 생각나면서, 깊게 파고드는 미시적인 지식과 넓게 탐구하는 거시적인 지식을 병행하는 것이 중요하다는 것을 다시 실감했습니다. 이를테면 상속에서 함수 호출관계가 어떻게 되는지 정확히 이해하는 것도 필요하지만, 그 이전에 어떤 맥락에서 상속이라는 개념을 어떻게 사용할 것인가라는 문제를 인식하고 해결하는 것이 중요하다는 걸 알게됐습니다.
    이 책을 읽으면서 객체지향이라는 개념을 다시 정립하고, 이를 기반으로 제가 작성해왔던 코드는 어땠는지 되돌아보고 있습니다.