RequestHandler 클래스를 보면 기능이 추가될 때마다 분기문(if/else)이 하나씩 추가되는 방식으로 구현되어 있다. 기능이 많아질수록 분기문의 수는 증가한다. 자바의 다형성을 활용해 분기문을 제거한다.
HINT | · 각 요청과 응답에 대한 처리를 담당하는 부분을 추상화해 인터페이스로 만든다. 인터페이스는 다음과 같이 구현할 수 있다. public interface Controller { void service(HttpRequest request, HttpResponse response); } · 각 분기문을 Controller 인터페이스를 구현하는(implements) 클래스를 만들어 분리한다. · 이렇게 생성한 Controller 구현체를 Map<String, Controller>에 저장한다. Map의 key에 해당하는 String은 요청 URL, value에 해당하는 Controller는 Controller 구현체이다. · 클라이언트 요청 URL에 해당하는 Controller를 찾아 service() 메서드를 호출한다. · Controller 인터페이스를 구현하는 AbstractController 추상클래스를 추가해 중복을 제거하고, service() 메서드에서 GET과 POST HTTP 메서드에 따라 doGet(), doPost() 메서드를 호출하도록 한다. |
위 요구사항을 구현했을 때의 Controller 간의 관계를 클래스 다이어그램으로 그려보면 다음과 같다.
* 그림설명
클래스 다이어그램은 클래스 간의 관계를 쉽게 파악하기 위한 목적으로 사용하는 UML(Unified Modeling Language) 중의 하나이다. 클래스 다이어그램을 읽는 방법은 생각보다 쉽기 때문에 잘 모른다면 이번 기회에 익혀두면 좋다. 알아야 할 첫 번째는 인터페이스를 구현할 때(implements)와 상속(extends)의 경우 화살표 끝은 삼각형으로 같다. 다른 점은 인터페이스를 구현할 때는 점선으로 표시하고, 상속의 경우에는 실선으로 표시한다. 위 다이어그램을 보면 AbstractController 클래스는 Controller 인터페이스를 구현(implements)하고 있으며, CreateUserController는 AbstractController 를 상속(extends)하고 있다는 것을 알 수 있다.
두 번째는 클래스 간의 의존관계를 표시하는 부분이다. 클래스 간의 의존관계는 열린 화살표를 사용한다. 단, 클래스의 의존관계가 클래스의 필드를 통해 연결되는 경우 실선, 메서드의 로컬 변수로 연결되는 경우 점선을 사용한다. 의존관계의 클래스를 해당 클래스의 인스턴스를 직접 생성하는 경우 <<create>>가 표시된다. 앞의 클래스 다이어그램을 보면 RequestHandler가 HttpRequest와 HttpResponse를 직접 생성하면서 로컬 변수로 의존관계를 가진다는 것을 알 수 있다. 이와 같이 UML을 활용하면 소스코드를 직접 보지 않아도 클래스의 구조를 파악하는데 도움을 받을 수 있다.
리팩토링 요구사항, 힌트, 클래스 다이어그램을 참고해 직접 실습을 진행해보고 다음 절에서 구현된 코드와 비교해본다.
참고도서 : https://roadbook.co.kr/169
[신간안내] 자바 웹 프로그래밍 Next Step
● 저자: 박재성 ● 페이지: 480 ● 판형: 사륙배변형(172*225) ● 도수: 1도 ● 정가: 30,000원 ● 발행일: 2016년 9월 19일 ● ISBN: 978-89-97924-24-0 93000 [강컴] [교보] [반디] [알라딘] [예스24] [인터파크] [샘
roadbook.co.kr
'교재 실습 > 자바 웹 프로그래밍 Next Step' 카테고리의 다른 글
5.2.1 요청 데이터를 처리하는 로직을 별도의 클래스로 분리한다 (1) | 2025.03.19 |
---|---|
5.2 웹 서버 리팩토링 구현 및 설명 (8) | 2025.03.19 |
5.1.2.2 응답 데이터를 처리하는 로직을 별도의 클래스로 분리한다(HttpResponse) (4) | 2025.03.17 |
5.1.2.1 요청 데이터를 처리하는 로직을 별도의 클래스로 분리한다(HttpRequest) (3) | 2025.03.16 |
5.1.1 리팩토링 할 부분 찾기 (3) | 2025.03.15 |
댓글