리팩토링 돌아보기

Su hwan Choi·2022년 10월 26일
0

하위 문서의 내용을 수정중입니다.

  • 참여했던 프로젝트의 리팩토링을 진행하면서 경험한 내용
    • 장기목표인 MSA적용까지는 이루지 못했지만, 그 과정에서 느꼈던 내용을 적어봄
  • 앞으로 글을 추가예정, 본 글에서는 전체적인 흐름관해 서술
  • 해당 글은 회고목적으로 작성된 글이며, 코드내용은 포함하고 있지 않습니다.

배경지식

image

  • 1,2 번의 정보는 상품판매구성, 상품판매구성값
    • 이 정보를 관리(저장,삭제,수정) 하는 기능
  • 서비스 오픈 직후여서 잠시 추가기능개발이 적었던 시기에 진행함

문제되었던 구조

문제되었던 구조


개선후 구조

변경후 구조

개선부분

  • Mapper 까지 사용된 DTO 클래스 : DTO 클래스를 계층별로 분리하고, 복잡한 inner static 클래스를 정리했다. 당연히 모든 영역이 위와 같은 문제가 있는 것은 아니며, 참여한 개발자들 모두 문제점을 인지한 상태였다.

  • 테스트하기 어려웠던 서비스코드 : 테스트하기 어려웠던 비즈니스 로직 메소드를 테스트가 가능한 구조로 변경하고, 하나의 서비스클래스를 여러개의 클래스로 나누었다.

  • Mybatis 프로젝트에 도메인주도개발 적용 : JPA 를 적용하기 쉽게 하는것을 목표로 Mybatis 로 최대한 ORM 처럼 쓸 수 있도록 코드구조를 수정했다.


트랜잭션스크립트 패턴과 도메인모델의 조합

당시 이 프로젝트에는 프로젝트의 일정이나 JPA 의 런닝커브등의 이유로 Mybatis 가 적용되어 있었다

  • JPA말고 Mybatis를 선택한 이유는, JPA 의 런닝커브 문제도 있었지만 도메인 주도개발 이 무조건 옳은 것이고, 잘나가는 개발자라면 JPA로 개발한다는 인식에 약간 거부감이 있었다.

  • 도메인 주도개발을 모르는 것은 아니지만 때와 상황에 맞게 써야 하고, 아직 내가 알고 있는 지식으로 실제 프로젝트에 바로 적용하는것은 리스크가 크기 때문에 점진적으로 개선할 것을 생각했다.

    • 그렇다고 내가 도메인 주도개발은 쓸모없다는 얘기를 하려는건 아니다. 테스트코드를 위해서라도 특정 계층과 격리된 도메인모델은 있으면 매우 좋다.
  • 위의 작업들이 끝난 후에도 내 생각은 변함이 없다. 잘 모르는 일정이 급한 신규 프로젝트를 도메인모델을 적용해 가며 할 경우, 이 모델을 잘못 만들면 정말 대재앙이 일어난다 생각한다.(물론 이 글을 읽어주시는 실력 좋으신 분들은 그럴리 없겠지만…)

    • 내가 경계하는건 부족한 시간으로 잘못 이해한 도메인 모델을 통해 개발 하는 것과 개발 외적인 이유로 자주 변경되는 사업(또는 프로젝트)에 적용되는 도메인 모델의 위험성이다.
  • 설계를 잘한다면, Mybatis 에서 ORM으로 리팩토링을 통해 구조를 개선해나가면서 수정할 수 있지 않을까? 라는 생각을 했었다.

    • 이 생각은 후에 JPA구현체 hibernate-orm의 위치를 보고 틀렸다는 인정을 한다.

결론적으로 세번째 이슈(Mybatis-ORM)는 적용에 한계가 있었다. 하지만 그 과정과 결과는 헛되지 않았다.

  • 초반에는 프로젝트의 복잡한 도메인로직이 없었기 때문에 큰 이슈는 없었지만, 일정이 지나고 기획팀과 얘기를 해가며 앞으로 어떤 부분이 어떻게 변할것인지 큰 그림을 알 수 있었다.
  • 다른 메뉴/화면과 동등한 수준으로 봤던 메뉴는 그렇지 않고 후에 그 정보를 통해 추가 개발이 예정된 상태였고 생각보다 이 메뉴/정보 들이 매우 중요해질 것이라는 생각이 들었다.
  • DTO 를 구분시키고, 서비스코드와 도메인 모델을 만들어가며 테스트 코드를 추가해가며 진행했지만 Mybatis를 ORM 처럼 적용해보는 것은 한계가 명확했다.
  • JPA 처럼 쓸수 있는 것을 만든다는 것은 결국 JPA 의 구현체를 직접 만드는것을 의미하며 그 외의 대안은 클래스의 복잡도만 증가시킨다는 결론을 내렸다.(이 부분은 후에 좀더 자세한내용으로 준비중이다)

최종 목표는 이루지 못했지만 그 과정에서 생각보다 많은것을 얻었다.

  • 코드 상으로는 당연히 전보다 좋아진 코드, 즉 변경하기 쉽고 테스트가 가능한 코드를 얻었다.
  • 리팩토링이후 해당 도메인에 대한 여러가지 복잡한 기능들을 비교적 쉽게 마칠 수 있었다.
  • Mybatis-ORM 의 적용은 실패했지만, 그 과정에서 참여한 개발자들과 여러 논의를 할 수 있었다. 특히 페어 프로그래밍을 통해서 같이 개발하는 진행하는 것이 생각보다 개발자간 도메인정보의 차이를 줄여줘서 놀라웠다.

0개의 댓글