TIL38)SERVER : servlet, jsp

JIN JIN·2025년 4월 3일

TIL_SERVER

목록 보기
1/6

2025.4.3 38일차
server 1일차

05_SERVER



SERVER란?

  • 서버는 네트워크를 통해 클라이언트의 요청을 받고, 이에 대한 응답을 제공하는 컴퓨터 또는 소프트웨어를 의미한다.
    웹 환경에서 서버는 크게 웹 서버(Web Server)와 WAS(Web Application Server)로 구분된다.

웹 서버(Web Server)

  • 웹 서버는 클라이언트(브라우저)로부터 HTTP 요청을 받아 정적인 콘텐츠(HTML, CSS, JavaScript, 이미지 파일 등)를 제공하는 역할을 한다.
    대표적인 웹 서버로는 Apache HTTP Server, Nginx 등이 있다.

웹 서버의 주요 기능

  1. 정적 콘텐츠 제공: HTML, CSS, JS, 이미지 등의 정적인 리소스를 클라이언트에게 전달한다.
  2. 요청 라우팅: 클라이언트의 요청을 분석하여 적절한 처리 방향을 결정한다.
  3. SSL/TLS 암호화 지원: HTTPS를 지원하여 보안을 강화한다.

3. 웹 애플리케이션 서버(WAS)

  • WAS는 동적인 요청을 처리하는 서버로, 클라이언트의 요청을 받아 애플리케이션 로직을 수행하고 결과를 반환한다. 대표적인 WAS로는
    Apache Tomcat, JBoss, WebLogic 등이 있다.

WAS의 주요 기능

  1. 서블릿(Servlet) 및 JSP 실행: Java 기반의 동적 웹 애플리케이션을 실행한다.
  2. 비즈니스 로직 처리: 데이터베이스와 연동하여 클라이언트 요청에 맞는 결과를 생성한다.
  3. 세션 및 트랜잭션 관리: 클라이언트의 상태를 유지하고, 데이터베이스 연산을 안정적으로 처리한다.
  4. 멀티스레드 환경 지원: 하나의 애플리케이션을 여러 사용자가 동시에 사용할 수 있도록 지원한다.
  5. SSL/TLS 암호화 지원: HTTPS를 지원하여 보안을 강화한다.

    웹 서버에서 HTTPS를 처리하고 WAS는 내부 네트워크에서 HTTP로 통신하는 구조가 일반적이나, 필요에 따라 WAS 자체에서도 HTTPS를 설정할 수 있음

4. Apache(아파치)

  • Apache HTTP Server(아파치 웹 서버)는 가장 널리 사용되는 오픈 소스 웹 서버 소프트웨어로, 정적인 콘텐츠를 제공하는 역할을 한다.
    → 클라이언트 요청에 따라 고정적인(정적) 페이지를 제공(응답)하는 웹 서버.

5. Tomcat(톰캣)

  • Apache Tomcat은 Java Servlet과 JSP(Java Server Pages)를 실행할 수 있는 WAS이다. 아파치 재단에서 관리하며, 가벼운 WAS로서
    중소규모 프로젝트에서 많이 사용됨.

    → 클라이언트 요청에 따라 고정적인(정적) 페이지를 제공(응답)하는 웹 서버.

Tomcat의 특징

  • Java 서블릿 및 JSP 실행 지원
  • 경량 WAS로 빠른 성능 제공
  • Apache HTTP Server와 연동 가능
  • 다양한 환경에서 실행 가능

6. Apache Tomcat(아파치 톰캣)


Apache Tomcat은 아파치 재단에서 개발한 웹 애플리케이션 서버로, 웹 서버(Apache HTTP Server)와 웹 애플리케이션 서버(Tomcat)
의 기능을 결합한 형태이다.

→ 톰캣이 처리할 수 없는 정적 페이지 처리를 위하여 아파치의 일부 기능을 가져와 함께 제공하는 서버

Apache Tomcat의 특징

  • Java 기반의 웹 애플리케이션 실행 지원
  • 서블릿과 JSP 처리 가능
  • 단독 실행 가능하지만, 정적 페이지 처리를 위해 Apache HTTP Server와 함께 사용.
  • 가벼운 WAS로 개발 및 테스트 환경에서 널리 사용됨

다운로드 방법
http://tomcat.apache.org/
위 링크 접속하여 왼쪽 메뉴 탭 Download -> Tomcat 10 -> 10.1.xx -> Core -> OS에 맞는 tomcat zip파일 다운로드

Servlet이란?

1. Servlet

웹 서비스를 위한 자바 클래스 (자바를 이용하여 웹을 만들기 위해 필요한 기술)
서블릿(Servlet)은 웹에서 동적인 데이터를 처리하기 위해 사용하는 자바 프로그램이다.
쉽게 말해, 클라이언트(브라우저)에서 보낸 요청을 받아서 처리하고, 결과를 다시 클라이언트에게 응답하는 역할을 한다.
웹 프로그래밍에서 클라이언트의 요청(Request)을 처리하고 그 결과를 다시 클라이언트에게 응답(Response)하는 Servlet클래스의 구현
규칙을 지킨 자바 프로그래밍 기술.

2. Servlet 사용 이유

웹사이트에서 단순한 HTML만 제공하면 정적인 페이지밖에 만들 수 없음.
하지만 로그인, 게시판, 데이터 처리 같은 기능을 만들려면 서버에서 프로그램이 동작해야한다.
이 때, 자바 기반의 서버 프로그램인 서블릿을 사용하면 동적인 웹 페이지를 만들 수 있다.

→ 클라이언트 요청에 대한 서버 응답 시 미리 만들어둔 화면(정적)이 아닌 요청을 받을 때 마다 알맞은 화면을 만들어(동적) 응답함.

3. 서블릿의 동작 과정

    1. 사용자가 브라우저에서 요청(예: 로그인 버튼 클릭)을 보냄.
    1. 웹 서버(Apache, Nginx 등)가 이 요청을 받아 WAS(Tomcat 등)에 전달함.
    1. WAS가 서블릿을 실행하여 요청을 처리함.
    1. 서블릿이 필요한 데이터를 DB에서 가져오거나 계산한 후, HTML 응답을 생성함.
    1. 웹 서버가 브라우저에게 최종 결과를 전달함.

4. 서블릿의 상속 관계

서블릿 클래스는 javax.servlet.http.HttpServlet 클래스를 상속받아 구현됨.
이를 통해 HTTP 요청을 처리할 수 있다.

지금은 java x 아니고 자카르타!!!

5. 서블릿의 동작 과정

  1. 사용자가 HTTP 요청을 전송
  2. 웹 서버(Apache, Nginx 등)가 요청을 받아 Servlet Container(WAS)로 전달
  3. Servlet Container는 두 개의 객체를 생성함.
  • HttpServletRequest : 요청 URL, 파라미터, 헤더 등의 정보를 포함한 요청 객체
  • HttpServletResponse : 응답 내용, 상태 코드, 헤더 등의 정보를 설정하는 응답 객체
  1. 배포 서술자(DD, Deployment Descriptor) 또는 @WebServlet 어노테이션을 이용하여 요청을 처리할 서블릿을 결정
  • 과거에는 web.xml 파일을 사용했으나, 현재는 @WebServlet 을 이용하여 URL과 서블릿을 매핑하는 것이 일반적임.
  1. 서블릿의 생명주기 메서드 실행
  • init() : 서블릿이 처음 생성될 때 한 번만 호출되며, 초기화 작업을 수행
  • service() : 요청이 들어올 때마다 실행되며, 요청 방식(GET, POST 등)에 따라 doGet() , doPost() 등을 호출
  1. doGet() 또는 doPost() 메서드에서 동적인 웹 페이지를 생성하고 HttpServletResponse 객체를 통해 응답을 보냄
  2. 응답이 완료되면 HttpServletRequest , HttpServletResponse 객체가 소멸됨.

Servlet Container

Servlet Container(서블릿 컨테이너)는 서블릿(Servlet)을 실행하고 관리하는 환경을 제공한다.
웹 애플리케이션 서버(WAS, Web Application Server)의 핵심 구성 요소 중 하나로, 클라이언트의 요청을 받아 적절한 서블릿을 실행하고,
결과를 클라이언트에게 반환하는 역할을 한다.

  • 배포를 위한 포트 연결, 웹 서버 통신을 위한 소켓, 입/출력 스트림을 생성, 서블릿 생명주기 관리, 멀티스레드 처리, 세션 관리 등의 기능을
    제공하는 역할을 함.

Servlet Container의 예시

Apache Tomcat (가장 널리 사용됨)
Jetty (경량 컨테이너)
JBoss/WildFly (대규모 기업용 WAS 포함)
WebLogic/WebSphere (기업용 상용 WAS 포함)

GET과 POST의 차이

GET / POST : 클라이언트가 서버로 요청을 보내는 방법
1. GET방식 : (데이터를) 가져오다, 얻어오다

  • URL에 변수(데이터)를 포함시켜 요청.
  • 보안 유지를 안 하기 때문에 로그인 같은 경우는 get방식으로 하면 부적합
  1. POST방식 : (데이터를) 부치다.
  • 데이터를 서버로 제출하여 추가 또는 수정하기 위해 데이터를 전송하는 방식.
  • URL에 변수(데이터)를 노출하지 않고 요청 데이터를 HTTP Body에 포함하여 전송
  • 캐싱 : 한번 접근 후, 또 요청할 시 빠르게 접근하기 위해 데이터를 저장시켜 놓는 것

JSP란??

  • JSP(Java Server Page) : JAVA코드가 들어가 있는 HTML 코드
  • Java의 웹 서버 프로그램 스펙(서블릿)으로 변환되어 서비스 됨

Servelt과 JSP의 차이점

Servlet

  • "웹 서비스 기능을 해주는 자바 클래스"를 말하는 것으로 자바 소스코드 속에 HTML 코드가 들어가는 형태
    -> HTML 문서를 작성하는데 복잡하고 번거롭다는 단점이 있음.

JSP

  • 복잡한 Serlvet을 좀 더 간단히 사용할 수 있음.

    Servlet과 반대로 HTML소스코드 속에 자바 소스코드(<% %> 또는 <%= %>)가 들어가는 형태.

  • 컴파일을 통해 클래스 파일로 변환되어 웹 서버(WAS)에서 실행됨.

JSP 동작 구조

Servelt/JSP 동작 순서

1) 웹 서버가 사용자로부터 서블릿에 대한 요청을 받으면 서블릿 컨테이너에 그 요청을 넘김
2) 요청을 받은 컨테이너는 HTTPRequest와 HTTPResponse객체를 만들어
이를 서블릿 doPost()나 doGet()메소드 중 하나를 호출
3) 클라이언트가 요청에 대한 응답 웹 페이지를 보여줄 때
기존 Servlet에서 출력 객체를 이용하여 HTML 문서 작성하던 부분(프레젠테이션 로직)을 JSP로 분리함.
-> 데이터의 입력, 수정 등의 대한 제어를 JSP로 넘겨 가독성을 높임.
4) JSP에게 넘겨진 프레젠테이션 로직을 수행한 후 컨테이너에게 Response전달
5) 전달받은 JSP 프레젠테이션 로직 수행 결과와 Servlet이 결합되어 .class 파일이 만들어짐

JSP 장점

  • 서블릿보다 쉽고 작성하기 빠름
  • 디자인 부분(html)과 로직 부분( java)으로 이루어져 있음.
    정보, 디자인 부분(html)과 로직 부분( java)을 분리시킬 수도 있음.
  • 프로그래머가 직접 코딩한 서블릿 보다 최적화 된 서블릿으로 생성시켜주므로
    효율적인 코드가 만들어짐
  • 웹 애플리케이션 상에서 변수의 사용 가능한 범위(scope)설정이 쉬움

JSP를 이루는 구성인자(element)

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 지정 = java import
<%page import="java.sql.*, java.util.*" %>

3.errorPage : 오류 페이지 관리, 현재 페이지에서 오류 발생 시 호출될 페이지 지정,
에러 발생시 포워딩(페이지 주소는 그대로고 화면은 이동) 됨

<%@ page errorPage="error.jsp" %>

  1. isErrorPage : 오류 페이지 관리, errorPage속성에 설정된 오류 처리 파일로 다른 용도 사용 못하고 오직 오류만을 처리하는 페이지로 지정(true)

true로 두면 exception객체를 쓸 수 있게 된다.
<%@ page isErrorPage="true" %>

5.language : 사용할 스크립트 언어 유형 지정( java)

<%@ page language = "java" %>

  1. session : 세션의 사용유무 (true), 웹 브라우저와 웹 서버가 지속적으로 상대를 인식하기 위해 필요한 정보를 임시로 저장해두는 방법
    <%@ page session="true" %>

  2. buffer : 버퍼의 크기 (8KB), jsp페이지 내용을 출력하려면 JspWriter객체인 out변수 사용,
    이때 out객체로 사용할 버퍼의 크기 지정 가능
    버퍼는 데이터를 좀 더 효율적이고 안전하게 전송하기 위한 프로그래밍 기법으로 전송할 데이터를 미리 확보한 후 조금씩 전송하는 방법
    <%@ page buffer="8KB" %>

  3. autoFlush : 버퍼의 내용 자동 비움 (true)
    <%@ page autoFlush="true" %>

  4. isThreadSafe : 단일스레드 모델을 사용함으로써 true 동시성 제어 여부 지정 서블릿의 장점은 각 사용자 접속에 대한 요청을 프로세스가 아닌 스레드로 처리 스레드를 이용하면 좀 더 효율적으로 시스템을 운영할 수 있으나 각 스레드가 자원을 공유하게 때문에 이들 데이터에 대한 안정성을 보장할 수 없게 됨
    이 옵션은 스레드 상태에서 데이터의 안정성을 보장하는 옵션

<% page isThreadSafe="true" %>

  1. info : JSP 페이지에 대한 설명부분, 일종의 주석
    <% page info="JSP Example" %>

  2. pageEncoding : JSP파일(페이지)에 기록된 소스코드 자체의 인코딩 방식
    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    ( pageEncoding 은 ContentType의 charset 과 동일한 기능을 함)

2) include

jsp 파일이 자바파일로 바뀔 때 자바문서에 삽입되어 컴파일 되는 파일 추가
<%@include file="today.jsp" %>

3) 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액션(표준 액션, 커스텀 액션)

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페이지가 속하는 웹애플리케이션의 초기상태와 관련된 기능을 함

이클립스 초기설정 (아파치 10.1)

아파치모델 10.1 이상은 웹모듈이 6.0 이여야함
5.0이면 안됨


프로젝트명을 /로 바꾸기!!! 최상위클래스로 바꾸기!!!
상대경로 절대경로 편하다.

해서 서버 만들기

web.xml(배포 서술자)
server가 켜지자 마자 프로그램 파일 중 제일 처음 읽는 문서

웰컴파일 리스트 : 메인페이지로 사용할 파일명 목록!!

없다면 404 오류가 뜸 !!! page not found..

서블렛서버 우클릭 run as server: servlet server하면 됨!

빨간불이 들어온 네모 : 서버 연결되어있음
서버 끄고싶으면 다시 빨간 네모 누르기

HTTP 상태코드

우리가 흔하게 본 경우 404:

우리가 흔하게 본 경우 500: 우리가 코드 잘못 친 경우

https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Status

이클립스라는 에디터에서 Servlet 프로젝트 만지는중인데
vscode라는 에디터에서도 Servlet 프로젝트 만질수있다.

vscode로 다루기

05서버 폴더 열고
webapp에서 index.html열기

만약 원하는 내용의 파일이 있다면 제대로 뜸


이게 내가 vscode로 작성해놓은 index.html

eclipse로 돌아와서

web.xml작성하고 controller로 가기



이름과 나이를 입력받아 서버로 제출하는



잘 제출된것을 확인 가능

서버에서 이클립스로 잘 받아옴

서버에 내가 받은 결과값 띄우기

개발자도구로 보면

위에는 겟방식

쿼리 문자열 매개 변수

post방식으로 보내면

안보임


양식데이터 = form data

JSP로 작성한 내용


if 문으로 자기소개 있으면 뜨고 없으면 안뜨는


자기소개가 있을때,

자기 소개가 없을때는 "자기 소개"라는 h4태그가 안뜸!
하지만 jsp코드는 단점이 있음.
한줄씩 읽어오기 때문에,

{ }를떨어트려서 작성해야함

커피주문


주문자이름 / 커피 종류 / 아이스인지 핫인지/ 옵션 추가/ 주문버튼
option에 value값이 없을땐 <>안에 내용이 value값으로 넘어감
=> coffee = 아메리카노, coffee=카페라테 이런식으로

그럼이제 컨트롤러 만들기!!!

do get 에서는 super무조건 지우기!!!!

  • getParameter("name") : 같은 name속성을 가진 여러개 값중 첫번째 값만 반환
  • getParameterValues("name"): 같은 name속성을 가진 모든 값을 배열 형태(String[])로 반환

보여지는 화면 : result2.jsp

홈페이지 열릴때 사이트 이름을 @@@님의 주문결과 라고 적어줬음 좋겠어서 내 코드에서

<title><%=request.getParameter("orderer")%>님의 주문결과 </title>

orderer = 주문자이름을 넣어줘서 그렇게 했고 : 탭부분의 제목을 보면 알수있음.

주문한 커피가 ice면 차가운이라는 단어를, hot을 고르면 따듯한이라는 단어를 추가해주기위해서
if문을 사용해주었다.

  • 형광펜을 칠한
<%= request.getParameterValues("opt")%>는 우리가 옵션으로 선택한 선택지를 담아놓는
배열의 주소값을 보여주는것


배열이 null 인 경우 = 옵션을 아무것도 선택안했을경우를 대비해서 if문으로
만약에 배열이 null이 아닐때만 저 포문을 돌게 했다,,
근데 왜 이클립스에서도 짜고, jsp에서도 짜는거지?
서로 같은 주소만 참고하고 서로 완전히 다른 객체이기 때문에
그리고 esclipse 내에서 보려고 한 코드임

이 빨간 동그라미 코드만 있어도 됨!!!!

집에가서 확인해볼것 깃이랑 임포트할때

우클릭> 프로퍼티즈-> 메뉴바 중간에 -> 프로젝트 페이셋?
-> 다이나믹 웹모듈 6.0버전체크, 자바1.0버전이 해제 되어있고,자바스크립트도 해제되있고 런타임이 해제 되어있을수 있음
그거 선택 (아파치톰캣)

다른컴퓨터에 -> 서버 추가하고

profile
WAVYFROMTHEOCEAN

0개의 댓글