본문 바로가기

교재 실습253

4장 HTTP 웹 서버 구현을 통해 HTTP 이해하기 웹 애플리케이션 개발자가 반드시 학습해야 할 주제 중의 하나가 HTTP에 대한 이해이다. 하지만 현장에서 애플리케이션 개발에 집중하다 보면 HTTP에 대해 학습할 기회가 많지 않다. 또한 대부분의 경우 책을 통해 HTTP에 대해 학습하는 것이 일반적인데, HTTP가 프로토콜 스펙에 대한 내용인지라 재미가 없는 것 또한 사실이다. 이 같은 단점을 보완하기 위해 HTTP 웹 서버를 직접 구현하면서 웹 클라이언트와 서버가 주고 받는 HTTP에 대해 학습해 봤으면 하는 바람으로 실습을 설계했다.이 장에서는 3장에서 요구사항으로 제시한 내용을 직접 구현하면서 HTTP 프로토콜에 대해 이해하는 시간을 가져보도록 하겠다.HTTP 웹 서버 구현은 동영상을 통해 요구사항을 직접 구현하는 과정과 책을 통해 요구사항을 구현.. 2025. 2. 8.
3.5.3 디버깅을 위한 로깅(logging) 자바를 처음 학습할 때 콘솔에 값을 출력하기 위한 용도로 사용하는 API가 System.out.pringln()이다. 아마도 대부분의 개발자가 자바를 처음 시작할 때 "Hello World" 메시지를 출력하면서 자바 학습을 시작하기 때문에 처음 접하는 API일 것이다. 그만큼 자바 개발자에게 친숙한 API이다.개발자는 애플리케이션이 정상적으로 동작하는지 확인하기 위한 목적, 애플리케이션에 문제가 발생했을 때 원인을 파악하기 위한 디버깅을 목적으로 수많은 메시지를 출력한다. 메시지를 출력하기 위한 목적으로 System.out.println()을 사용하는 방법은 애플리케이션 성능을 저하시키는 원인이 된다. 웹 애플리케이션을 개발할 때 System.out.println()으로 디버깅 메시지를 출력하면 파일로 .. 2025. 2. 6.
3.5.2 빌드 도구 메이븐 자바 웹 애플리케이션을 개발하기 위한 프로젝트를 생성하면 먼저 프로덕션 소스코드 디렉토리, 테스트 소스코드 디렉토리, 웹 자원을 관리할 디렉토리, 프로젝트에서 사용할 외부 라이브러리를 클래스패스에 추가 등의 작업을 진행해야 한다.빌드 도구는 프로젝트와 관련한 설정을 관리하면서 소스코드(프로덕션, 테스트 코드)에 대한 컴파일, 컴파일을 위해 필요한 라이브러리 관리, 테스트, 배포를 위한 패키징 작업 등의 작업을 자동화할 수 있도록 지원하는 도구이다. 프로젝트 디렉토리 구조와 의존성 라이브러리를 관리하고 있기 때문에 프로젝트를 이클립스 또는 인텔리제이와 같은 통합 개발 도구 프로젝트로 변환하는 것도 가능하다. 이처럼 빌드 도구를 활용하면 웹 애플리케이션 개발에서 발생하는 단순, 반복적인 작업을 자동화할 수 .. 2025. 2. 4.
3.5.1 Git과 GitHub 옛날에는 버전관리 시스템(Version Control System, 이하 VCS) 중 하나인 Visual Source Safe(이하 VSS, Microsoft에서 만들어 제공하는 버전 관리 시스템)을 사용했는데, FTP 서버를 활용할 때 발생했던 소스코드를 덮어쓰는 문제들이 발생하지 않았고 다른 개발자가 개발한 소스코드를 쉽게 통합하는 것이 가능했던 장점이 있었다.Git은 최근에 많이 사용하는 VCS에 대한 기본 기능을 제공하는 도구이다. GitHub(https://github.com/)은 Git이 제공하는 기능과 더불어 개발자들이 유용하게 사용할 수 있는 추가적인 기능을 제공하는 웹 애플리케이션이다.GitHub를 통해 많은 오픈소스가 제공되고 있기 때문에 다른 개발자가 구현한 코드를 통해 학습하는데 많.. 2025. 2. 3.
3.4.3.7 요구사항 7 - CSS 지원하기 지금까지 구현한 소스코드는 CSS 파일을 지원하지 못하고 있다. CSS 파일을 지원하도록 구현한다. (예시) HTTP HeaderGET ./css/style.css HTTP/1.1 Host: localhost:8080 Accept: text/css,*/*;q=0.1 Connection: keep-aliveHINT· 응답 헤더의 Content-Type을 text/html로 보내면 브라우저는 HTML 파일로 인식하기 때문에 CSS가 정상적으로 동작하지 않는다. · CSS인 경우 응답 헤더의 Content-Type을 text/css로 전송한다. Content-Type은 확장자를 통해 구분할 수도 있으며, 요청 헤더의 Accept를 활용할 수도 있다. 요구사항 7번까지 완료하는데 몇 시간이 소요되었는가? 4장에.. 2025. 2. 2.
3.4.3.6 요구사항 6 - 사용자 목록 출력 접근하고 있는 사용자가 "로그인" 상태일 경우(Cookie 값이 logined=true) http://localhost:8080/user/list 로 접근했을 때 사용자 목록을 출력한다. 만약 로그인하지 않은 상태라면 로그인 페이지(login.html)로 이동한다. HINT· 로그인 여부를 판단하기 위해 Cookie 값을 파싱하는 작업은 util.HttpRequestUtils 클래스의 parseCookies() 메서드를 활용한다. · String 값을 Boolean으로 변환하는 메서드는 Boolean.parseBoolean()으로 할 수 있다. · 자바 클래스 중 StringBuilder를 활용해 사용자 목록을 출력하는 HTML을 동적으로 생성한 후 응답으로 보낸다. · 구글에서 "java stringb.. 2025. 2. 2.
3.4.3.5 요구사항 5 - 로그인하기 "로그인" 메뉴를 클릭하면 http://localhost:8080/user/login.html 으로 이동해 로그인 할 수 있다. 로그인이 성공하면 /index.html로 이동하고, 실패하면 /user/login_failed.html로 이동해야 한다.앞에서 회원가입한 사용자로 로그인할 수 있어야 한다. 로그인이 성공하면 쿠키를 활용해 로그인 상태를 유지할 수 있어야 한다. 로그인이 성공할 경우 요청 헤더의 Cookie 헤더 값이 logined=true, 실패하면 logined=false로 전달되어야 한다. HINT 1단계· 로그인 성공시 HTTP 응답 헤더(response header)에 Set-Cookie를 추가해 로그인 성공 여부를 전달한다. · 응답 헤더의 예시HTTP/1.1 200 OK Conten.. 2025. 2. 2.
3.4.3.4 요구사항 4 - 302 status code 적용 "회원가입"을 완료하면 /index.html 페이지로 이동하고 싶다. 현재는 URL이 /user/create 로 유지되는 상태이기 때문에 응답으로 전달할 파일이 없다. 따라서 회원가입을 완료한 후 /index.html 페이지로 이동한다. 브라우저의 URL도 /user/create가 아니라 /index.html로 변경해야 한다. HINT· HTTP 응답 헤더의 status code를 200이 아니라 302 code를 사용한다. · http://en.wikipedia.org/wiki/HTTP_302 문서 참고참고도서 : https://roadbook.co.kr/169 [신간안내] 자바 웹 프로그래밍 Next Step● 저자: 박재성 ● 페이지: 480 ● 판형: 사륙배변형(172*225) ● 도수: 1도 ●.. 2025. 2. 1.
3.4.3.3 요구사항 3 - POST 방식으로 회원가입하기 http://localhost:8080/user/form.html 파일의 form 태그 method를 get에서 post로 수정한 후 회원가입이 정상적으로 동작하도록 구현한다. (예시) HTTP Header와 BodyPOST /user/create HTTP/1.1 Host: localhost:8080 Connection: keep-alive Content-Length: 59 Content-Type: application/x-www-form-urlencoded Accept: */* userId=javajigi&password=password&name=JaeSungHINT· POST로 데이터를 전달할 경우 전달하는 데이터는 HTTP 본문문에 담긴다. · HTTP 본문은 HTTP 헤더 이후 빈 공백을 가지는 .. 2025. 2. 1.