반응형
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. 팀에서 상태머신이나 상태패턴을 사용해본 경험이 있는지 궁금합니다.
반응형
'독서' 카테고리의 다른 글
[디자인 패턴의 아름다움] ch 7.5 ~ ch 7.7 (1) | 2025.04.20 |
---|---|
[디자인 패턴의 아름다움] ch 7.1 ~ ch 7.4 (1) | 2025.04.13 |
[디자인 패턴의 아름다움] ch 6. 생성 디자인 패턴 (0) | 2025.04.06 |
[디자인패턴의 아름다움] ch 4, ch 5 (0) | 2025.03.30 |
[디자인패턴의 아름다움] ch 3 (0) | 2025.03.23 |