솜이의 데브로그

11-13장 ) 시스템, 창발성, 동시성 본문

책을 읽자/Clean Code

11-13장 ) 시스템, 창발성, 동시성

somsoming 2022. 4. 17. 00:48

Reference : 클린코드

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788966260959 

 

Clean Code(클린 코드) - 교보문고

애자일 소프트웨어 장인 정신 | 나쁜 코드도 돌아는 간다. 하지만 코드가 깨끗하지 못하면 개발 조직은 기어간다. 매년 지저분한 코드로 수많은 시간과 상당한 자원이 낭비된다. 그래야 할 이유

www.kyobobook.co.kr

 

11장 ) 시스템

 

깨끗한 코드를 구현하면 낮은 추상화 수준에서 관심사를 분리하기 쉬워진다.

높은 추상화 수준, 즉 시스템 수준에서도 깨끗함을 유지하는 방법을 알아보자.

 

  • 시스템 제작과 시스템 사용을 분리하라
    • 소프트웨어 시스템은 애플리케이션 객체를 제작하고 의존성을 서로 '연결'하는 준비 과정과 준비 과정 이후에 이어지는 런타임 로직을 분리해야 한다.
    • Main 분리 : 시스템 생성과 시스템 사용을 분리하는 한 가지 방법으로, 생성과 관련한 코드는 모두 main이나 main이 호출하는 모듈로 옮기고, 나머지 시스템은 모든 객체가 생성되었고 모든 의존성이 연결되었다고 가정한다. 즉, 애플리케이션은 main이나 객체가 생성되는 과정을 전혀 모른다.
    • 팩토리 : ABSTRACT FACTORY 패턴.
    • 의존성 주입 : 제어 역전 기법을 의존성 관리에 적용한 메커니즘이다. 제어 역전에서는 한 객체가 맡은 보조 책임을 새로운 객체에게 전적으로 떠넘긴다.
  • 확장
    • 소프트웨어 시스템은 물리적인 시스템과 다르다. 관심사를 적절히 분리해 관리한다면 소프트웨어 아키텍처는 점진적으로 발전할 수 있다.
    • 모든 객체가 전반적으로 동일한 방식을 이용하게 만들어야 한다.
  • 자바 프록시
    • 자바 프록시는 단순한 상황에 적합하다. 개별 객체나 클래스에서 메서드 호출을 감싸는 경우가 좋은 예다.
  • 순수 자바 AOP 프레임워크
    • 스프링은 비즈니스 논리를 POJO로 구현한다. (Plain Old Java Object)
    • POJO는 순수하게 도메인에 초점을 맞추며, 엔터 프라이즈 프레임워크에 의존하지 않아 테스트가 개념적으로 더 쉽고 간단하다.
  • AspectJ 관점
    • 언어 차원에서 관점을 모듈화 구성으로 지원하는 자바 언어 확장이다.
  • 테스트 주도 시스템 아키텍처 구축

→최선의 시스템 구조는 각기 POJO 객체로 구현되는 모듈화된 관심사 영역으로 구성된다. 이렇게 서로 다른 영역은 해당 영역 코드에 최소한의 영향을 미치는 관점이나 유사한 도구를 사용해 통합한다. 이런 구조 역시 코드와 마찬가지로 테스트 주도 기법을 적용할 수 있다.

 

  • 의사 결정을 최적화하라
  • 명백한 가치가 있을 때 표준을 현명하게 사용하라
  • 시스템은 도메인 특화 언어가 필요하다

 

모든 추상화 단계에서 의도는 명확히 표현해야 한다. 그러려면 POJO를 작성하고 관점 혹은 관점과 유사한 메커니즘을 사용해 각 구현 관심사를 분리해야 한다.

 

 

 

12장 ) 창발성

  1. 모든 테스트를 실행한다.
    • 테스트를 철저히 거쳐 모든 테스트 케이스를 항상 통과하는 시스템은 '테스트가 가능한 시스템' 이다.
  2. 중복을 없앤다.
    • 리팩터링 단계에 응집도를 높이고, 결합도를 낮추고, 관심사를 분리하고, 시스템 관심사를 모듈로 나누고, 함수와 클래스 크기를 줄이고, 더 나은 이름을 선택하는 등 다양한 기법을 동원한다.
  3. 프로그래머 의도를 표현한다.
  4. 클래스와 메서드 수를 최소로 줄인다.

 

 

13장 ) 동시성

동시성은 결합을 없애는 전략이다.

즉, 무엇과 언제를 분리하는 전략이다. -> 이를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다.

 

 

동시성 방어 원칙

  • 단일 책임 원칙 (Single Responsibility Principle, SRP)
    • SRP는 주어진 메서드/클래스/컴포넌트를 변경할 이유가 하나여야 한다는 원칙이다.
    • 동시성 코드는 독자적인 개발, 변경, 조율 주기가 있다.
    • 동시성 코드에는 독자적인 난관이 있다.
    • 잘못 구현한 동시성 코드는 별의별 방식으로 실패한다.
  • 따름 정리 : 자료 범위를 제한하라
    • 공유 객체를 사용하는 코드 내 임계영역을 synchronized 키워드로 보호하는 것을 권장한다.
  • 따름 정리 : 자료 사본을 사용하라
    • 공유 자원을 줄이려면 처음부터 공유하지 않는 방법이 제일 좋다.
  • 따름 정리 : 스레드는 가능한 독립적으로 구현하라
    • 다른 스레드와 자료를 공유하지 않으며, 각 스레드는 클라이언트 요청 하나를 처리한다.

 

라이브러리를 이해하라. 자바 5로 스레드 코드를 구현 시

  • 스레드 환경에 안전한 컬렉션을 사용한다.
  • 서로 무관한 작업을 수행할 때는 executor 프레임워크를 사용한다.
  • 가능하다면 스레드가 차단되지 않는 방법을 사용한다.
  • 일부 클래스 라이브러리는 스레드에 아넌하지 못하다.

 

동기화하는 메서드 사이에 존재하는 의존성을 이해하라.

  • 클라이언트에서 잠금
  • 서버에서 잠금
  • 연결 서버

 

동기화하는 부분을 작게 만들어라.

 

다중 스레드를 쓰는 코드 부분을 다양한 환경에 쉽게 끼워 넣을 수 있게 스레드 코드를 구현하라

  • 한 스레드로 실행하거나, 여러 스레드로 실행하거나, 실행 중 스레드 수를 바꿔본다.
  • 스레드 코드를 실제 환경이나 테스트 환경에서 돌려본다.
  • 테스트 코드를 빨리, 천천히, 다양한 속도로 돌려본다.
  • 반복 테스트가 가능하도록 테스트 케이스를 작성한다.

 

 

SRP를 준수하며, POJO를 사용해 스레드를 아는 코드와 스레드를 모르는 코드를 분리한다.

스레드 코드를 테스트 할 때는 전적으로 스레드만 테스트한다. 즉, 스레드 코드는 최대한 집약되고 작아져야 한다.