전체 글427 5.2.2 응답 데이터를 처리하는 로직을 별도의 클래스로 분리한다 요청 데이터를 처리하는 로직을 구현하고 리팩토링을 하였다. 대규모 리팩토링을 처음 진행했기 때문에 단계별로 상세히 살펴봤다. 다음 단계로 분리할, 응답 데이터를 처리하는 로직은 빠르게 진행한다. 리팩토링의 시작은 단계적으로 천천히 진행하지만 익숙해지면 단계를 건너뛰고 더 빠른 보폭으로 걸어도 좋다. 장애물을 만나면 다시 속도를 늦추면 된다.응답 데이터 처리를 담당하는 HttpResponse 클래스를 추가한다. 이 클래스의 역할은 응답 데이터의 상태에 따라 적절한 HTTP 헤더를 처리한다. 특히 HTML, CSS, 자바스크립트 파일을 읽어 변환하는 부분과 302 상태 코드를 처리하는 것이가능해야 하며, 쿠키 추가와 같이 HTTP 헤더에 임의의 값을 추가할 수 있어야 한다. 이 같은 요구사항을 만족하도록 구.. 2025. 4. 1. 5.2.1 요청 데이터를 처리하는 로직을 별도의 클래스로 분리한다 클라이언트 요청 데이터에서 요청 라인(request line)을 읽고, 헤더를 읽는 로직을 HttpRequest 클래스를 추가해 구현한다.HttpRequest 의 책임은 클라이언트 요청 데이터를 읽은 후 각 데이터를 사용하기 좋은 형태로 분리하는 역할만 한다. 이렇게 분리한 데이터를 사용하는 부분은 RequestHandler가 가지도록 한다. 즉 데이터를 파싱하는 작업과 사용하는 부분을 분리하는 것이다. 이 같은 원칙에 따라 구현한 HttpRequest 코드는 다음과 같다. - src/main/java/http/HttpRequest.javapackage http;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStr.. 2025. 3. 19. 5.2 웹 서버 리팩토링 구현 및 설명 4장에서 구현한 HTTP 웹 서버 코드의 핵심은 RequestHandler 클래스다. RequestHandler 클래스는 클라이언트 요청에 대한 헤더와 본문 데이터 처리, 클라이언트 요청에 따른 로직 처리(회원가입, 로그인 등), 로직 처리 완료 후 클라이언트에 대한 응답 헤더와 본문 데이터 처리 작업으로 나뉜다. 클래스 하나가 너무 많은 일을 하고 있다. 먼저 각 객체가 한 가지 책임을 가지도록 설계를 개선하는 리팩토링을 진행한다. RequestHandler 클래스가 가지고 있는 책임 중 클라이언트 요청 데이터와 응답 데이터 처리를 별도의 클래스로 분리한다.참고도서 : https://roadbook.co.kr/169 [신간안내] 자바 웹 프로그래밍 Next Step● 저자: 박재성 ● 페이지: 480 .. 2025. 3. 19. 5.1.2.3 다형성을 활용해 클라이언트 요청 URL에 대한 분기 처리를 제거한다 RequestHandler 클래스를 보면 기능이 추가될 때마다 분기문(if/else)이 하나씩 추가되는 방식으로 구현되어 있다. 기능이 많아질수록 분기문의 수는 증가한다. 자바의 다형성을 활용해 분기문을 제거한다. HINT· 각 요청과 응답에 대한 처리를 담당하는 부분을 추상화해 인터페이스로 만든다. 인터페이스는 다음과 같이 구현할 수 있다. public interface Controller { void service(HttpRequest request, HttpResponse response); } · 각 분기문을 Controller 인터페이스를 구현하는(implements) 클래스를 만들어 분리한다. · 이렇게 생성한 Controller 구현체를 Map에 저장한다. Map의 key에 해당하는 .. 2025. 3. 18. 5.1.2.2 응답 데이터를 처리하는 로직을 별도의 클래스로 분리한다(HttpResponse) HINT· RequestHandler 클래스를 보면 응답 데이터 처리를 위한 많은 중복이 있다. 이 중복을 제거해 본다. · 응답 헤더 정보를 Map으로 관리한다. · 응답을 보낼 때 HTML, CSS, 자바스크립트 파일을 직접 읽어 응답으로 보내는 메서드는 forward(), 다른 URL로 리다이렉트하는 메서드는 sendRedirect() 메서드를 나누어 구현한다. 요청 데이터에 대한 처리를 담당하고 있는 HttpResponse가 정상적으로 동작하는지 다음과 같은 테스트 코드를 통해 확인할 수 있다. - src/test/java/http/HttpResponseTest.javapackage http;import java.io.File;import java.io.FileNotFoundException;im.. 2025. 3. 17. 5.1.2.1 요청 데이터를 처리하는 로직을 별도의 클래스로 분리한다(HttpRequest) HINT· 클라이언트 요청 데이터를 담고 있는 InputStream을 생성자로 받아 HTTP 메서드, URL, 헤더, 본문을 분리하는 작업을 한다. · 헤더는 Map에 저장해 관리하고 getHeader("필드 이름") 메서드를 통해 접근 가능하도록 구현한다. · GET과 POST 메서드에 따라 전달되는 인자를 Map에 저장해 관리하고 getParameter("인자 이름") 메서드를 통해 접근 가능하도록 구현한다. 위 요구사항을 구현하기 위해 새로운 클래스를 만들어 구현할 때 테스트 코드를 기반으로 개발할 수 있다. 먼저 src/test/resources 디렉토리에 Http_GET.txt라는 이름으로 요청 데이터를 담고 있는 테스트 파일을 추가한다. - src/test/resources/Http_GET.t.. 2025. 3. 16. 5.1.1 리팩토링 할 부분 찾기 리팩토링을 하려면 먼저 나쁜 냄새(영어로 Bad Smell이라고 한다. 이 표현은 "리팩토링 : 코드 품질을 개선하는 객체지향 사고법"(마틴 파울러 저/김지원 역, 한빛미디어, 2012년) 번역서를 따라 나쁜 냄새라는 표현을 사용했다)가 나는 코드를 찾을 수 있는 능력을 키워야 한다. 리팩토링을 하는 데 있어 리팩토링을 어떻게 하느냐는 능력보다 리팩토링이 필요한 시점과 종료해야 하는 시점을 판단해야 하는 능력이 중요하다. 일단 소스코드에서 나쁜 냄새가 나면 다음 단계는 어떻게 리팩토링할 것인지 방법을 찾으면 된다. 하지만 나쁜 냄새가 진동하는 코드를 찾지 못하면 리팩토링할 필요성조차 느끼지 못해 아무런 시도도 하지 않는다. "리팩토링 : 코드 품질을 개선하는 객체지향 사고법"(마틴 파울러 저/김지원 역,.. 2025. 3. 15. 5장 웹 서버 리팩토링, 서블릿 컨테이너와 서블릿의 관계 웹 서버를 구현하면서 리팩토링을 거의 하지 않았다. 리팩토링을 하지 않은 결과 https://github.com/slipp/web-application-server 저장소의 was-step1-bad-version 브랜치에 있는 RequestHandler 클래스와 같은 코드를 구현하게 되었다. 자신이 구현한 소스 코드와 비교했을 때 더 깔끔하고 읽기 좋은 코드를 구현했길 기대한다.실무에서 진행하는 대부분의 프로젝트는 이와 같이 무작정 개발을 시작하지 않는다. 프로젝트 성격과 규모에 따라 다르지만 메서드 수준까지 철저한 설계를 한 후 개발을 시작하는 경우도 있으며, 대략적인 클래스 설계를 한 후 진행하는 경우도 있다. 하지만 대부분의 프로젝트는 프로젝트 요구사항이 명확하지 않고, 프로젝트를 진행하면서 요구사.. 2025. 3. 14. 4.3.2 네트워크 HTTP 다음 단계로 학습할 내용은 클라이언트와 서버 간에 데이터를 주고 받는 과정에 대해서이다. 클라이언트에서 보낸 데이터가 어떻게 서버까지 전달되며, 서버에서 전달된 데이터가 어떤 과정으로 클라이언트까지 전달되는지 알아야 한다. 이는 네트워크에 대해 학습함으로써 알 수 있다.클라이언트에서 요청한 데이터가 서버까지, 서버에서 응답한 데이터가 클라이언트까지 어떤 여행 과정을 거치는지에 대해 학습하고 싶다면 "성공과 실패를 결정하는 1%의 네트워크 원리"(Tsutomu Tone 저/이도희 역/ 이중호 감역, 성안당/2015) 책을 추천한다. 이 책은 기존의 다른 네트워크 책들과 달리 전체 과정을 쉽게 풀어 설명하고 있어 초보자가 읽기에 적합한 네트워크 책이다. 웹 개발자가 이 책의 모든 내용을 상세하게 이.. 2025. 3. 13. 이전 1 2 3 4 5 6 ··· 48 다음