우테코에서 주어진 첫번째 Level4 미션. WAS 구현하기.
고민했던 내용들을 정리해보도록 하겠습니다.
책임의 분리
가장 먼저 생각했던 건 WAS가 정확하게 무슨 일을 해주느냐? 였습니다.
- Socket으로 부터 들어온 요청을 읽어 요청 객체를 생성한다.
- 요청 객체와 사용자 코드를 바탕으로 적절한 Handler를 찾는다.
- 요청 객체와 Handler를 바탕으로 적절하게 Parameter를 Binding 한다.
- Handler와 Parameter를 바탕으로 Handler를 실행한다.
- Handler 실행 결과를 통해 응답 객체를 생성한다.
- 응답 객체를 바탕으로 적절한 View를 찾는다.
- 응답 객체와 View를 바탕으로 Socket을 통해 응답을 반환한다.
가장 먼저 7가지 책임이 떠올랐고, 해당 책임을 RequestHandler에서 생성 및 수행하도록 리팩토링 해봤습니다.
- Socket의 Reader로 읽은 정보를 통해 ServletRequest 생성
- 해당 Request의 Path를 통해 View가 존재하면 Mapping 과정 생략 후 즉시 View Resolving
- 사용자 Controller를 바탕으로 Handler Mapping
- Handler와 MessageConverter를 통해 Handler 실행
- ServletResponse를 Socket Output으로 전송
잘뜹니다.
하지만 객체지향의 설계원칙에 따라 부족한 부분에 대해서 생각해봅시다.
- 객체 생성과 연관관계를 설정하는 책임과, 각 객체들을 실행하는 컨텍스트 책임, 둘 다 RequestHandler가 해주고 있습니다. 이 책임은 분리되어야 합니다.
- 각 객체들이 클래스 의존관계를 가지고 있습니다. 상황에 따라 모두 변할 수 있으므로 해당 클래스들을 모두 인터페이스 의존관계를 통해 변경에 유연한 구조를 가져야 합니다.
- view가 있는 요청과 없는 요청을 판단하고, 그에 따라 결과를 반환하는 로직이 RequestHandler에 있습니다. RequestHandler는 각 객체들을 실행하는 컨텍스트 역할을 해야합니다.
👍👍