ETC
지속 성장 가능한 코드를 만들어가는 방법 (정리)
ch-yang
2022. 12. 30. 14:15
영상 링크 : https://www.youtube.com/watch?v=RVO02Z1dLF8&ab_channel=%ED%86%A0%EC%8A%A4 상
토스 페이먼츠
- 코드 품질에 관심을 갖고 확장 가능한 방식으로 코드를 관리하고 있다.
- 처음부터 최고의 설계나 품질을 유지하기 보다는, 최소 규칙을 지켜 동작하는 소프트웨어를 빠르게 만들고 코드에 관심을 두고 성장시켜 나간다.
Import 문을 통해 알아보는 세 가지 개선 방향
- Package, Layer, Module
1. Package
- 패키지 전략은 고정되지 않고 유연해야 한다.
- 패키지는 현재 상황을 계속 점검하며, 전략에 따라 응집에 대해 유연하게 지켜야 한다.
- 햄버거도 한 세트 주문할 때와 100 세트 주문할 때 포장 패키지가 달라질 것이다.
- 너무 분산 되지 않도록 작성한다. (영상에서는 비슷한 개념끼리 패키지를 응집했다)
- 같은 개념을 응집하니 Import 문이 많이 줄어든 것을 볼 수 있다.
- 한 개념 (패키지)에 클래스가 너무 많다면 어떻게 해야 할까?
- 개념의 범위가 너무 커진다면, 그 속에서 구체적인 개념화를 진행하면 된다.
2. Layer
토스 페이먼츠 표준 Layer 구조 및 규칙
- Layer는 위에서 아래로 순방향으로만 참조되어야 한다.
- Layer는 건너뛰지 않는다.
- 참조 역전 예시)
- 프레젠테이션 로직 코드
- 비즈니스 로직 코드
- 빨간색 비즈니스 로직 코드를 보면, 프레젠테이션 로직을 참조하고 있다.
- Layer 참조 역류가 일어났다.
- 참조 역전 수정)
- 수정한 프레젠테이션 로직 코드
- 수정한 비즈니스 로직 코드
- 프레젠테이션 로직에서 비즈니스 로직으로 전달할 때 개념화된 클래스로 전달했다.
- 또한 비즈니스 로직이 어떤 다른 개념에 의존적인지도 알 수 있다.
- Layer의 잘못된 참조는 장기적으로 코드의 복잡도를 높이고 확장에 문제를 만든다.
- 비즈니스 로직을 보면 Layer의 역류가 일어나지 않음을 알 수 있다.
3. Module
- 토스 페이먼츠 표준 Module 구조
- 화살표 방향은 Gradle 구성에서 의존하는 방향을 의미
- Runtime 시에는 Runnable한 Module을 중심으로 의존성이 주입되어 실행된다.
- 회색 원은 외부 기능을 확장할 때, 새로운 모듈을 만들어 간다는 의미
- 모듈 분리의 장점
- 기술을 격리할 수 있다.
- 각 모듈별로 테스트가 가능하다.
- 역할과 경계를 뚜렷하게 정의할 수 있다.
- 의존성 침투를 막을 수 있다.
- 라이브러리에 대한 부분을 격리하여, 비즈니스 로직에서 특정 라이브러리에 대한 Import 자체를 막을 수 있다.
- 추후 라이브러리가 변경되더라도 비즈니스 로직에 영향 없이 작업할 수 있게 된다.