독서

[디자인 패턴의 아름다움] ch 8.1 ~ 8.7

오렌지색 귤 2025. 4. 27. 21:39
반응형

p. 388

8.1.6절에서 guava event bus를 사용하여 UserController 클래스를 다시 구현했다 하지만 UserController 클래스는 여전히 스레드 풀을 생성하고 옵서버를 등록하는 등 옵서버 패턴과 관련된 비지니스와 관련 없는 코드가 많이 남아 있다. 이 UserController 클래스를 어떻게 더 개선할 수 있을지 생각해보자.

 

EventBusConfigurator 등의 모듈에서 옵서버를 등록한다.

EventDispatcher 같은 추상 인터페이스를 정의하고 GuavaEventDispatcher 구현체를 실제 UserController 에서 사용하도록 한다.

 

 

p. 390

read() 함수는 데이터를 읽는 전 과정을 정의하는 템플릿 메서드로, 하위 클래스별로 정의된 추상 메서드를 노출한다. 이 추상 메서드의 이름 역시 read()로 동일하지만, 매개변수와 템플릿 메서드는 같지 않다.

 

public abstract int read()

  • 한 바이트 단위로 읽는 것이 스트림의 가장 기본 동작이다
  • 각 InputStream 서브클래스는 이 메서드만 최소한으로 구현하면 "스트림에서 데이터 하나를 꺼내는" 기능을 갖추게 된다.

public int read(byte[] b, int off, int len)

  • 여러 바이트를 한 번에 읽어들이는 편의 메서드로, 기본적으로 read()를 여러 번 호출해 구현되어 있다.
  • 구현체가 업로드와 다운로드 같은 “대용량 데이터 처리”에 최적화하려면, 이 메서드를 오버라이드하여 더 효율적인 버퍼 복사 로직을 넣으면 된다.

 

Q. 스트림에서 데이터 하나를 꺼내는 기능이 구현체마다 다르게 정의되는 이유는?

 

A. 각 스트림 구현체마다 "한 바이트 읽기"가 실제로 수행하는 일은 완전히 다르다.

 

1. FileInputStream 은 OS의 파일 디스크립터를 통해 직접 시스템 콜을 발생시켜야 한다.

2. SocketInputStream 은 네트워크 버퍼에서 데이터를 가져오기 위해 소켓 레벨의 I/O 경로를 타야 한다.

3. ByteArrayInputStream 은 JVM 힙에 올라 있는 배열에서 단순히 인덱스를 증가시켜 바이트를 꺼낸다.

 

 

Q. 금융 회계 업무에 상태 머신을 활용한다면?

 

A. 금융·회계 시스템의 전표, 결제, 환불, 승인 등 다단계 프로세스는 상태 머신과 상태 패턴이 딱 맞는 대표적 예

 

전표 승인 워크플로우

[생성] → [승인 대기] → (승인) → [승인 완료] → [집계 대기] → [집계 완료]
           ↘ (반려) ↗

 

  • 이벤트 : 승인, 요청, 반려, 재요청
  • 상태 머신
    • 상태 생성, 승인 대기, 승인 완료, 반려, 집계 완료 등
    • 전이 : submitForApproval, approve, reject, aggregate

 

 

기타 궁금한 사항

1. 팀에서 상태머신이나 상태패턴을 사용해본 경험이 있는지 궁금합니다.

반응형