티스토리 뷰

728x90
반응형

오늘은 CGI 프로그램과 서블릿에 대하여 학습하고 서블릿 구현 실습을 하려고 한다.

1. CGI와 서블릿

1) CGI (Common Gateway Interface)

  • 웹 서버가 애플리케이션과 데이터를 주고받을 때 사용되는 규칙
  • CGI 프로그램은 CGI 규칙에 따라 데이터를 주고받는 프로그램이다.
  • c, c++, java 등 컴파일 언어뿐만 아니라 php, python 등 스크립트 언어(인터프리터 방식)로도 작성이 가능하다.

 

2) 인터프리터 방식

  • 웹 서버는 스크립트 엔진(script engine)을 실행시키고, 스크립트 엔진은 스크립트 파일을 해석해 웹서버에 결과값을 return 한다.

  • 서블릿과 서블릿 컨테이너에도 동일하게 CGI 규칙이 적용된다.
  • 개발자는 더이상 서블릿과 서블릿 컨테이너 사이에 사용되는 CGI 규칙을 알 필요가 없어졌지만,
  • 서블릿 컨테이너와 서블릿 파일 사이의 규칙을 알아야 한다.

 

3) Servelt

  • 자바 기반의 웹 애플리케이션을 만드는 프로그래밍 기술이며,
  • 동적인 웹 페이지를 구성하기 위한 표준이라고 생각할 수 있다.

 

4) Servelt Container

  • 엔진과 컨테이너의 차이는 Life Cycle을 관리하는 역할을 하는가의 차이이다.
  • 즉, 서블릿 컨테이너는 서블릿의 라이프 사이클(생성~소멸)을 관리하는 역할을 맡는다.
  • 웹 서버와 소켓을 만들고 통신하는 과정을 처리한다.
  • 서블릿 객체를 싱글톤으로 관리한다. (싱글톤: 인스턴스 하나만 생성하여 공유)
  • 따라서 상태를 유지하게(stateful) 설계하면 안 된다.
  • 또한 스레드가 안정적이지(Thread safety) 않다.

 

5) WAS와 서블릿 컨테이너

  • WAS와 서블릿 컨테이너는 거의 유사하며 서블릿 컨테이너가 WAS에 포함하는 개념으로 볼 수 있다.
  • 앞서 구현해 보았던 것처럼 WAS는 요청이 올 때마다 스레드 풀에서 기존 쓰레드를 꺼내 사용한다.
  • 주요 튜닝 포인트는 최대 쓰레드 수이다.
  • 대표적으로는 톰캣이 있다.

2. Counter 예제

  • 서블릿 객체는 싱글톤으로 관리되고 상태를 유지하게 설계하면 안 된다는 부분을 예제를 통해 공부해 보면 좋다.
  • 구현할 Counter는 쓰레드이며 Runnable 구현체이다.
  • 상태값을 통해 현재 상태를 확인하여 stable 하지 않도록 설계해야 한다.
  • 멀티스레드 환경에서 하나의 자원을 공유하게 되면 원치 않는 결과가 나올 수 있다.
    • RaceCondition (여러 프로세스 혹은 스레드가 동시에 하나의 자원에 접근하기 위해 경쟁하는 상태)
  • 동기화를 통해 문제를 해결할 수 있다. synchronized
public void run() {
	synchronized (this) {
        this.increment();
        System.out.println("value for Thread " + Thread.currentThread().getName() + " " + this.getValue()); //1
        this.decrement();
        System.out.println("value for Thread " + Thread.currentThread().getName() + " " + this.getValue()); //0
	}
}

 

3. 계산기 서블릿 만들기

(1) Servlet 인터페이스

  • 서블릿 인터페이스는 호출 규약이다.
  • 서블릿 인터페이스에 있는 메소드들을 서블릿 컨테이너(톰캣)가 호출한다.
  • 서블릿 생명주기(life cycle)와 관련된 메소드
    • init() : 컨테이너가 서블릿 생성 후 초기화 작업을 위해 호출되는 메소드 (처음 한번 호출됨)
    • service() : 클라이언트 요청이 들어올 때마다 컨테이너가 호출하는 메소드
    • destroy() : 컨테이너가 종료될 때 호출하는 메소드
  • 서블릿 기타 메소드
    • getServletConfig() : 서블릿 초기 설정 정보를 담는 객체를 반환 (이름, 변수 값 등이 있음)
    • getServletInfo() : 서블릿 작성자, 버전, 저작권 등의 정보를 반환

 

(2) 계산기 서블릿 실습

  • Servlet > GenericServlet > HttpServlet 의 과정을 통해 구현 실습
  • 앞서 구현된 웹 프로젝트 환경 구성에서 만들었던 프로젝트와 계산기 프로그램 패키지를 가져온다.
  • CalculatorServlet class를 생성한다. 이 때 Servlet을 implement 해준다.
  • @WebServlet("/path") 어노테이션은 path가 들어왔을 때 서블릿이 실행되게 한다.
  • HTTP Request 파일을 생성하여 요청을 보내 테스트를 할 수 있다.
  • service 메서드 아래 피연산자1, 연산자, 피연산자2를 request로부터 받고, Calculator.calculate 메서드를 통해 계산된 result를 response.getWriter()를 활용하여 넘겨준다. -> GET http://localhost:8080/calculate?operand1=20&operator=-&operand2=10 이 주어졌을 때 10이라는 계산값을 받을 수 있다.
  • Servlet 단계에서는 서블릿 메서드 5가지를 모두 구현해주어야 한다.
  • GenericServlet 에서는 service 메서드만 구현하면 된다. 즉, 다른 메서드는 필요한 것만 Override 해주면 된다.
  • HttpServlet 에서는 GET 요청이 왔을 때, doGet을 호출하여 그 아래 구현하면 된다. 즉 요청마다 메서드를 구현해야 한다.
  • HttpServlet는 GenericServlet 의 service 메서드가 세분화된 것이라고 생각할 수 있다.

 

(3) URL 인코딩 (= 퍼센트 인코딩)

  • URL로 사용할 수 없는 문자에는 예약어, Non-ASCII 문자(한글) 등이 있다.
  • 이러한 문자들을 사용할 수 있도록 하는 것이 URL 인코딩이다.
  • 예약 문자(예약어)에는 !, *, ', (, ), + 등이 있다.

출처 https://ko.wikipedia.org/wiki/퍼센트_인코딩

 

  • IntelliJ 단축키
    • sout + enter : System.out.println();
    • psvm + enter : public static void main 메서드 작성

 


 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://bit.ly/43z0P6S

 

 

#패스트캠퍼스 #포트폴리오 #직장인자기계발 #환급챌린지 #포트폴리오챌린지 #패스트캠퍼스후기 #초격차패키지 #오공완

728x90
반응형
댓글