-
8장 - 코드를 모듈화하라클린 코드(Clean Code)/좋은 코드, 나쁜 코드 요약 2023. 12. 17. 00:01
모듈화의 목적
코드가 향후 어떻게 변경되거나 재구성될지 정확히 알지 못한 상태에서 변경과 재구성이 용이한 코드를 작성기 위함
모듈화를 잘 구성해 두면 요구사항 중 하나가 변경된다면, 해당 요구사항이나 기능에 관련된 부분만 수정하면 됩니다.
코드 모듈화를 잘하는 방법
- 의존성 주입 사용을 고려하기
- 인터페이스에 의존하기
- 상속보다는 합성(compose) 활용하기
- 관련 있는 데이터 캡슐화하기
- 반환 유형에 구현 세부 정보가 유출되지 않도록 주의하라
의존성 주입 사용을 고려하기
Spring Framework를 활용하다 보면 자연스러운 DI라는 개념입니다.
interface를 활용하고 있으며 클래스의 인스턴스를 생성할 때 생성자를 통해 의존성을 주입하여 다양한 구현 클래스들을 활용할 수 있게 됩니다.
이렇게 되면 구현 클래스를 생성해서 주입해야 하기 때문에 코드가 조금 지저분해질 수 있지만 팩토리 함수를 활용하면 코드도 간결하게 사용할 수 있습니다.
인터페이스에 의존하기
특정 구현체에 의존하면 특정 구현체만 사용할 수 있기 때문에 자연스럽게 유연함이 떨어지게 됩니다.
상속보다는 합성(compose) 활용하기
슈퍼클래스가 수정되면 서브클래스가 작동하지 않을 수 있습니다.
일부언어에서는 다중 상속을 지원하는데 다이아몬드 문제가 발생할 수 있습니다.
일부언어에서는 단일 상속만 지원하기 때문에 2개 이상 상속을 활용할 수 없습니다.
Effective Kotlin에서도 나왔던 상속보다는 컴포지션 활용하기
https://junuuu.tistory.com/658
관련 있는 데이터는 캡슐화하기
관련된 데이터는 DTO등을로 묶어서 캡슐화하게 되면 함수의 인자로 넘길 때도 해당 클래스 안에 뭐가 들어있는지 신경 쓰지 않고 클래스만 전달할 수 있습니다.
다만 너무 많은 개념이 한 클래스에 있으면 문제가 될 수 있습니다.
반환 유형에 구현 세부 정보가 유출되지 않도록 주의하라
우리는 흔히 Controller에서 HTTP 요청을 받고 FeignClient 등을 활용해서 외부 HTTP 요청을 보내곤 합니다.
하지만 HTTP의 statusCode은 200과 404에 대해 모르는 개발자가 있을 수 있고 가끔 사용되는 50개 이상의 다른 HTTP 상태 코드도 존재합니다.
만약 Service에서 해당 구현에 대한 사실을 알고 다루게 된다면 추후에 변경해야 할 상황들이 많아집니다.
만약 HTTP 아 아니라 webSocket 연결을 사용해야 한다면? 변경해야 할 코드가 너무 많아지게 됩니다.
따라서 HTTP 와 관련된 것은 Controller에 격리시켜 놓는 것처럼 Adapter 등을 두어 Service와는 격리시켜 놓는 것이 좋습니다.
그리고 Service에는 최소한의 개념만 노출합니다.
- 사용자가 존재하지 않는다.
- 서버에 연결할 수 없는 등의 일시적인 오류가 발생했다.
- 사용자를 찾아 반환한다.
마찬가지로 예외의 경우에도 JPA에서 활용되는 OptimisticLockException 등을 활용하기 보다 추상화 계층에 적합한 예외를 만들어 DataSaveException 등을 활용해 볼 수도 있습니다.
'클린 코드(Clean Code) > 좋은 코드, 나쁜 코드 요약' 카테고리의 다른 글
10장 - 단위 테스트의 원칙 (0) 2023.12.19 9장 - 코드를 재사용하고 일반화할 수 있도록 하라 (0) 2023.12.18 7장 - 코드를 오용하기 어렵게 만들라 (0) 2023.12.16 6장 - 예측 가능한 코드를 작성하라 (0) 2023.12.15 5장 - 가독성 높은 코드를 작성하라 (0) 2023.12.14