(TIL) 4/3 Server

IT_JANG·2025년 4월 3일

웹서비스

웹 서버(Web Server)

정의

  • 정적 서비스
  • 요청 시 항상 동일한 결과를 나타내는 서비스 (DB연결 X)
  • 정적인 콘텐츠(HTML, CSS, JavaScript, 이미지 파일 등)를 제공
  • Apache HTTP Server, Nginx

기능

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

웹 애플리케이션 서버(WAS : Web Application Server)

정의

  • 동적 서비스
  • 요청 시마다 결과가 다른 서비스 (DB 연결 O)
  • 동적인 요청(애플리케이션 로직)을 수행하고 결과를 반환
  • Apache Tomcat, JBoss, WebLogic

기능

  • 서블릿(Servlet) 및 JSP 실행 : Java 기반의 동적 웹 애플리케이션을 실행
  • 비즈니스 로직 처리 : 데이터베이스와 연동하여 클라이언트 요청에 맞는 결과를 생성
  • 세션 및 트랜잭션 관리 : 클라이언트의 상태를 유지하고, 데이터베이스 연산을 안정적으로 처리
  • 멀티스레드 환경 지원 : 하나의 애플리케이션을 여러 사용자가 동시에 사용할 수 있도록 지원
  • SSL/TLS 암호화 지원 : HTTPS를 지원하여 보안을 강화
    • 웹 서버에서 HTTPS를 처리하고 WAS는 내부 네트워크에서 HTTP로 통신하는 구조가 일반적이나, 필요에 따라 WAS 자체에서도 HTTPS를 설정할 수 있음

Apache Tomcat(아파치 톰캣)

정의

  • 서버로, 웹 서버(Apache HTTP Server)와 웹 애플리케이션 서버(Tomcat)
    의 기능을 결합한 형태
  • 톰캣이 처리할 수 없는 정적 페이지 처리를 위하여 아파치의 일부 기능을 가져와 함께 제공하는 서버

Dynamic Web Project

주의사항

  • 프로젝트 생성 시
    • Apchech Tomcat v10 이상일 경우 Dynamic web module version 6.0 이상 사용 해야함
    • Web Module
      • Context root : / 로 변경(웹페이지 주소)
      • Generate web.xml deployment descriptor 체크
  • git에서 import 받았을 경우
    • Dynamic Web Project가 아닌 일반 Java Project로 되어 있을 수 있음
    • Project 우클릭 → Properties → Project Facets → Dynamic Web Module, Java, JavaScript 체크 → Rutimes → Apache Tomcat v10.1 체크

구조와 구성요소
image.png

  • JRE System Library [JavaSE-21]
    • 현재 프로젝트에서 사용 중인 Java 버전의 라이브러리
    • Java 표준 클래스들을 포함하며 프로젝트의 컴파일실행 환경제공
  • Server Runtime [Apache Tomcat v10.1]
    • 현재 프로젝트가 실행될 때 사용하는 WAS를 나타냄.
    • 프로젝트가 Tomcat v10.1 서버에서 실행될 수 있도록 라이브러리 및 환경을
      설정해주는 역할을 함.
  • src/main/java
    • Java 소스 파일이 저장되는 디렉토리
    • 실제 비즈니스 로직, 서블릿 클래스, Java 관련 코드를 작성.
  • src/main/webapp
    • webapp 디렉토리는 웹 애플리케이션의 루트 디렉토리이며, HTML, JSP 파일,
      이미지, JavaScript, CSS 등 정적 리소스가 위치함.
    • 웹 서버에서 클라이언트에게 직접 전달 될 수 있는 자원들을 담고 있는
      디렉토리
  • META-INF
    • JAR 또는 WAR 파일의 메타데이터를 저장하는 곳
    • 애플리케이션과 관련된 설정 파일이나 메타데이터를 담을 수 있음
  • WEB-INF
    • WEB-INF 는 웹 애플리케이션의 중요한 구성 요소를 담고 있으며, 외부에서
      직접 접근할 수 없는 보호된 영역.
    • 클라이언트가 직접 이 폴더 내의 파일에 접근할 수 없으며, 서블릿 컨테이너에
      의해 관리됨.
    • [ WEB-INF 의 하위 요소 ]
      • lib: 웹 애플리케이션에서 필요한 JAR 파일들을 저장하는 디렉토리로,
        프로젝트에서 사용할 외부 라이브러리나 API들이 포함될 수 있음.
      • web.xml
        • 정의
          • 배포 서술자(Deployment Descriptor)
          • Server가 켜지자마자 프로그램 파일 중 제일 처음 읽는 문서
          • 웹 애플리케이션의 설정을 정의
          • 서블릿 컨테이너가 애플리케이션을 어떻게 처리해야 하는지 알려줌
        • 내용
          • <welcome-file-list> : 메인페이지 목록
            • 메인 페이지로 사용할 파일명 목록

            • webapp 폴더에 파일이 생성해야함

            • 목록에 없으면 404 error

                <welcome-file-list>
                  <welcome-file>index.html</welcome-file>
                  <welcome-file>index.jsp</welcome-file>
                  <welcome-file>index.htm</welcome-file>
                  <welcome-file>default.html</welcome-file>
                  <welcome-file>default.jsp</welcome-file>
                  <welcome-file>default.htm</welcome-file>
                </welcome-file-list>

Servlet

정의

  • 웹 서비스를 위한 자바 클래스
  • javax.servlet.http.HttpServlet
  • 클라이언트의 요청(Request)을 처리 → 그 결과를 다시 클라이언트에게 응답(Response)하는 Servlet클래스의 구현 규칙을 지킨 자바 프로그래밍 기술.

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

등록

  • web.xml 파일에 서블릿 매핑을 명시(안 씀)
    • web.xml에 java 파일인 컨트롤러 클래스 직접 등록
        <!--  특정 클래스를 Servlet으로 등록하고 이름을 지정하는 태그 -->
        <servlet>
        	<!-- 등록할 Servlet을 지칭할 명칭 -->
        	<servlet-name>ex1</servlet-name>
        	
        	<!-- Servlet으로 등록할 클래스의 패키지명.클래스명 -->
        	<servlet-class>edu.kh.servlet.controller.ExampleController1</servlet-class>
        </servlet>
        
        <!-- 요청 주소를 처리할 Servlet 연결 -->
        <servlet-mapping>
        	<servlet-name>ex1</servlet-name>
        	
        	<!-- 연결할 요청 주소 -->
        	<url-pattern>/example1</url-pattern>
        </servlet-mapping>
    • Servlet이 직접 HTML 코드 작성하여 응답 (PrintWriter 사용)
      		// 서버 -> 클라이언트 응답 처리
      		
      		// 1) 서버에서 HTML 코드를 만들어
      		// 	  클라이언트에게 전달 == 응답(response)
      		
      		// 2) 클라이언트의 브라우저가
      		//    응답 받은 HTML 코드를 해석하여
      		//    화면에 출력해줌
      		
      		// 서버 -> 클라이언트 응답하기
      		// HttpServletResponse 객체 이용
      		
      		// 응답처리 1: 응답하는 문서의 형식과 문자 인코딩 지정
      		resp.setContentType("text/html; charset=UTF-8");
      		
      		// 응답처리 2: 서버 -> 클라이언트로 연결되는 출력용 스트림 얻어오기
      		PrintWriter out = resp.getWriter();
      		
      		// 응답처리 3: 출력할 HTML 코드 만들기
      		StringBuilder sb = new StringBuilder();
      		
      		sb.append("<!DOCTYPE html>");
      		sb.append("<html>");
      		sb.append("<head>");
      		sb.append("<title>서버 응답 페이지</title>");
      		sb.append("</head>");
      		
      		sb.append("<body>");
      		sb.append("<h1>응답페이지 입니다</h1>");
      		sb.append("<p>입력 받은 이름 : " + name + "</p>");
      		sb.append("<p>입력 받은 나이 : " + age + "</p>");
      		sb.append("</body>");
      		
      		sb.append("</html>");
      		
      		// 응답 처리 4: 출력 스트림을 이용해
      		//				클라이언트에게 HTML 코드 출력(응답)
      		out.write(sb.toString());
  • @WebServlet(Controller.java에 서블릿 등록)
    • @WebServlet("/hello") : HTML에서의 요청을 처리(form action=”/hello”)

    • extends HttpServlet : 서블렛 클래스 상속 밑 임포트

    • @Override doGet() : Get 요청 메서드

    • @Override doPost() : Post 요청 메서드

    • HttpServletRequest : 클라이언트가 보낸 요청 정보를 담고 있는 객체

      • 주소에 붙은 쿼리 스트링 (?name=kim)

      • 폼 데이터 (input, textarea)

      • 헤더, 쿠키, IP 주소, 요청 방식(GET/POST)

      • URI, URL 등등…

        String param = req.getParameter("name"); // 폼에서 넘어온 name 값
        String method = req.getMethod();         // "GET" or "POST"
        String uri = req.getRequestURI();        // "/hello"
        String context = req.getContextPath();   // "/myapp"
    • HttpServletResponse : 서버가 클라이언트에게 응답할 때 사용하는 객체
      - 콘텐츠 타입 설정 (HTML, JSON 등)
      - 문자 인코딩
      - 실제 출력 내용 (HTML, 문자열 등)
      - 쿠키 설정, 리다이렉트 등

      ```java
      rsp.setContentType("text/html;charset=UTF-8"); // 응답 타입 설정
      PrintWriter out = response.getWriter();             // 응답 스트림 얻기
      out.println("<h1>Hello!</h1>");                     // 클라이언트로 출력
      ```
      import jakarta.servlet.annotation.WebServlet;
      import jakarta.servlet.http.HttpServlet;
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      
      import java.io.IOException;
      
      @WebServlet("/hello")  // 이 서블릿은 /hello로 들어오는 요청을 처리함
      public class Hello extends HttpServlet {
      
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse rsp)
                  throws IOException {
          }
      }

메서드

  • getParameter() : 클라이언트가 보낸 단일 데이터(문자열) 받아옴
    • 인자값 : name 의 속성값을 가져옴

      String name = req.getParameter("inputName");
  • getParameterValues() : 여러 개의 값들(checkbox 등) 을 배열로 받아옴
    • 인자값 : 같은 name을 가진 값들을 받아옴

      String[] optionArr = req.getParameterValues("opt");
  • getRequestDispatcher() : RequestDispatcher(인터페이스)를 얻어옴
    • RequestDispatcher : 응답을 JSP나 다른 서블릿으로 넘기기 위한 객체

    • 인자값 : 경로(webapp 폴더 기준)

      RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/result.jsp");
  • forward() : 현재 요청/응답을 JSP로 넘김
    • 인자값
      - req : HttpServletRequest 객체
      - resp : HttpServletResponse 객체

      dispatcher.forward(req, resp);
  • setContentType() : MIME 타입과 문자 인코딩을 설정(JSP는 안씀)
    • 인자값 : "text/html; charset=UTF-8”

      resp.setContentType("text/html; charset=UTF-8");
  • getWriter() : 클라이언트에게 텍스트(HTML 등)를 직접 출력할 수 있는 출력 스트림을 반환(JSP는 안씀)
    PrintWriter out = resp.getWriter();
    out.write("<h1>응답페이지</h1>");

JSP(Java Server Page)

정의

  • JAVA코드가 들어가 있는 HTML 코드(<% %> 또는 <%= %>)
  • Java의 웹 서버 프로그램 스펙(서블릿)으로 변환되어 서비스 됨

스크립팅 원소

  • 선언문(declaration)
    <%! 자바코드 %>
  • 스트립틀릿(scriptlet)
    <% 자바코드 %>
  • 출력식, 표현식(expression)
    <%= 자바코드 %>

GET / POST

구분GETPOST
목적데이터를 조회할 때 사용데이터를 서버에 전송할 때 사용
데이터 전송 방식URL의 쿼리 문자열로 전송HTTP 요청의 본문(body)으로 전송
보안URL에 데이터가 노출되므로 민감한 정보 전송에 부적합본문에 데이터를 담아 전송하므로 비교적 안전
전송 데이터 크기URL 길이 제한이 있음
(브라우저마다 다름)대용량 데이터 전송 가능
캐싱브라우저가 요청을 캐싱할 수 있음(ex. 즐겨찾기, 북마크)캐싱되지 않음
사용 예시검색, 조회로그인, 회원가입, 파일 업로드 등
  • 캐싱 : 한번 접근 후, 또 요청할 시 빠르게 접근하기 위해 데이터를 저장시켜 놓는 것
  • GET방식 : 가져오다, 얻어오다
    • URL에 변수(데이터) 노출 O
    • 보안 유지 안함 (로그인에 부적합)
  • POST방식 : 부치다.
    • URL에 변수(데이터)를 노출 O
    • 데이터를 HTTP Body에 포함하여 전송
    • 데이터를 서버로 제출하여 추가 또는 수정하기 위해 데이터를 전송하는 방식

0개의 댓글