본문 바로가기

Programming/국비학원

220920 - 서버 - 웹 애플리케이션 개발 환경 구축

더보기
서버 관련 개념 및 용어 정리

※ Web Application : 웹에서 실행되는 응용프로그램

사용자가 필요한 요청(Request)을 하고, 서버에서는 요청 수행 후 요청한 데이터를 응답(Response)함

 

※ Web Browser : 클라이언트에서 요청을 하고 전달받은 페이지를 볼 수 있는 환경

ex) 크롬, IE, Safari, Firefox 등

 

 

 

 

  • Web Server

: 정적인 페이지(HTML, CSS)를 제공하는 서버

 

HTTP 프로토콜 레벨의 서비스를 제공

동적인 컨텐츠 제공을 위해 WAS로 클라이언트의 요청을 전달하고 처리한 결과를 클라이언트에게 응답하는 역할도 수행 (프록시 역할도 수행)

 

ex)  Apache, Nginx, IIS, WebtoB 등

 

 

 

 

  • WAS(Web Application Server)

: DB 조회나 로직 처리를 요구하는 동적 컨텐츠를 제공하는 서버

 

강력한 동적 웹 서비스를 제공

EJB 통해 비지니스 레벨의 서비스 제공

데이터베이스 연결 (WAS 뿐만 아니라 톰캣 등 웹 컨테이너에서도 가능)
Java EE (EJB, JMS, CDI, JTA, 서블릿 API) 의 전체를 지원

 

ex) IBM WebSphere, Oracle WebLogic, Glassfish, JBoss

 

 

 

 

 

 

  • Servlet

: 웹페이지를 동적으로 생성하기 위해 서버측 프로그램

: 동적 웹페이지를 만들 때 사용되는 자바 기반 웹 애플리케이션 프로그래밍 기술
: 서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적인 서비스 제공하는 자바 클래스

 

ex) Spring MVC

 

자바 언어 기반이며, WAS 위에서 컴파일되고 동작함


웹 요청, 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있도록 함

이후 서블릿 문제점 보완하여 JSP 나옴

(서블릿 => 자바 코드 안에 HTML 코드 포함

JSP => HTML 코드 안에 자바코드 포함)

 

JAVA의 스레드를 이용하여 동작
MVC패턴에서 컨트롤러로 이용됨
컨테이너에서 실행

 

 

  •  

 

 

 

 

  • 동작 과정

1. 브라우저(Client)에서 기본 웹 페이지 요청 (index.html)
2. 사용자가 입력폼에 맞게 값을 입력후 전송 -> 서블릿을 요청(Request) 함
3. WAS 에서 서블릿컨테이너가 서블릿 요청을 인식하여 서블릿을 호출
4. 서블릿은 스레드를 기동하여 해당 서블릿 객체를 생성하여 이를 수행 함
5. 서블릿 객체의 작업이 종료되면 기동되었던 스레드가 종료 됨
6. 서블릿 수행 결과(Response)가 웹 서버에 전달
7. 웹 서버는 결과를 클라이언트의 웹 브라우저에 전송 함

 

 

1. 클라이언트 요청
2. HttpServletRequest, HttpServletResponse 객체 생성
3. Web.xml이 어느 서블릿에 대해 요청한 것인지 탐색
4. 해당하는 서블릿에서 service() 메소드 호출 
5. doGet() 또는 doPost() 호출 
6. 동적 페이지 생성 후 ServletResponse 객체에 응답 전송
7. HttpServletRequest, HttpServletResponse 객체 소멸

 

 

 

  • 라이프 사이클

1. Instance 생성 - 서블릿 객체 생성
2. init() - 서블릿이 처음으로 요청될 때 초기화하는 메소드 / 최초로 한번만 호출
3. doGet() 혹은 doPost() - 요청될 때마다 호출 / 클라이언트가 요청하는 작업 수행
4. destroy() - 서블릿 종료되어 메모리에서 삭제될 때 호출

 

 

 

 

  • Web Container

:  동적인 데이터들을 처리하여 정적인 페이지로 생성해주는 소프트웨어 모듈

 

아파치 => CGI (Common Gateway Interface, 웹 서버와 외부 프로그램 사이에서 정보를 주고 받는 방법) 지원
하지만 JAVA는 CGI 적용 불가 => CGI와 같은 기능을 위해 컨테이너를 필요로 함

 

 

 

  • 서블릿 컨테이너

: 서블릿들을 모아서 관리하고 웹 서버와 소켓으로 통신하는 컨테이너

 

ex) 톰캣

 

구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿 관리

 

클라이언트에서 요청

-> 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성

-> post, get여부에 따라 동적인 페이지를 생성하여 응답 보냄 (오직 서블릿 API 만 지원)

 

기능

1. 서블릿 생명주기 관리
서블릿 컨테이너가 기동되는 순간 서블릿 클래스를 로딩해서 인스턴스화 -> 초기화 메서드 호출 -> 요청 시 적절한 서블릿 메서드 찾아 동작시킴 -> 서블릿 삭제 시 가비지 컬렉션을 통해 메모리에서 제거

2. 통신 지원
클라이언트의 Request를 받아주고 Response를 보낼 수 있게 웹 서버와 소켓을 만들어서 통신함 (소켓을 만들고, 특정 포트를 리스닝하고, 연결 요청이 들어오면 스트림을 생성해서 요청을 받음)

=> 개발자가 비즈니스 로직에 집중하도록 도움

3. 멀티스레딩 관리
서블릿의 요청이 들어오면 스레드를 생성해서 작업 수행

동시에 여러 요청이 들어와도 멀티스레딩 환경으로 동시다발적인 작업 관리

한번 메모리에 올라간 스레드는 다시 생성할 필요가 없기에 메모리 관리에 효율적

4. 선언적인 보안관리
=> 서블릿 또는 자바 클래스 안에 보안 관련 메소드 구현하지 않아도 됨

 

 

 

 

  • APACHE TOMCAT

=> 서블릿 엔진 혹은 웹 컨테이너(서블릿 컨테이너)

 

서블릿, JSP를 위한 런타임 환경을 제공

관리툴 또는 XML 파일 편집 통해 설정 변경 가능

HTTP 서버도 자체 내장

WAS가 가져야 하는 EJB 등의 기술이 적용되어 있지 않기 때문에 엄밀히 말하면 WAS는 아님 (WAS로 분류되기도 함)

 

※ EJB (Enterprise Java Bean)

: 트랜잭션 등 엔터프라이즈 (기업) 환경에서 사용하는 컴포넌트 기술

 

개발자가 비지니스 로직에만 집중하도록 지원

현재는 Spring이 해당 역할 수행함

 

 

 

  • JSP (Java Server Pages)

: html 코드에 java 코드를 넣어 동적 웹페이지를 생성하는 웹 애플리케이션 도구

 

서블릿 단점 보완하기 위한 서블릿 기반의 스크립트 기술

=> HTML 내부에 JAVA 소스 코드가 들어가 HTML 코드 작성하기 간편

 

JSP 실행 시 서블릿으로 변환됨 -> WAS에서 동작, 기능 수행 -> 데이터를 클라이언트로 응답

 

 

1. 클라이언트가 아이디, 패스워드 입력 => hello.jsp 요청

2. JSP 컨테이너가 JSP 파일 읽음

3. JSP 컨테이너가 변환(generate) 작업을 통해 서블릿 파일( .java ) 생성

4. .java 파일은 다시 .class 파일로 컴파일됨

5. 실행(execute) 시 HTML 파일 생성, JSP 컨테이너에 전달

6. JSP는 HTTP 프로토콜을 통해 HTML 페이지를 클라이언트에게 전달

 

 

  • MVC 패턴의 서블릿, JSP

서블릿 => 컨트롤러 (요청, 응답 처리)

JSP => 뷰 (결과 화면 출력)

 

위와 같이 MVC 모델에서 역할을 나누어 사용하는 경우 많음

 

 

 

 

개발환경 구축

1. JDK 설치
2. JDK  환경변수 지정
3. 톰캣 컨테이너 설치 (웹서버)
4. 웹(JSP) 개발도구 - 이클립스 설치
5. 비주얼스튜디오 코드 설치 - 프론트소스 변경작업
6. Oracle DBMS 설치

 

 

 

 

웹 애플리케이션 기본 구조

웹 애플리케이션 폴더/WEB-INF/classes & lib & web.xml

1. 웹 애플리케이션의 루트 디렉터리 생성
2. WEB-INF : 웹 애플리케이션의 정보가 저장되는 곳
3. classes : 웹 애플리케이션에서 수행하는 서블릿, 클래스
4. lib : 라이브러리들 (jar 파일 저장되는 곳) => db 연동, 프레임워크(spring)
5. web.xml : 환경설정 파일

 

 

 

 

1. 톰캣 컨테이너에 개발한 웹 애플리케이션 등록
  • 1. 컨테이너 디렉터리에 앱 저장

tomcat10/webapps 에 웹앱 폴더 붙여넣기

=> http://127.0.0.1:8080/폴더/index.html

 

 

 

  • 2. server.xml에 직접 웹앱 등록

C드라이브에 웹앱 폴더 붙여넣기

C:\tomcat10\conf\server.xml 에 컨텍스트 코드 추가
=>  <Context path="/컨텍스트(웹프로젝트)이름" 
docBase="실제 개발된 웹앱 디렉터리(WEB-INF 폴더 포함)"
reloadable="true"/>

=> http://127.0.0.1:8080/폴더/index.html

 

 

context

톰캣이 인식하는 한 개의 웹 어플리케이션

 

 

 

 

2. 이클립스에서 톰캣 연결

이클립스 - new - dynamic web project (generate web.xml)

webapp 폴더에 index.html 추가

(설정 변경 => window-preferences-web-htmlfiles/jsp/css-encoding- utf-8)

하단 SERVER 창 - 문구 클릭 - tomcat server10 연결
우클릭 - add and remove - configure

 

=> http://127.0.0.1:8080/폴더/index.html

 


※ 서버 셧다운 소켓을 생성하지 못했습니다 오류

톰캣 서버 포트가 http 포트와 일치해서 발생한 오류였음

=> 다른 포트 번호로 변경시 해결

※ 이전에 server.xml에 추가한 context 태그 삭제

 

 

 

 

배치 (deploy)

: 개발한 웹앱 전체를 실제로 서비스하는 톰캣으로 이동시켜 실행
=> 웹앱을 실제로 서비스

 

 

export- web - war file

tomcat.exe 실행 -> C:\tomcat10\webapps 에 웹앱 폴더 생성됨

 

 

 

 

서블릿
  • 새 프로젝트 생성

프로젝트 우클릭 - build path - configuration~ - library - classpath - add external jars (tomcat10/lib/servlet-api.jar)

src/main/java - new class 

 

 

 

  • FirstServlet.java 

=> source - override - doGet(), destroy(), init() 오버라이드

 

 

import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//요청, 응답 값 전달
		
		System.out.println("doGet 메소드 호출됨");

	}

	@Override
	public void destroy() {
	//서블릿 제거
		
		System.out.println("destroy 메소드 호출됨");

	}

	@Override
	public void init() throws ServletException {
	//초기화 작업 //서블릿이 서비스에 배치되고 있음을 나타냄

		System.out.println("init 메소드 호출됨");

	}

}

 

 

※ HttpServletRequest, HttpServletResponse

: 서블릿과 클라이언트 사이를 연결해주는 중요한 객체

 

HttpServletReqeust => 클라이언트로부터 전달되는 사용자 정보들을 처리하기 위한 메소드 제공

 

HttpServletResponse => 서버에서 클라이언트에 응답하기 위한 메소드 제공

 

doget() : 데이터를 get 방식으로 전송하면 자동으로 호출 되는 메소드

=> id, 비밀번호 등 요청값을 HttpServletRequest 객체에 담음

-> WAS는 데이터베이스 검증 거쳐 결과값(응답값)을 HttpServletResponse 객체에 담아 클라이언트에 전달

 

 

※ 데이터 전송 방식

GET
쿼리 스트링(URL 매핑이름 뒤 ?name=value  형식으로 데이터 입력)으로 데이터 전송

데이터가 여러 개일 경우 &로 묶음
데이터 검색 및 자원 재사용 시 사용
데이터 크기의 한계 있으며, 보안에 취약

 

POST
TCP/IP 프로토콜 데이터의 HEAD 영역에 숨겨 데이터 전송

데이터 크기에 제한이 없음
HTTP 헤더에 포함되어 get 방식보다 보안성 높음

get 방식보다 느린 속도