01. 인터넷(Internet)과 웹(Web)
인터넷
컴퓨터가 서로 연결되어 TCP/IP라는 통신 프로토콜을 이용하여 정보를 주고받는 전 세계의 컴퓨터 네트워크
인터넷을 통해 광범위한 정보와 서비스를 제공할 수 있음
그 중의 하나가 바로 웹임웹
인터넷에 연결된 컴퓨터들을 통해 사람들이 정보를 공유할 수 있는 정보 공간으로, 월드 와이드 웹(World Wide Web)의 줄임말
인터넷과 웹은 서로 다른 개념이지만, 인터넷의 활용에서 웹의 비중이 절대적 위치를 차지하여 인터넷과 웹을 같은 의미로 사용함
02. 웹의 동작 원리
웹은 기본적으로 클라이언트/서버 방식으로 작동함
클라이언트가 특정 페이지를 웹 서버에 요청(request)하게 되면
이를 처리한 후 그 결과를 클라이언트에게 보내 응답(response)하는 것가장 널리 쓰이는 웹 서버로는 아파치(Apache), 톰캣(Tomcat) 등이 있음
웹 페이지는 크게
정적(static) 페이지와 동적(dynamic) 페이지로 나눌 수 있음정적 웹 페이지
컴퓨터에 저장된 텍스트 파일을 그대로 보는 것
HTML과 같은 웹 언어로 작성함
정적 웹 페이지의 동작 방식
- 클라이언트가 웹 페이지 요청
- 웹 서버가 *.html 파일 검색
- 이미 준비된 HTML 문서를 그대로 전달
- 웹 브라우저가 HTML 문서를 보여줌
동적 웹 페이지
저장된 내용을 다른 변수로 가공 처리하여 보는 것
PHP, ASP, JSP와 같은 웹 언어로 작성함정적 웹 페이지의 작동 방식
1. 클라이언트가 웹 페이지 요청
2. 웹 서버가 로직 처리를 요청
예) 코테 정답 요청
단순히 사진이나 글자가 아닌 코드를 돌려서 답을 알아내야 하는 작업
3. 데이터베이스 연동
4. 로직 처리 결과 전송
5. 요청에 맞게 정제된 파일 전송
6. 웹 브라우저가 결과를 화면에 출력
웹 프로그래밍 언어는 클라이언트 측 실행 언어와 서버 측 실행 언어로 구분됨
자바를 기반으로 하는 서블릿과 JSP는 서버 측 웹 프로그래밍 언어임
서블릿(Servlet)
자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 웹 프로그래밍
웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종Java 코드 안에 HTML을 추가
서블릿의 특징
- 이식 가능
자바 프로그래밍 언어를 사용하기 때문에 플랫폼에 독립적임- 효율적이며 확장 가능
서블릿이 웹 서버에 배포되고 로드되면 클라이언트의 요청을 즉시 이행하기 시작할 수 있음
웹 서버가 서블릿을 호출할 때 자바이 멀티스레딩 기능을 사용하여 여러 클라이언트의 요청을 한번에 처리할 수 있음- 견고함
자바의 주요 기능(가비지 수집, 예외 처리, 자바 보안 관리자)을 상속함으로써 메모리 관리 문제 및 메모리 낭비를 줄일 수 있음JSP(Java Server Pages)
자바 언어를 기반으로 하는 스크립트 언어HTML 내에 Java 코드를 삽입
실행 시에 자바 서블릿으로 변환된 후 실행되므로 서블릿과 거의 유사함
하지만 HTML 표준에 따라 작성되므로 웹 디자인하기에 편리하며
JSP 태그 라이브러리를 사용하는 경우 자바 코딩 없이 태그만으로 기술이 가능하므로 생산성을 높일 수 있음JSP의 특징
- JSP는 서블릿 기술의 확장
JSP에서는 서블릿의 모든 기능을 사용할 수 있음
서블릿의 동작 과정
1. 클라이언트가 URL을 입력하면 해당 HTTP Request(요청)을 서버의 서블릿 컨테이너로 전송하고, HTTP Request를 전송받은 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성
배포 서술자를 기반으로 사용자가 요청한 URL을 분석하여 어느 서블릿 객체에 대한 요청인지를 찾음
해당 서블릿 객체에서 service 메소드를 호출하며, 클라이언트의 POST, GET 여부에 따라 doGet() 또는 doPost()를 호출, doGet(), doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보냄
protected void doGet(HttpServletRequest request, HttpServletResponse response) { // 서블릿은 이런 식으로 '페이지 정보'를 실시간으로 작성해서 보냅니다. PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>안녕하세요, " + request.getParameter("name") + "님!</h1>"); // 동적인 정보 삽입 out.println("</body>"); out.println("</html>"); }
- 웹 서버는 정적 웹 페이지처럼 *.class의 실행 결과를 웹 브라우저에 응답으로 전달하며, 웹 브라우저는 새로 가공된 HTML 페이지를 동적으로 처리한 결과를 보여주며 결과를 보여줬다는 응답을 보여주는 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킴
JSP의 동작 과정
JSP 페이지는 하나의 서블릿 프로그램으로 변환되어 실행됨
1. 웹 브라우저가 웹 서버에 JSP를 요청함 웹 서버는 요청된 Hello.jps에서 jsp 확장자를 발견하여 JSP 페이지임을 확인하고 웹 서버에 있는 JSP 컨테이너에 전달함
JSP 컨테이너는 JSP 페이지를 서블릿 프로그램인 Hello_jsp.java로 변환함
JSP 컨테이너가 서블릿 프로그램을 컴파일하여 Hello_jsp.class로 만들고 이를 웹 서버에 전달함
웹 서버는 정적 웹 페이지처럼 *.class의 실행 결과를 웹 브라우저에 응답으로 전달하므로 웹 브라우저는 새로 가공된 HTML 페이지를 동적으로 처리한 결과를 보여줌
서블릿의 생명 주기
1. 로딩 단계서블릿 객체가 처음 요청된 경우라면 서블릿 클래스를 메모리에서 로딩하여 객체를 생성해야 함.
생성된 객체는 메모리에 계속 존재하기 때문에 이후부터는 서블릿 객체가 새로 생성되지 않고, 메모리에 있는 서블릿 객체를 사용함2. 초기화 단계: init() 메소드
서블릿이 처음 요청될 때 초기화하는 메소드.
객체가 생성되면서 최초에 한 번만 호출됨3. 실행 단계: service() 메소드
서블릿 컨테이너가 요청을 받고 응답을 줄 때 필요한 서블릿의 메소드.
서블릿 인터페이스를 구현한 HttpServlet 클래스의 doGet(), doPost() 등의 메소드가 호출됨protected void service(HttpServletRequest req, HttpServletResponse resp) { // 1. 요청이 어떤 방식(Method)인지 확인 String method = req.getMethod(); // 2. 방식에 따라 알맞은 메서드 호출 (교통정리) if (method.equals("GET")) { doGet(req, resp); } else if (method.equals("POST")) { doPost(req, resp); } else if (method.equals("PUT")) { doPut(req, resp); } // ... 나머지 DELETE, HEAD 등등 }4. 소멸 단계: destroy() 메소드
서블릿 클래스가 더 이상 사용도지 않으면 서블릿 컨테이너는 주기적으로 destory() 메소드를 호출하여 제거함.
제거된 클래스를 다시 사용하려면 init() 메소드를 다시 호출해야 함
JSP 생명 주기
1. 번역 단계
JSP 컨테이너가 JSP 소스 파일을 Java 코드(서블릿)로 변환함.
파일을 읽고 구문을 분석하며 JSP 문법 검사 등을 진행함2. 컴파일 단계
JSP 컨테이너가 번역 단계에서 생성된 자바 코드인 서블릿을 컴파일하여 클래스 파일을 생성함.
자바 코드의 모든 구문을 검사하여 Java 코드 문법 검사 등을 진행함3. 로딩 및 초기화 단계: jspInit() 메소드
JSP 컨테이너가 앞의 두 단계에서 생성된 *.class를 로딩하고 클래스의 인스턴스를 작성함.
(인스턴스: Class를 바탕으로 메모리 영역(Heap)에 만들어진 실체를 의미)
JSP 컨테이너는 서블릿의 init() 메소드, 즉 jspInit() 메소드를 호출하여 인스턴스가 된 객체를 초기화함.
일반적으로 초기화는 한 번만 수행되고 데이터베이스 연결, 파일 열기, 룩업 테이블 생성 등을 초기화함.4. 실행 단계: _jspService() 메소드
웹 브라우저가 jsp 페이지를 요청하여 페이지가 로딩 및 초기화될 때마다 JSP 컨테이너는 JSP에서 _jspService() 메소드를 호출하여 응답 객체를 전달.
내장 객체를 갱신해주는 메소드5. 소멸 단계: jspDestroy()
jspDestroy() 메소드는 서블릿의 destroy() 메소드에 해당함
jspDestroy()가 서블릿의 destroy()를 실행하는 과정에서 호출되도록 설계되어있음.// 서버 내부의 서블릿 코드 (예시) public final void destroy() { // 1. 서블릿으로서 해야 할 기본 정리 작업을 하고... // 2. JSP 개발자가 정의한 뒷정리 메서드를 호출해준다! jspDestroy(); } // 우리가 JSP에서 작성하는 코드 <%! public void jspDestroy() { System.out.println("JSP가 종료됩니다. DB 연결을 닫습니다."); } %>