SlideShare ist ein Scribd-Unternehmen logo
1 von 17
HTTP 이해
개발 환경 설정 – git clone 및 maven 빌드
• https://github.com/parkjaesung/web-application-server 프로젝트를 자신의 계정으로
Fork한다. Github 우측 상단의 Fork 버튼을 클릭하면 자신의 계정으로 Fork된다.
• Fork한 프로젝트를 eclipse 또는 터미널에서 clone 한다.
• Fork한 프로젝트를 eclipse로 import한 후에 Maven 빌드 도구를 활용해 eclipse 프로젝트
로 변환한다.(mvn eclipse:clean eclipse:eclipse)
• 빌드가 성공하면 반드시 refresh(fn + f5)를 실행해야 한다.
웹 서버 시작 및 테스트
• webserver.WebServer 는 사용자의 요청을 받아 RequestHandler 에 작업을 위임하는 클래
스이다.
• 사용자 요청에 대한 모든 처리는 RequestHandler 클래스의 run() 메서드가 담당한다.
• WebServer를 실행한 후 브라우저에서 http://localhost:8080으로 접속해 “Hello World” 메
시지가 출력되는지 확인한다.
요구사항
http://localhost:8080/index.html 로 접속했을 때 webapp 디렉토리의
index.html 파일을 읽어 클라이언트에 응답한다.
http header 예
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
힌트
• InputStream => InputStreamReader => BufferedReader
• 구글에서 “java inputstream bufferedreader “로 검색 후 문제 해결
• BufferedReader.readLine() 메소드 활용해 라인별로 http header 읽는다.
• http header 전체를 출력한다.
• header 마지막은 while (!"".equals(line)) {} 로 확인 가능하다.
http header 예
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
힌트
• Header의 첫 번째 라인에서 요청 URL(위 예의 경우 /index.html 이다.)을 추출한다.
• String[] tokens = line.split(" "); 활용해 문자열을 분리할 수 있다.
• 구현은 별도의 유틸 클래스를 만들고 단위 테스트를 만들어 진행하면 편하다.
http header 예
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
힌트
• 요청 URL에 해당하는 파일을 webapp 디렉토리에서 읽어 전달하면 된다.
• 구글에서 “java files readallbytes”로 검색해 파일 데이터를 byte[]로 읽는다.
byte[] body = Files.readAllBytes(new File("./webapp" + url).toPath());
요구사항
“회원가입” 메뉴를 클릭하면 http://localhost:8080/form.html 으로
이동하면서 회원가입할 수 있다. 회원가입한다.
회원가입을 하면 다음과 같은 형태로 사용자가 입력한 값이 서버에
전달된다.
/create?userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net
HTML과 URL을 비교해 보고 사용자가 입력한 값을 파싱해 model.User
클래스에 저장한다.
힌트
• Header의 첫 번째 라인에서 요청 URL을 추출한다.
• 요청 URL에서 접근 경로와 이름/값을 추출해 User 클래스에 담는다.
• 구현은 가능하면 junit을 활용해 단위 테스트를 진행하면서 하면 좀 더 효과적으로 개발 가능하다.
• 이름/값 파싱은 util.HttpRequestUtils 클래스의 parseQueryString() 메서드를 활용한다.
http header 예
GET /create?userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net HTTP/1.1
String url = "/?data=234";
int index = url.indexOf("?");
String requestPath = url.substring(0, index);
String params = url.substring(index+1);
요구사항
http://localhost:8080/form.html 파일의 form 태그 method를 get에서
post로 수정한 후 회원가입 기능이 정상적으로 동작하도록 구현한다.
힌트
• POST method로 데이터를 전달할 경우 전달하는 데이터는 HTTP Body에 담긴다.
• HTTP Body는 HTTP header 이후 빈 공백을 가지는 한 줄(line) 다음부터 시작한다.
• HTTP Body에 전달되는 데이터는 GET method의 이름/값과 같다.
• BufferedReader에서 본문 데이터는 util.IOUtils 클래스의 readData() 메서드를 활용한다. 본문의
길이는 http header의 Content-Length의 값이다.
http header와 body 예
POST /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=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net
요구사항
“회원가입”을 완료하면 /index.html 페이지로 이동하고 싶다. 현재는
URL이 /create 로 유지되는 상태로 읽어서 전달할 파일이 없다. 따라서
서블릿의 redirect 방식처럼 회원가입을 완료한 후 “index.html”로
이동해야 한다. 즉, 브라우저의 URL이 /index.html로 변경해야 한다.
힌트
• HTTP 응답 헤더의 status code를 200이 아니라 302 code를 사용한다.
• http://en.wikipedia.org/wiki/HTTP_302 문서 참고
요구사항
“로그인” 메뉴를 클릭하면 http://localhost:8080/login.html 으로
이동해 로그인할 수 있다.
앞에서 회원가입한 사용자로 로그인할 수 있어야 한다. 로그인이
성공하면 cookie를 활용해 로그인 상태를 유지할 수 있어야 한다.
힌트
• HTTP 응답 헤더(response header)에 Set-Cookie 를 추가해 로그인 성공 여부를 전달한다.
http response header 예
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: logined=true
• HTTP 요청 헤더의 Cookie 헤더 값을 활용해 응답 헤더로 전달한 값을 추출한다.
http request header 예
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
Cookie: logined=true
요구사항
지금까지 구현한 소스 코드는 stylesheet 파일을 지원하지 못하고 있다.
Stylesheet 파일을 지원하도록 구현하도록 한다.
http header 예
GET ./stylesheets/bootstrap.css HTTP/1.1
Host: localhost:8080
Accept: text/css,*/*;q=0.1
Connection: keep-alive
힌트
• 응답 헤더의 Content-Type을 text/html로 보내면 브라우저는 html 파일로
인식하기 때문에 css가 정상적으로 동작하지 않는다.
• Stylesheet인 경우 응답 헤더의 Content-Type을 text/css로 전송한다.
Content-Type은 확장자를 통해 구분할 수도 있으며, 요청 헤더의 Accept를
활용할 수도 있다.

Weitere ähnliche Inhalte

Was ist angesagt?

Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented ProgrammingScott Wlaschin
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Kyoung Up Jung
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Younghan Kim
 
Basics of Java Concurrency
Basics of Java ConcurrencyBasics of Java Concurrency
Basics of Java Concurrencykshanth2101
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introductionRasheed Waraich
 
Build RESTful API Using Express JS
Build RESTful API Using Express JSBuild RESTful API Using Express JS
Build RESTful API Using Express JSCakra Danu Sedayu
 
Avoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAvoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAnkit Agarwal
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.jsRob O'Doherty
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)beom kyun choi
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & StreamsEyal Vardi
 

Was ist angesagt? (20)

Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented Programming
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
Express node js
Express node jsExpress node js
Express node js
 
Laravel Introduction
Laravel IntroductionLaravel Introduction
Laravel Introduction
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조
 
PHP Basic & Variables
PHP Basic & VariablesPHP Basic & Variables
PHP Basic & Variables
 
Basics of Java Concurrency
Basics of Java ConcurrencyBasics of Java Concurrency
Basics of Java Concurrency
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introduction
 
Build RESTful API Using Express JS
Build RESTful API Using Express JSBuild RESTful API Using Express JS
Build RESTful API Using Express JS
 
Java script
Java scriptJava script
Java script
 
Avoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAvoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promises
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Express JS
Express JSExpress JS
Express JS
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & Streams
 
Java Applet and Graphics
Java Applet and GraphicsJava Applet and Graphics
Java Applet and Graphics
 

Andere mochten auch

소프트웨어 학습 및 자바 웹 개발자 학습 로드맵
소프트웨어 학습 및 자바 웹 개발자 학습 로드맵소프트웨어 학습 및 자바 웹 개발자 학습 로드맵
소프트웨어 학습 및 자바 웹 개발자 학습 로드맵Javajigi Jaesung
 
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담Javajigi Jaesung
 
어느 40대 아저씨 이야기
어느 40대 아저씨 이야기어느 40대 아저씨 이야기
어느 40대 아저씨 이야기Javajigi Jaesung
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음nexusz99
 
패캠 네트워킹 데이 - 침묵으로 가르치기
패캠 네트워킹 데이 - 침묵으로 가르치기패캠 네트워킹 데이 - 침묵으로 가르치기
패캠 네트워킹 데이 - 침묵으로 가르치기Javajigi Jaesung
 
커뮤니티 활동과 스터디
커뮤니티 활동과 스터디커뮤니티 활동과 스터디
커뮤니티 활동과 스터디Javajigi Jaesung
 
서버 개발자가 되기 전에 알았으면 좋았을 것들
서버 개발자가 되기 전에 알았으면 좋았을 것들서버 개발자가 되기 전에 알았으면 좋았을 것들
서버 개발자가 되기 전에 알았으면 좋았을 것들raccoony
 
Web And App Servers
Web And App ServersWeb And App Servers
Web And App ServersAkshay Gupta
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다Dae Kim
 
[오픈소스컨설팅]JBoss 5 Detail
[오픈소스컨설팅]JBoss 5 Detail[오픈소스컨설팅]JBoss 5 Detail
[오픈소스컨설팅]JBoss 5 DetailJi-Woong Choi
 
[오픈소스컨설팅]J boss6 7_교육자료
[오픈소스컨설팅]J boss6 7_교육자료[오픈소스컨설팅]J boss6 7_교육자료
[오픈소스컨설팅]J boss6 7_교육자료Ji-Woong Choi
 
jBPM 4 BeJUG Event March 20 2009
jBPM 4 BeJUG Event March 20 2009jBPM 4 BeJUG Event March 20 2009
jBPM 4 BeJUG Event March 20 2009Tom Baeyens
 
How BPM Connects The Internet of Enterprise Things Using Effektif
How BPM Connects The Internet of Enterprise Things Using EffektifHow BPM Connects The Internet of Enterprise Things Using Effektif
How BPM Connects The Internet of Enterprise Things Using EffektifTom Baeyens
 
IT 인프라의 새로운 대안 Amazon Web Service
IT 인프라의 새로운 대안 Amazon Web ServiceIT 인프라의 새로운 대안 Amazon Web Service
IT 인프라의 새로운 대안 Amazon Web ServiceGun-su Jang
 
web study 1day
web study 1dayweb study 1day
web study 1day준호 우
 
Build and Deployment Initiative - Performance Analysis Summary
Build and Deployment Initiative - Performance Analysis SummaryBuild and Deployment Initiative - Performance Analysis Summary
Build and Deployment Initiative - Performance Analysis Summarycole13ben
 
Digital Transformation: Future Implimentation
Digital Transformation: Future ImplimentationDigital Transformation: Future Implimentation
Digital Transformation: Future ImplimentationMuller Gracio Manalu
 

Andere mochten auch (20)

소프트웨어 학습 및 자바 웹 개발자 학습 로드맵
소프트웨어 학습 및 자바 웹 개발자 학습 로드맵소프트웨어 학습 및 자바 웹 개발자 학습 로드맵
소프트웨어 학습 및 자바 웹 개발자 학습 로드맵
 
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
 
어느 40대 아저씨 이야기
어느 40대 아저씨 이야기어느 40대 아저씨 이야기
어느 40대 아저씨 이야기
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음
 
패캠 네트워킹 데이 - 침묵으로 가르치기
패캠 네트워킹 데이 - 침묵으로 가르치기패캠 네트워킹 데이 - 침묵으로 가르치기
패캠 네트워킹 데이 - 침묵으로 가르치기
 
커뮤니티 활동과 스터디
커뮤니티 활동과 스터디커뮤니티 활동과 스터디
커뮤니티 활동과 스터디
 
서버 개발자가 되기 전에 알았으면 좋았을 것들
서버 개발자가 되기 전에 알았으면 좋았을 것들서버 개발자가 되기 전에 알았으면 좋았을 것들
서버 개발자가 되기 전에 알았으면 좋았을 것들
 
Web And App Servers
Web And App ServersWeb And App Servers
Web And App Servers
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
 
[오픈소스컨설팅]JBoss 5 Detail
[오픈소스컨설팅]JBoss 5 Detail[오픈소스컨설팅]JBoss 5 Detail
[오픈소스컨설팅]JBoss 5 Detail
 
[오픈소스컨설팅]J boss6 7_교육자료
[오픈소스컨설팅]J boss6 7_교육자료[오픈소스컨설팅]J boss6 7_교육자료
[오픈소스컨설팅]J boss6 7_교육자료
 
jBPM 4 BeJUG Event March 20 2009
jBPM 4 BeJUG Event March 20 2009jBPM 4 BeJUG Event March 20 2009
jBPM 4 BeJUG Event March 20 2009
 
How BPM Connects The Internet of Enterprise Things Using Effektif
How BPM Connects The Internet of Enterprise Things Using EffektifHow BPM Connects The Internet of Enterprise Things Using Effektif
How BPM Connects The Internet of Enterprise Things Using Effektif
 
IT 인프라의 새로운 대안 Amazon Web Service
IT 인프라의 새로운 대안 Amazon Web ServiceIT 인프라의 새로운 대안 Amazon Web Service
IT 인프라의 새로운 대안 Amazon Web Service
 
web study 1day
web study 1dayweb study 1day
web study 1day
 
Web to sns
Web to snsWeb to sns
Web to sns
 
200701251925300.diapo.ejecentralizador
200701251925300.diapo.ejecentralizador200701251925300.diapo.ejecentralizador
200701251925300.diapo.ejecentralizador
 
Build and Deployment Initiative - Performance Analysis Summary
Build and Deployment Initiative - Performance Analysis SummaryBuild and Deployment Initiative - Performance Analysis Summary
Build and Deployment Initiative - Performance Analysis Summary
 
Digital Transformation: Future Implimentation
Digital Transformation: Future ImplimentationDigital Transformation: Future Implimentation
Digital Transformation: Future Implimentation
 

Ähnlich wie HTTP web server 구현

막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVCAnselmKim
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기Park JoongSoo
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http RequestNAVER D2
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Wangeun Lee
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Sungjoon Yoon
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료수홍 이
 
ASP.NET Web API를 활용한 RESTful 서비스 개발
ASP.NET Web API를 활용한 RESTful 서비스 개발ASP.NET Web API를 활용한 RESTful 서비스 개발
ASP.NET Web API를 활용한 RESTful 서비스 개발SangHoon Han
 

Ähnlich wie HTTP web server 구현 (20)

막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
Springmvc
SpringmvcSpringmvc
Springmvc
 
4-2. ajax
4-2. ajax4-2. ajax
4-2. ajax
 
Servlet3
Servlet3Servlet3
Servlet3
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
 
Html5
Html5 Html5
Html5
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
Spring boot actuator
Spring boot   actuatorSpring boot   actuator
Spring boot actuator
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
7. html5 api
7. html5 api7. html5 api
7. html5 api
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료
 
스프링 3.0 & RESTful
스프링 3.0 & RESTful스프링 3.0 & RESTful
스프링 3.0 & RESTful
 
ASP.NET Web API를 활용한 RESTful 서비스 개발
ASP.NET Web API를 활용한 RESTful 서비스 개발ASP.NET Web API를 활용한 RESTful 서비스 개발
ASP.NET Web API를 활용한 RESTful 서비스 개발
 

Mehr von Javajigi Jaesung

나는 왜 TDD에 집착하는가?
나는 왜 TDD에 집착하는가?나는 왜 TDD에 집착하는가?
나는 왜 TDD에 집착하는가?Javajigi Jaesung
 
2014년에 만든 나만의 이력서
2014년에 만든 나만의 이력서2014년에 만든 나만의 이력서
2014년에 만든 나만의 이력서Javajigi Jaesung
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJavajigi Jaesung
 
어떻게 배움을 만들어 갈 것인가
어떻게 배움을 만들어 갈 것인가어떻게 배움을 만들어 갈 것인가
어떻게 배움을 만들어 갈 것인가Javajigi Jaesung
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정Javajigi Jaesung
 

Mehr von Javajigi Jaesung (6)

나는 왜 TDD에 집착하는가?
나는 왜 TDD에 집착하는가?나는 왜 TDD에 집착하는가?
나는 왜 TDD에 집착하는가?
 
2014년에 만든 나만의 이력서
2014년에 만든 나만의 이력서2014년에 만든 나만의 이력서
2014년에 만든 나만의 이력서
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
어떻게 배움을 만들어 갈 것인가
어떻게 배움을 만들어 갈 것인가어떻게 배움을 만들어 갈 것인가
어떻게 배움을 만들어 갈 것인가
 
나, 우리, 스터디
나, 우리, 스터디나, 우리, 스터디
나, 우리, 스터디
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정
 

HTTP web server 구현

  • 2. 개발 환경 설정 – git clone 및 maven 빌드 • https://github.com/parkjaesung/web-application-server 프로젝트를 자신의 계정으로 Fork한다. Github 우측 상단의 Fork 버튼을 클릭하면 자신의 계정으로 Fork된다. • Fork한 프로젝트를 eclipse 또는 터미널에서 clone 한다. • Fork한 프로젝트를 eclipse로 import한 후에 Maven 빌드 도구를 활용해 eclipse 프로젝트 로 변환한다.(mvn eclipse:clean eclipse:eclipse) • 빌드가 성공하면 반드시 refresh(fn + f5)를 실행해야 한다.
  • 3. 웹 서버 시작 및 테스트 • webserver.WebServer 는 사용자의 요청을 받아 RequestHandler 에 작업을 위임하는 클래 스이다. • 사용자 요청에 대한 모든 처리는 RequestHandler 클래스의 run() 메서드가 담당한다. • WebServer를 실행한 후 브라우저에서 http://localhost:8080으로 접속해 “Hello World” 메 시지가 출력되는지 확인한다.
  • 4. 요구사항 http://localhost:8080/index.html 로 접속했을 때 webapp 디렉토리의 index.html 파일을 읽어 클라이언트에 응답한다.
  • 5. http header 예 GET /index.html HTTP/1.1 Host: localhost:8080 Connection: keep-alive Accept: */* 힌트 • InputStream => InputStreamReader => BufferedReader • 구글에서 “java inputstream bufferedreader “로 검색 후 문제 해결 • BufferedReader.readLine() 메소드 활용해 라인별로 http header 읽는다. • http header 전체를 출력한다. • header 마지막은 while (!"".equals(line)) {} 로 확인 가능하다.
  • 6. http header 예 GET /index.html HTTP/1.1 Host: localhost:8080 Connection: keep-alive Accept: */* 힌트 • Header의 첫 번째 라인에서 요청 URL(위 예의 경우 /index.html 이다.)을 추출한다. • String[] tokens = line.split(" "); 활용해 문자열을 분리할 수 있다. • 구현은 별도의 유틸 클래스를 만들고 단위 테스트를 만들어 진행하면 편하다.
  • 7. http header 예 GET /index.html HTTP/1.1 Host: localhost:8080 Connection: keep-alive Accept: */* 힌트 • 요청 URL에 해당하는 파일을 webapp 디렉토리에서 읽어 전달하면 된다. • 구글에서 “java files readallbytes”로 검색해 파일 데이터를 byte[]로 읽는다. byte[] body = Files.readAllBytes(new File("./webapp" + url).toPath());
  • 8. 요구사항 “회원가입” 메뉴를 클릭하면 http://localhost:8080/form.html 으로 이동하면서 회원가입할 수 있다. 회원가입한다. 회원가입을 하면 다음과 같은 형태로 사용자가 입력한 값이 서버에 전달된다. /create?userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net HTML과 URL을 비교해 보고 사용자가 입력한 값을 파싱해 model.User 클래스에 저장한다.
  • 9. 힌트 • Header의 첫 번째 라인에서 요청 URL을 추출한다. • 요청 URL에서 접근 경로와 이름/값을 추출해 User 클래스에 담는다. • 구현은 가능하면 junit을 활용해 단위 테스트를 진행하면서 하면 좀 더 효과적으로 개발 가능하다. • 이름/값 파싱은 util.HttpRequestUtils 클래스의 parseQueryString() 메서드를 활용한다. http header 예 GET /create?userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net HTTP/1.1 String url = "/?data=234"; int index = url.indexOf("?"); String requestPath = url.substring(0, index); String params = url.substring(index+1);
  • 10. 요구사항 http://localhost:8080/form.html 파일의 form 태그 method를 get에서 post로 수정한 후 회원가입 기능이 정상적으로 동작하도록 구현한다.
  • 11. 힌트 • POST method로 데이터를 전달할 경우 전달하는 데이터는 HTTP Body에 담긴다. • HTTP Body는 HTTP header 이후 빈 공백을 가지는 한 줄(line) 다음부터 시작한다. • HTTP Body에 전달되는 데이터는 GET method의 이름/값과 같다. • BufferedReader에서 본문 데이터는 util.IOUtils 클래스의 readData() 메서드를 활용한다. 본문의 길이는 http header의 Content-Length의 값이다. http header와 body 예 POST /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=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net
  • 12. 요구사항 “회원가입”을 완료하면 /index.html 페이지로 이동하고 싶다. 현재는 URL이 /create 로 유지되는 상태로 읽어서 전달할 파일이 없다. 따라서 서블릿의 redirect 방식처럼 회원가입을 완료한 후 “index.html”로 이동해야 한다. 즉, 브라우저의 URL이 /index.html로 변경해야 한다.
  • 13. 힌트 • HTTP 응답 헤더의 status code를 200이 아니라 302 code를 사용한다. • http://en.wikipedia.org/wiki/HTTP_302 문서 참고
  • 14. 요구사항 “로그인” 메뉴를 클릭하면 http://localhost:8080/login.html 으로 이동해 로그인할 수 있다. 앞에서 회원가입한 사용자로 로그인할 수 있어야 한다. 로그인이 성공하면 cookie를 활용해 로그인 상태를 유지할 수 있어야 한다.
  • 15. 힌트 • HTTP 응답 헤더(response header)에 Set-Cookie 를 추가해 로그인 성공 여부를 전달한다. http response header 예 HTTP/1.1 200 OK Content-Type: text/html Set-Cookie: logined=true • HTTP 요청 헤더의 Cookie 헤더 값을 활용해 응답 헤더로 전달한 값을 추출한다. http request header 예 GET /index.html HTTP/1.1 Host: localhost:8080 Connection: keep-alive Accept: */* Cookie: logined=true
  • 16. 요구사항 지금까지 구현한 소스 코드는 stylesheet 파일을 지원하지 못하고 있다. Stylesheet 파일을 지원하도록 구현하도록 한다.
  • 17. http header 예 GET ./stylesheets/bootstrap.css HTTP/1.1 Host: localhost:8080 Accept: text/css,*/*;q=0.1 Connection: keep-alive 힌트 • 응답 헤더의 Content-Type을 text/html로 보내면 브라우저는 html 파일로 인식하기 때문에 css가 정상적으로 동작하지 않는다. • Stylesheet인 경우 응답 헤더의 Content-Type을 text/css로 전송한다. Content-Type은 확장자를 통해 구분할 수도 있으며, 요청 헤더의 Accept를 활용할 수도 있다.