티스토리 뷰
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://www.convertstring.com/ko/EncodeDecode/UrlEncode 사이트를 통해 예약어를 인코딩할 수 있다.
- IntelliJ 단축키
- sout + enter : System.out.println();
- psvm + enter : public static void main 메서드 작성
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
#패스트캠퍼스 #포트폴리오 #직장인자기계발 #환급챌린지 #포트폴리오챌린지 #패스트캠퍼스후기 #초격차패키지 #오공완
728x90
반응형
'Study > FastCampus' 카테고리의 다른 글
[Java Project] Part 1. 나만의 MVC 프레임워크 만들기 - DB 커넥션 풀 (0) | 2023.08.17 |
---|---|
[Java Project] Part 1. 나만의 MVC 프레임워크 만들기 - JDBC 프로그래밍 (0) | 2023.08.16 |
[Java Project] Part 1. 나만의 MVC 프레임워크 만들기 - 웹 애플리케이션2 (0) | 2023.08.14 |
[Java Project] Part 1. 나만의 MVC 프레임워크 만들기 - 웹 애플리케이션 (0) | 2023.08.13 |
[Java Project] Part 1. 나만의 MVC 프레임워크 만들기 - 학점계산기, 음식주문 (0) | 2023.08.12 |
댓글