본문 바로가기

전체 글434

6.4.1 요구사항 요구사항은 MVC 패턴을 지원하는 프레임워크를 구현하는 것이다. MVC 패턴을 지원하는 기본적인 구조는 5장의 HTTP 웹 서버 리팩토링 단계에서 다양한 분기문을 제거할 때 적용한 방법을 그대로 사용하면 된다. 단, 이와 같은 구조로 변경하려면 모든 요청을 RequestHandler 가 받아서 요청 URL에 따라 분기 처리 했듯이 서블릿도 모든 요청을 하나의 서블릿이 받은 후 요청 URL에 따라 분기 처리하는 방식으로 구현하면 된다.MVC 패턴은 기본적으로 사용자의 최초 진입 시점이 컨트롤러가 된다. 뷰에 직접 접근하는 것을 막고 항상 컨트롤러를 통해 접근하도록 해야 한다. 따라서 지금까지 회원가입(/user/form.jsp), 로그인(/user/login.jsp)과 같이 JSP로 직접 접근하지 않도록 .. 2025. 5. 14.
6.4 MVC 프레임워크 요구사항 1단계 대략 2000년대 초중반까지 대부분의 웹 애플리케이션 개발은 JSP에 대부분의 로직을 포함하고 있었다. 이는 자바 진영뿐만 아니라 PHP, ASP 또한 비슷한 형태로 구현했다. 점점 더 많은 애플리케이션이 웹으로 개발되고, 요구사항의 복잡도는 점점 더 증가했다. 또한 웹 애플리케이션의 수명이 길어지면서 유지보수 업무가 증가했다. JSP에 상당 부분의 로직을 포함하는 것이 초기 개발 속도는 빨랐지만 유지보수 비용은 증가했다. 이 같은 단점을 보완해 유지보수 비용을 줄이기 위해 MVC(Model, View, Controller) 패턴 기반으로 웹 애플리케이션을 개발하는 방향으로 발전했다. JSP에 집중되었던 로직을 모델(Model), 뷰(View), 컨트롤러(Controller) (컨트롤러는 Controll.. 2025. 5. 12.
6.3.4 클라이언트별 세션 저장소 추가 마지막으로 추가할 클래스는 각 클라이언트별 세션을 담당할 HttpSession 클래스로 서블릿에서 세션 데이터에 접근할 때 사용한 클래스다. HttpSession 은 다음과 같이 구현 가능하다. - HttpSession.javaimport java.util.HashMap;import java.util.Map;public class HttpSession { private Map values = new HashMap(); private String id; public HttpSession(String id) { this.id = id; } public String getId() { return id; } public void setAttribut.. 2025. 5. 8.
6.3.3 모든 클라이언트의 세션 데이터에 대한 저장소 추가 서버는 다수의 클라이언트 세션을 지원해야 한다. 따라서 모든 클라이언트의 세션을 관리할 수 있는 저장소가 필요하다. 이 저장소는 모든 세션을 매번 생성하는 것이 아니라 한 번 생성한 후 재사용할 수 있어야 한다. 따라서 다음과 같이 static 으로 Map 을 생성해 구현했다. - HttpSessions.javaimport java.util.HashMap;import java.util.Map;public class HttpSessions { private static Map sessions = new HashMap(); public static HttpSession getSession(String id) { HttpSession session = sessions.get(id); .. 2025. 5. 7.
6.3.2 쿠키를 활용해 아이디 전달 클라이언트가 처음 접근하는 경우 클라이언트가 사용할 세션 아이디를 생성한 후 쿠키를 통해 전달한다. 이렇게 세션 아이디를 한 번 전달하면 이후 요청부터는 상태 값을 공유하기 위해 이 세션 아이디를 사용하면 된다.RequestHandler 클래스에 세션 아이디가 존재하는지 여부를 판단한 후에 세션 아이디가 존재하지 않을 경우 세션 아이디를 새로 발급한다. 세션 아이디는 JSESSIONID로 전달한다. - RequestHandler.javapublic class RequestHandler extends Thread { ... public void run() { log.debug("New Client Connect! Connected IP : {}, Port : {}", connecti.. 2025. 5. 1.
6.3.1 고유한 아이디 생성 세션에서 사용할 고유한 아이디를 생성한다. 랜덤으로 임의의 값을 생성할 수 있지만 JDK에서 제공하는 UUID 클래스를 활용해 생성한다. UUID가 어떤 형태로 생성되는지 확인하기 위해 UUIDTest 클래스를 추가해 확인한다. - UUIDTest.javaimport java.util.UUIDimport org.junit.Test;public class UUIDTest { @Test public void uuid() { System.out.println(UUID.randomUUID()); }} 테스트를 실행하면 2580f09d-fca8-42ac-a318-dcbe8680730c와 같은 형태의 임의의 값이 생성된다.참고도서 : https://roadbook.co.kr/169 [신.. 2025. 4. 30.
6.2.2 요구사항 분리 및 힌트 · 클라이언트와 서버 간에 주고 받을 고유한 아이디를 생성해야 한다. 고유한 아이디는 쉽게 예측할 수 없어야 한다. 예측하기 쉬우면 쿠키 값을 조작해 다른 사용자처럼 속일 수 있다. - HINTJDK에서 제공하는 UUID(universally unique identifier : 고유한 값을 식별하기 위한 아이디 값으로, 32개의 16진수로 표현되며 총 36개 문자(32개 문자와 4개의 하이픈)로 된 8-4-4-4-12라는 5개의 그룹을 하이픈으로 구분한다) 클래스를 사용해 고유한 아이디를 생성할 수 있다.UUID uuid = UUID.randomUUID(); · 앞 단계에서 생성한 고유한 아이디를 쿠키를 통해 전달한다. - HINT쿠키는 Set-Cookie 헤더를 통해 전달되며 name1=value1.. 2025. 4. 28.
6.2.1 요구사항 실습은 5장에서 구현한 HTTP 웹 서버에서 시작할 수 있다. 만약 5장의 리팩토링을 완료하지 못했다면, https://github.com/slipp/web-application-server 저장소의 was-step3-controller-refactoring 브랜치에서 시작할 수 있다.요구사항은 서블릿에서 지원하는 HttpSession API의 일부를 지원해야 한다. HttpSession API 중 구현할 메서드는 getId(), setAttribute(String name, Object value), getAttribute(String name), removeAttribute(String name), invalidate() 5개 이다. HttpSession 의 가장 중요하고 핵심이 되는 메서드이다.각 .. 2025. 4. 25.
6.2 세션(HttpSession) 요구사항 및 실습 HTTP는 클라이언트와 서버가 연결된 후 상태를 유지할 수 없다. 따라서 HTTP를 무상태 프로토콜이라고 부른다. 하지만 웹 애플리케이션은 로그인과 같이 상태를 유지할 필요가 있는 요구사항이 발생한다. 이와 같이 상태를 유지할 필요가 있을 때 사용할 수 있는 방법이 쿠키(Cookie) 헤더를 사용하는 방법(쿠키 외에 요청을 보낼 때 인자를 통해 전달하는 방법도 있지만 추천할 만한 방법은 아니다. 단, 쿠키를 사용할 수 없는 경우에는 인자를 통해 매번 상태 값을 전달할 수밖에 없다.)이다.일단 "Set-Cookie" 헤더를 통해 쿠키를 생성하면 이후 발생하는 모든 요청에 "Set-Cookie"로 추가한 값을 "Cookie" 헤더로 전달하는 방식이다. 그런데 쿠키를 사용하는데 문제점이 하나 있다. 보안상 취.. 2025. 4. 24.