베이스캠프 6・7주차 회고

개발하기 그 이후…

베이스캠프 5주차까지 본격적인 예매 시스템의 기능 개발이 완료되었고, 개발 서버 배포 및 시연 발표까지도 마무리되었다. 그리고 이것으로 어느 정도 마무리…라는 착각을 아주 잠시 하고 있던 찰나, 새로운 과제들이 주어졌다.

6주차에는 깨끗한 코드 만들기, 7주차에는 웹 서버 스케일 아웃이라는 주제로 과제들이 주어졌고 이전과 마찬가지로 만만치 않았다. 그래도 맨땅에 헤딩하던 4・5주차 만큼은 아니었다.

깨끗한 코드 만들기

6주차에는 코드리뷰 결과 및 SonarQube의 정적 분석 결과를 중심으로 버그 발생이 우려되거나 중복이 존재하는 코드들을 리팩토링하고, Junit 테스트를 추가하는 것이 주된 과제였다. 또한 개발 이전에 제출해던 DB 모델링 검수 요청의 결과 통지 및 DB 모델링 관련 교육이 있었고, 검수 결과를 반영하여 수정한 DB 모델을 서비스에 반영해야 했다.

우리 TF는 DB 모델의 수정에 따라 서비스를 밑바닥부터 뜯어고치는 동시에, 수정한 클래스에 대한 단위 테스트를 작성해 작성해 나가는 형태로 코드 리팩토링을 진행해 나갔다. 사실 자바의 컨벤션이라든지 클린 코드에 대해서는 입사 이전에 짧은 시간이나마 연습을 해 본 경험이 있었기 때문에 리팩토링 자체는 크게 어렵지 않았다. 다만 Junit 테스트 코드를 작성해 본 경험이 전무했기 때문에, 테스트를 추가해 나가는 과정에서 시간이 많이 소요되었다. 또한 코드를 밑바닥부터 뜯어고쳐 가는 과정도 만만치 않은 부담이었다.

그렇게 리팩토링 및 테스트 작성 과정에서 쿼리 효율성에 치명적인 문제가 있다는 사실을 발견하게 되는데… 이 부분은 크로스 조인의 늪 문서를 참고해 주기 바란다.

웹 서버 스케일 아웃

7주차의 교육 주제는 웹 서버의 스케일 아웃이었다. 웹 서버 2대를 구동한다고 했을 때, 무엇이 필요할까? 공유 자원의 관리가 필요했다. 우리가 관리해야 할 공유 자원은 로그인 관리를 위한 세션, 그리고 영화 포스터 등의 파일이었다. 그래서 구현해야 주요 내용은 다음과 같았다.

1) 공유 세션 2) 외부 스토리지에의 파일 저장 및 불러오기

위의 두 가지 구현사항에 있어 코드의 작성은 다른 TF원이 담당해 주었고, 구현상의 어려움은 나의 몫이 아니었다.

하지만 의외로 인터페이스 설계에 있어서 어려움이 있었다. 우리는 공유 세션을 1) DB를 활용하는 방식2) 레디스를 활용하는 방식 두 가지로, 그리고 파일 관리의 경우에는 1) 기존의 로컬 디스크를 활용하는 방식2) 리모트 스토리지를 활용하는 방식 두 가지로 구현하고 실행 시점의 설정 따라 다른 방식으로 작동하는 형태로 개발을 진행해야 했다. 이전과는 달리 하나의 인터페이스에 대해 다수의 구현체가 대응해야 했고, 이를 위해 공통 인터페이스를 설계를 함께 해 나가는 과정이 쉽지만은 않았다. 구현을 하는 과정 속에서 인터페이스 설계상의 문제점이 발견되어 부득이 인터페이스를 수정해야 했고,, 이 과정에서 다시 구현을 수정하게 되면서 개발이 지연되었다.

나는 7주차에 주어진 과제와는 다소 거리가 있는 부분이기는 했지만, 이전부터 TF 내에서 필요성이 제기되었던 전역 예외 핸들러를 구현했다. ControllerAdvice라는 Spring의 기능을 활용하게 되면 컨트롤러 내에서 발생하는, 혹은 컨트롤러에서 호출한 메소드의 처리 과정 상에서 발생하는 익셉션을 전부를 핸들링할 수 있는 클래스를 생성할 수 있었다. 이러한 기능을 활용하여, 불필요한 성공 여부 반환(return (boolean) success;) 및 그에 따른 분기 처리, 여러 컨트롤러에 걸쳐 있는 반복적인 예외 핸들링 등을 삭제하였고, 이를 전역 예외 핸들러에 예외를 던지는 방식으로 대체할 수 있었다.

정리하며

주어진 과제보다도, 개발 당시 잘못 설계된 ORM 쿼리를 수정하느라 많은 시간을 보내야 했다.

실제 서비스였다면, 그리고 모른 채로 지나갔다면 심각한 성능상의 문제를 일으키지는 않았을까?

앞으로는 꼼꼼하고 치밀한 코드 작성을 통해서 오류와 성능상 문제의 발생을 최소화하는 개발을 진행해 나가야겠다.

댓글남기기