ABOUT ME

Today
Yesterday
Total
  • 8장 - 코드를 모듈화하라
    클린 코드(Clean Code)/좋은 코드, 나쁜 코드 요약 2023. 12. 17. 00:01
    반응형

    모듈화의 목적

    코드가 향후 어떻게 변경되거나 재구성될지 정확히 알지 못한 상태에서 변경과 재구성이 용이한 코드를 작성기 위함

    모듈화를 잘 구성해 두면 요구사항 중 하나가 변경된다면, 해당 요구사항이나 기능에 관련된 부분만 수정하면 됩니다.

     

    코드 모듈화를 잘하는 방법

    • 의존성 주입 사용을 고려하기
    • 인터페이스에 의존하기
    • 상속보다는 합성(compose) 활용하기
    • 관련 있는 데이터 캡슐화하기
    • 반환 유형에 구현 세부 정보가 유출되지 않도록 주의하라

     

    의존성 주입 사용을 고려하기

    Spring Framework를 활용하다 보면 자연스러운 DI라는 개념입니다.

    interface를 활용하고 있으며 클래스의 인스턴스를 생성할 때 생성자를 통해 의존성을 주입하여 다양한 구현 클래스들을 활용할 수 있게 됩니다.

     

    이렇게 되면 구현 클래스를 생성해서 주입해야 하기 때문에 코드가 조금 지저분해질 수 있지만 팩토리 함수를 활용하면 코드도 간결하게 사용할 수 있습니다.

     

     

    인터페이스에 의존하기

    특정 구현체에 의존하면 특정 구현체만 사용할 수 있기 때문에 자연스럽게 유연함이 떨어지게 됩니다.

     

     

    상속보다는 합성(compose) 활용하기

    슈퍼클래스가 수정되면 서브클래스가 작동하지 않을 수 있습니다.

    일부언어에서는 다중 상속을 지원하는데 다이아몬드 문제가 발생할 수 있습니다.

    일부언어에서는 단일 상속만 지원하기 때문에 2개 이상 상속을 활용할 수 없습니다.

     

    Effective Kotlin에서도 나왔던 상속보다는 컴포지션 활용하기

    https://junuuu.tistory.com/658

     

    36장 - 상속보다는 컴포지션을 사용하라

    개요 상속은 is-a 관계의 객체 계층 구조를 만들기 위해 설계되었습니다. 코드의 재사용성을 위해 상속을 사용할 때 관계가 명확하지 않을 때 신중하게 고려해야 합니다. 간단한 행위 재사용 class

    junuuu.tistory.com

     

     

    관련 있는 데이터는 캡슐화하기

    관련된 데이터는 DTO등을로 묶어서 캡슐화하게 되면 함수의 인자로 넘길 때도 해당 클래스 안에 뭐가 들어있는지 신경 쓰지 않고 클래스만 전달할 수 있습니다.

     

    다만 너무 많은 개념이 한 클래스에 있으면 문제가 될 수 있습니다.

     

    반환 유형에 구현 세부 정보가 유출되지 않도록 주의하라

    우리는 흔히 Controller에서 HTTP 요청을 받고 FeignClient 등을 활용해서 외부 HTTP 요청을 보내곤 합니다.

    하지만 HTTP의 statusCode은 200과 404에 대해 모르는 개발자가 있을 수 있고 가끔 사용되는 50개 이상의 다른 HTTP 상태 코드도 존재합니다.

     

    만약 Service에서 해당 구현에 대한 사실을 알고 다루게 된다면 추후에 변경해야 할 상황들이 많아집니다.

    만약 HTTP 아 아니라 webSocket 연결을 사용해야 한다면? 변경해야 할 코드가 너무 많아지게 됩니다.

     

    따라서 HTTP 와 관련된 것은 Controller에 격리시켜 놓는 것처럼 Adapter 등을 두어 Service와는 격리시켜 놓는 것이 좋습니다.

     

    그리고 Service에는 최소한의 개념만 노출합니다.

    • 사용자가 존재하지 않는다.
    • 서버에 연결할 수 없는 등의 일시적인 오류가 발생했다.
    • 사용자를 찾아 반환한다.

     

    마찬가지로 예외의 경우에도 JPA에서 활용되는 OptimisticLockException  등을 활용하기 보다 추상화 계층에 적합한 예외를 만들어 DataSaveException 등을 활용해 볼 수도 있습니다.

    댓글

Designed by Tistory.