1. 서버(Server)란?
서버는 네트워크를 통해 클라이언트의 요청을 받고,
이에 대한 응답을 제공하는 컴퓨터 또는 소프트웨어웹 환경에서 서버는 크게 웹 서버(Web Server)와 WAS(Web Application Server)로 구분됨.
- 클라이언트(브라우저)로부터 HTTP 요청을 받아 정적인 컨텐츠(HTML, CSS, JavaScript, 이미지파일)를 제공하는 역할
- 대표적인 웹 서버로는 Apache HTTP Server, Nginx 등
웹 서버의 주요 기능
- 정적 컨텐츠 제공 : HTML, CSS, JS, 이미지 등의 정적인 리소스를 클라이언트에게 전달
- 요청 라우팅 : 클라이언트의 요청을분석하여 적절한 처리 방향을 결정
- SSL/TLS 암호화 지원 : HTTPS를 지원하여 보안을 강화
- 동적인 요청을 처리하는 서버로, 클라이언트의 요청을 받아 애플리케이션 로직을 수행하고 결과를 반환
- 대표적인 WAS로는 Apache Tomcat, JBoss, WebLogic 등
WAS의 주요 기능
- 서블릿(Servlet) 및 JSP 실행 : Java 기반의 동적 웹 애플리케이션을 실행
- 비즈니스 로직 처리 : 데이터베이스와 연동하여 클라이언트 요청에 맞는 결과를 생성
- 세션 및 트랜잭션 관리 : 클라이언트의 상태를 유지하고, 데이터베이스 연산을 안정적으로 처리
- 멀티스레드 환경 지원 : 하나의 애플리케이션을 여러 사용자가 동시에 사용할 수 있도록 지원
- SSL/TLS 암호화 지원 : HTTPS를 지원하여 보안을 강화
- 웹 서버에서 HTTPS를 처리하고 WAS는 내부 네트워크에서 HTTP로 통신하는 구조가 일반적이나, 필요에 따라 WAS 자체에서도 HTTPS를 설정할 수 있음
- Apache HTTP Server(아파치 웹 서버)는 가장 널리 사용되는 오픈소스 웹서버 소프트웨어로,
정적인 컨텐츠를 제공하는 역할을 한다.
-> 클라이언트 요청에 따라 고정적인(정적) 페이지를 제공(응답)하는 웹 서버
- Apache Tomcat은 Java Servlet과 JSP(Java Server Pages)를 실행할 수 있는 WAS이다.
아파치 재단에서 관리하며, 가벼운 WAS로서 중소규모 프로젝트에서 많이 사용됨.
-> 클라이언트 요청에 따라 고정적인(정적) 페이지를 제공(응답)하는 웹 서버Tomcat의 특징
- Java 서블릿 및 JSP 실행 지원
- 경량 WAS로 빠른 성능 제공
- Apache HTTP Server와 연동 가능
- 다양한 환경에서 실행 가능
- Apache Tomcat은 아파치 재단에서 개발한 웹 애플리케이션 서버로,
웹 서버(Apache HTTP Server)와 웹 애플리케이션 서버(Tomcat)의 기능을 결합한 형태
-> 톰캣이 처리할 수 없는 정적 페이지를 처리하기 위해 아파치의 일부 기능을 가져와 함께 제공하는 서버Apache Tomcat의 특징
- Java 기반의 웹 애플리케이션 실행 지원
- 서블릿과 JSP 처리 기능
- 단독 실행 가능하지만, 정적 페이지 처리를 위해 Apache HTTP Server와 함께 사용
- 가벼운 WAS로 개발 및 테스트 환경에서 널리 사용됨
Servlet
- 웹 서비스를 위한 자바 클래스 (자바를 이용하여 웹을 만들기 위해 필요한 기술)
- 웹에서 동적인 데이터를 처리하기 위해 사용하는 자바 프로그램
- 클라이언트(브라우저)에서 보낸 요청을 받아서 처리하고,
결과를 다시 클라이언트에게 응답하는 역할Servlet 사용 이유
- 웹사이트에서 단순한 HTML만 제공하면 정적인 페이지밖에 만들 수 없음
- 하지만 로그인, 게시판, 데이터 처리같은 기능을 만들려면 서버에서 프로그램이 동작해야 한다.
- 이 때, 자바 기반의 서버 프로그램인 서블릿을 사용하면 공적인 웹 페이지를 만들 수 있다.
-> 클라이언트 요청에 대한 서버 응답 시 미리 만들어둔 화면(정적)이 아닌 요청을 받을 때 마다 알맞은 화면을 만들어(동적) 응답함.서블릿의 동작 과정
- 사용자가 브라우저에서 요청(예: 로그인 버튼 클릭)을 보냄.
- 웹 서버(Apache, Nginx 등)가 이 요청을 받아 WAS(Tomcat 등)에 전달함.
- WAS가 서블릿을 실행하여 요청을 처리함.
- 서블릿이 필요한 데이터를 DB에서 가져오거나 계산한 후, HTML 응답을 생성함.
- 웹 서버가 브라우저에게 최종 결과를 전달함.
서블릿의 상속 관계
서블릿 클래스는 javax.servlet.http.HttpServlet 클래스를 상속받아 구현됨.
이를 통해 HTTP 요청을 처리할 수 있다.java.lang.Object └── javax.servlet.GenericServlet └── javax.servlet.http.HttpServlet └── 사용자가 만든 서블릿 (예: HelloServlet)서블릿의 동작 과정
1. 사용자가 HTTP 요청을 전송
2. 웹 서버가 요청을 받아 Servlet Container(WAS)로 전달
3. Servlet Contaier는 두 개의 객체를 생성함
HttpServletRequest: 요청 URL, 파라미터, 헤더 등의 정보를 포함한 요청 객체HttpServletResponse: 응답 내용, 상태 코드, 헤더 등의 정보를 설정하는 응답 객체
- 배포 서술자(DD, Deplotment Desctiptor)또는
@WebServlt어노테이션을 이용하여 요청을 처리할 서블릿을 결정
- 과거에는
web.xml파일을 사용했으나, 현재는@WebServlet을 이용하여 URL과 서블릿을 매핑하는 것이 일반적
- 서블릿의 생명주기 메서드 실행
init(): 서블릿이 처음 생성될 때 한 번만 호출되며, 초기화 작업을 수행service(): 요청이 들어올 때마다 실행되며,
요청 방식(GET, POST 등)에 따라doGet(),doPost()등을 호출
doGet()또는doPost()__메서드에서 동적인 웹 페이지를 생성하고HttpServletResponse객체를 통해 응답을 보냄- 응답이 완료되면
HttpServletRequest,HttpServletResponse객체가 소멸됨.Servlet Container
- 서블릿을 실행하고 관리하는 환경을 제공
- WAS의 핵심 구성 요소 중 하나로, 클라이언트의 요청을 받아 적절한 서블릿을 실행하고,
결과를 클라이언트에게 반환하는 역할을 한다.- 배포를 위한 포트 연결, 웹 서버 통신을 위한 소켓, 입/출력 스트림을 생성, 서블릿 생명주기 관리, 멀티스레드 처리, 세션 관리 등의 기능을 제공하는 역할을 함.
Servlet Container의 예시
- Apache Tomcat (가장 널리 사용됨)
- Jetty (경량 컨테이너)
- JBoss / WildFly (대규모 기업용 WAS 포함)
- WebLogic / WebSphere (기업용 상용 WAS 포함
클라이언트가 서버로 요청을 보내는 방법
GET방식
- 데이터를 가져오다, 얻어오다
- URL에 변수(데이터)를 포함시켜 요청
- 보안 유지를 안 하기 때문에 로그인같은 경우는 get방식으로 하면 부적함
POST방식
- 데이터를 부치다
- 데이터를 서버로 제출하여 추가 또는 수정하기 위해 데이터를 전송하는 방식
- URL에 변수(데이터)를 노출하지 않고 요청 데이터를 HTTP Body에 포함하여 전송
항목 GET 방식 POST 방식 목적 조회 (데이터 가져오기) 데이터 생성, 수정, 삭제 등 처리 목적 데이터 전송 방식 URL에 쿼리 스트링으로 포함 ( ?key=value)HTTP 메시지 Body에 포함 보안 낮음 (URL에 노출됨) 상대적으로 높음 (Body에 포함되어 URL에 노출 안 됨) 전송 데이터 크기 제한 있음 (URL 길이 제한) 제한 거의 없음 캐싱 가능 (브라우저가 캐시함) 일반적으로 불가능 사용 예시 검색, 리스트 조회 등 로그인, 회원가입, 글 작성 등
- 캐싱 : 한 번 접근 후, 또 요청할 시 빠르게 접근하기 위해 데이터를 저장시켜 놓는 것.
- JSP(Java Server Page) : JAVA코드가 들어가 있는 HTML 코드
- Java의 웹 서버 프로그램 스펙(서블릿)으로 변환되어 서비스 됨
Servlet과 JSP의 차이점
Servlet
- "웹 서비스 기능을 해주는 자바 클래스"를 말하는 것으로 자바 소스코드 속에 HTML코드가 들어가는 형태
-> HTML 문서를 작성하는데 복잡하고 번거롭다는 단점이 있음.JSP
- 복잡한 Servlet을 좀 더 간단히 사용할 수 있음.
- Servlet과 반대로 HTML 소스코드 속에
자바 소스코드(<% %> Ehsms <%= %>)가 들어가는 형태.
->컴파일을 통해 클래스 파일로 변환되어 웹 서버(WAS)에서 실행됨.JSP 동작 구조
Servlet / JSP 동작 순서
- 웹 서버가 사용자로부터 서블릿에 대한 요청을 받으면 서블릿 컨테이너에 그 요청을 넘김
- 요청을 받은 컨테이너는 HTTPRequest와 HTTPResponse객체를 만들어
이를 서블릿 doPost()나 doGet()메소드 중 하나를 호출- 클라이언트가 요청에 대한 응답 웹 페이지를 보여줄 때
기존 Servlet에서 출력 객체를 이용하여
HTML 문서 작성하던 부분(프레젠테이션 로직)을 JSP로 분리함.
-> 데이터의 입력, 수정 등의 대한 제어를 JSP로 넘겨 가독성을 높임.- JSP에게 넘겨진 프레젠테이션 로직을 수행한 후 컨테이너에게 Resplonse 정달
- 전달받은 JSP 프레젠테이션 로직 수행 결과와 Servlet이 결합되어 .class 파일이 만들어짐
JSP 장점
- 서블릿보다 쉽고 작성하기 빠름
- 디자인 부분(html)과 로직 부분(java)으로 이루어져 있음
정보, 디자인 부분(html)과 로직(java)을 분리 시킬 수도 있음- 프로그래머가 직접 코딩한 서블릿 보다 최적화 된 서블릿으로 생성시켜주므로
효율적인 코드가 만들어짐- 웹 애플리케이션 상에서 변수의 사용 가능한 범위(scope)설정이 쉬움
JSP를 이루는 구성인자
1. 지시어 (directive)
1) page : 현재의 JSP페이지를 컨테이너에서 처리 하는데 필요한 각종 속성을 기술하는 부분으로 보통 소스의 맨 앞에 위치 <%@ page 속성1="속성값1" 속성2="속성값2" ... %>
-> page 지시어 속성 종류
(1) contentType : MIME 형식 지정 및 캐릭터셋 설정(text.html; charset=ISO-8891-1)
<%@ page contentType="text/html" %>(2) import : 자바 클래스 사용, JSP 내에서 사용할 외부 자바 패키지나 클래스의 import 지정
<%page import="java.sql., java.util." %>(3) errorPage : 오류 페이지 관리, 현재 페이지에서 오류 발생 시 호출될 페이지 지정,
에러 발생시 포워딩(페이지 주소는 그대로고 화면은 이동) 됨
<%@ page errorPage="error.jsp" %>(4) isErrorPage : 오류 페이지 관리, errorPage속성에 설정된 오류 처리 파일로
다른 용도 사용 못하고 오직 오류만을 처리하는 페이지로 지정(true)
true로 두면 exception객체를 쓸 수 있게 된다.
<%@ page isErrorPage="true" %>(5) language : 사용할 스크립트 언어 유형 지정( java)
<%@ page language = "java" %>(6) session : 세션의 사용유무 (true), 웹 브라우저와 웹 서버가 지속적으로 상대를 인식하기 위해
필요한 정보를 임시로 저장해두는 방법
<%@ page session="true" %>(7) buffer
버퍼의 크기 (8KB), jsp페이지 내용을 출력하려면 JspWriter객체인 out변수 사용,
이때 out객체로 사용할 버퍼의 크기 지정 가능
버퍼는 데이터를 좀 더 효율적이고 안전하게 전송하기 위한 프로그래밍 기법으로
전송할 데이터를 미리 확보한 후 조금씩 전송하는 방법
<%@ page buffer="8KB" %>(8) autoFlush : 버퍼의 내용 자동 비움 (true)
<%@ page autoFlush="true" %>(9) isThreadSafe : 단일스레드 모델을 사용함으로써 true 동시성 제어 여부 지정
서블릿의 장점은 각 사용자 접속에 대한 요청을 프로세스가 아닌 스레드로 처리
스레드를 이용하면 좀 더 효율적으로 시스템을 운영할 수 있으나
각 스레드가 자원을 공유하게 때문에 이들 데이터에 대한 안정성을 보장할 수 없게 됨
이 옵션은 스레드 상태에서 데이터의 안정성을 보장하는 옵션
<% page isThreadSafe="true" %>(10) info : JSP 페이지에 대한 설명부분, 일종의 주석
<% page info="JSP Example" %>(11) pageEncoding : JSP파일(페이지)에 기록된 소스코드 자체의 인코딩 방식
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
( pageEncoding 은 ContentType의 charset 과 동일한 기능을 함)
include
jsp 파일이 자바파일로 바뀔 때 자바문서에 삽입되어 컴파일 되는 파일 추가
<%@include file="today.jsp" %>
taglib
JSP 기능을 좀더 확장할 수 있는 인자
정의된 사용자 정의 태그 가져와 사용할 수 있는 방법 제공
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2. 스크립팅 원소(scripting element)
JSP 페이지에서 자바코드를 직접 기술할 수 있게 하는 기능
1) 선언문(declaration)
<%! 자바코드 %>2) 스트립틀릿(scriptlet)
<% 자바코드 %>3) 출력식, 표현식(expression)
<%= 자바코드 %>
3. JSP액션 (표준 액션, 커스텀 액션)
일반적인 JAVA프로그램에서는 변수를 사용하기 전에 반드시 선언을 해야하지만
JSP페이지에서는 선언을 사용하지 않고도 사용 할 수 있는 변수가 있음-> 이러한 변수를 JSP페이지의 "내장객체변수(implicit variable)"라 함
왜냐하면 웹컨테이너(=WAS, 톰캣서버)가 JSP페이지를 Servlet클래스로 변환해줄 때 자동적으로
변수 선언을 해주기 때문에 변수 선언 없이 그냥 사용 가능request
- doGet, doPost메소드의 첫번째 파라미터와 동일한 역할
- 웹클라이언트에서 보내온 데이터 값을 받아서 처리해주는 변수
- 데이터 저장소 역할을 할 수 있음
response
- doGet, doPost메소드의 두번째 파라미터와 동일한 역할
- 웹클라이언트의 요청에 대해 응답결과 처리를 위한 변수
out
- 웹브라우저로 HTML코드를 출력해주는 기능
- Servlet클래스 안에서 response.getWriter()메소드를 호출해서 얻은
PrintWriter객체와 동일한 기능을 함session
- 세션 : 여러 웹 컴포넌트들이 협력작업을 시작해서 끝내기까지의 기간 의미
- session 내장 객체 속에 세션을 시작하고 끝나는 기능과 그 기간동안
웹 컴포넌트(웹서비스를 하고 있는 어디서나)들이 데이터를 주고 받을 수 있는 기능이 들어있음application
- JSP 페이지가 속하는 웹 애플리케이션에 관련된 기능을 함
config
- JSP페이지가 속하는 웹애플리케이션의 초기상태와 관련된 기능을 함