-
44일차 - 자바 웹 개발AI 솔루션 개발자과정(Java, Python) 2022. 12. 8. 17:12
프로그램의 발전 과정
일반적인 웹 페이지는 대부분 미리 서버에 등록해 두었다가 웹 브라우저가 서버에 특정 데이터를 요청하면 이를 웹 브라우저로 전송해서 보여준다.
이를 가능하게 하는 기술 중 하나가 JSP(Java Server Page)이다.
웹 프로그램은 클라이언트 PC 기반 프로그램에서 시작하여 클라이언트 서버 기반 프로그램, 웹 기반 프로그램 순으로 진화해 왔다.
클라이언트 PC 기반 프로그램이란 클라이언트 PC에서 클라이언트가 직접 설치해서 사용하는 프로그램이다.
이 프로그램의 단점은 보안에 취약하고, 프로그램이 변경될 때 마다 일일이 다시 설치해야 한다.
이러한 문제점을 보완하여 나온 것이 클라이언트 - 서버 기반 프로그램이다.
이 구조에서는 기존 클라이언트가 수행하는 모든 기능을 서버에서 수행한다.
클라이언트는 처리할 데이터를 네트워크를 통해 서버에 전달, 서버가 처리한 결과를 네트워크를 통해 다시 받아 결과를 화면에 출력하는 역할만 한다.
클라이언트 - 서버 기반 프로그램은 기능(로직)이 변경되어도 모두 서버에서 처리하면 되기 때문에 클라이언트 프로그램을 수정할 필요가 없다.
중요한 기능은 서버에서 처리하므로 클라이언트 PC 기반 프로그램보다 데이터 보안 측면에서도 우수하다.
하지만 클라이언트 - 서버 기반 프로그램도 한계가 존재한다. 변경된 기능(로직)을 사용자가 사용할 수 있도록 하기 위해서 클라이언트 프로그램도 수정해야 하기 때문이다.
클라이언트 PC 기반 프로그램보다 데이터 처리 관점에서는 우수하지만, 여전히 화면 변경 시에는 여전히 추가 작업이 필요하다.
그 다음 나온 것이 웹 기반 프로그램이다.
웹 기반 프로그램의 클라이언트는 자신이 사용하는 클라이언트 프로그램을 직접 설치하는 것이 아니라, 사용자 컴퓨터의 웹 브라우저를 통해 화면에 해당되는 HTML 문서를 서버에 요청한다. 그러면 서버에서는 요청받은 HTML 문서를 브라우저에 전송하여 해당 기능을 담당하는 화면을 보여준다.
즉 웹 기반 프로그램의 경우 사용자가 사용하는 프로그램의 기능이나 화면이 바뀌면 서버에서 모두 처리한다.
클라이언트 - 서버 기반 프로그램과 마찬가지로 클라이언트가 특별히 수행해야 할 작업이 없다.
그리고 모든 기능을 서버에서 처리하므로 보안 면에서도 월등히 우수하다.
웹 기반 프로그램은 관리하기 용이할 뿐만 아니라 보안 면에서도 탁월하여 널리 사용되고 있다.
여기서 한발 더 나아가 JSP나 ASP, PHP같은 웹 기술을 더하고 데이터베이스 연동 기능을 추가한다면 실시간으로 클라이언트의 요청을 처리할 수도 있다.
JSP가 나오기 전에도 웹 브라우저를 통해 웹 페이지를 보여주는 기능은 있었다.
아파치(Apache) 같은 웹 서버를 이용해서 웹 페이지들을 브라우저에 표시하는 방식이 있었다.
이러한 방식을 정적(static)웹 프로그래밍이라 한다.
정적 웹 프로그래밍은 웹 서버에 미리 보여줄 HTML 페이지, CSS, 이미지, 자바스크립트 파일을 저장해 놓고 브라우저에서 요청할 경우 그대로 전달하는 방식이다.
따라서 사용자는 페이지가 변경되지 않는 한 고정된 웹 페이지를 보게 된다.
요즘에는 이 방식은 거의 사용되지 않지만, 정적 웹 프로그래밍 구성 요소는 JSP에서도 여전히 화면 디자인과 기능 처리를 담당하므로 알아두어야 한다.
정적 웹 프로그래밍의 특징은 다음과 같다.
* 사용자에게 화면 디자인 같은 고정된 정보만 제공한다.
* 정보 수정 시 관리자가 직접 HTML 소스를 수정하여 사용자에게 제공한다.
웹 서버 : 각 클라이언트에게 서비스를 제공하는 컴퓨터
클라이언트 : 네트워크로 서버에 접속한 후 서버로부터 서비스를 제공받는 컴퓨터
HTTP 프로토콜 : www 서비스를 제공하는 통신 규약, 웹 서버와 클라이언트는 이를 이용해 정보를 주고 받는다.
HTML : www 서비스를 제공하기 위한 표준 언어
자바스크립트 : HTML 웹 페이지의 여러 가지 동적인 기능을 제공하는 스크립트 언어
CSS : HTML 문서에 문서에서 서체나 색상, 정렬 등 HTML 페이지에 관련된 여러 가지 기능을 제공한다.동적 웹 프로그래밍은 관리자가 하던 역할을 웹 애플리케이션 서버가 수행한다.
데이터베이스에 클라이언트의 요청이 있을 때마다 데이터베이스에 접근하여 실시간 정보를 클라이언트에게 제공한다.
최근에는 빠르게 변하는 사용자들의 요구를 만족시키고자 이처럼 동적으로 기능을 처리하는 방식으로 웹 프로그래밍을 수행한다.
처음 동적인 방식의 프로그램을 제공하는 기능은 CGI(Common Gate Interface)였다.
프로그래밍 언어인 펄(perl)이 대표적인 CGI 프로그래밍 언어이다.
CGI방식의 대표적인 특징은 다음과 같다.
* 초기 웹 프로그램에서 사용하는 방식이다.
* 프로세스 방식으로 실행된다.
* 서버의 부하가 심하다.
CGI방식은 웹 애플리케이션 서버에서 실행되는 기능들이 모두 프로세스(process)방식으로 실행된다.
클라이언트가 정보를 요청하면 웹 애플리케이션 서버는 정보를 처리할 프로세스를 메모리에 생성한다.
그리고 데이터베이스와 연동하여 클라이언트에게 정보를 반환한다.
CGI방식은 같은 기능을 수행하더라도 각 경우에 대해 처음부터 메모리에 기능을 로드(load)하여 수행한다.
하지만 요즘처럼 인터넷 환경이 발전하고 사용자 수가 급격히 늘어나 동시에 처리해야 할 일이 많은 상황에서 이런 방식으로 서비스한다면 메모리에 과부하가 걸려 기능 수행에 어려움이 생긴다.
이러한 CGI의 문제점을 개선하여 나온 것이 바로 JSP, ASP, PHP와 같은 동적 웹 프로그래밍 기술이다.
JSP는 기본적으로 스레드(thread)방식으로 실행하기 때문에 CGI방식보다는 효율적으로 기능을 수행한다.
클라이언트가 서버에 요청을 보내면 서버는 요청을 처리할 기능을 최초로 메모리에 로드하면, 이후 요청되는 동일한 기능은 기존에 사용한 기능을 재사용한다.
웹 애플리케이션이란 말 그대로 기존의 정적인 웹 애플리케이션의 기능을 그대로 사용하면서, 서블릿(Servlet), JSP, 자바 클래스들을 추가하여 사용자에게 동적인 서비스를 제공하는 프로그램이다.
서블릿이란 자바로 만든 CGI프로그램을 말한다.
이 서블릿의 단점을 보완해서 나온 것이 JSP이다.
서블릿은 서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바클래스이다.
서블릿은 자바로 작성되어 있으므로 자바의 일반적인 특징을 모두 가진다.
하지만 서블릿은 일반 자바 프로그램과 다르게 독자적으로 실행되지 못하고 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다는 점에서 차이가 있다.
서블릿은 서버에서 실행되다가 웹 브라우저에서 요청을 하면 해당 기능을 수행한 후 웹 브라우저에 결과를 전송한다. 서버에서 실행되기 때문에 보안과 관련된 기능도 훨씬 안전하게 수행할 수 있다.
서블릿의 동작과정은 다음과 같다.
클라이언트가 웹 서버에 요청을 보낸다. -> 웹 서버는 톰캣과 같은 웹 애플리케이션 서버(WAS)에 위임한다. -> WAS는 각 요청에 해당하는 서블릿을 실행한다. -> 서블릿은 결과를 반환하여 WAS에 전달하고, WAS는 웹 서버로, 웹 서버는 클라이언트에게 전송한다.
서블릿은 다음과 같은 특징이 있다.
* 서버 쪽에서 실행되면서 기능을 수행한다.
* 기존의 정적인 웹 프로그램의 문제점을 보완하여 동적인 여러 기능을 제공한다.
* 스레드 방식으로 실행된다.
* 자바로 만들어져 자바의 특징(객체 지향)을 가진다.
* 컨테이너에서 실행된다.
* 컨테이너 종류에 상관없이 실행된다(플랫폼 독립적).
* 보안 기능을 적용하기 쉽다.
* 웹 브라우저에서 요청 시 기능을 수행한다.
서블릿 API 계층 구조와 기능
서블릿은 자바로 만들어졌으므로 당연히 클래스들 간의 계층 구조를 가진다.
서블릿 API는 Servlet과 ServletConfig 인터페이스를 구현해 제공하며 GenericServlet 추상 클래스가 이 두 인터페이스의 추상 메서드를 구현한다.
그리고 이 GenericServlet을 다시 HttpServlet이 상속받는다.
GenericServlet은 일반적인 여러 통신 프로토콜에 대한 클라이언트/서버 프로그램에서 서블릿 기능을 구현하는 클래스이다.
서블릿 API 기능
서블릿 구성 요소 기능 Servlet 인터페이스 * javax.servlet 패키지에 선언되어 있다.
* Servlet 관련 추상 메서드를 선언한다.
* init(), service(), destroy(), getServletInfo(), getServletConfig() 를 선언한다.ServletConfig 인터페이스 * javax.servlet 패키지에 선언되어 있다.
* Servlet 기능 관련 추상 메서드가 선언되어 있다.
* getInitParameter(), getInitParameterNames(), getServletContext(), getServletName()이 선언되어 있다.GenericServlet 클래스 * javax.servlet 패키지에 선언되어 있다.
* 상위 두 인터페이스를 구현하여 일반적인 서블릿 기능을 구현한 클래스이다.
* GenericServlet을 상속받아 구현한 사용자 서블릿은 사용되는 프로토콜에 따라 각각 service()를 오버라이딩해서 구현한다.HttpServlet 클래스 * javax.servlet.http 패키지에 선언되어 있다.
* GenericServlet을 상속받아 HTTP 프로토콜을 사용하는 웹 브라우저에서 서블릿 기능을 수행한다.
* 웹 브라우저 기반 서비스를 제공하는 서블릿을 만들 때 상속받아 사용한다.
* 요청 시 service()가 호출되면서 요청 방식에 따라 doGet()이나 doPost()가 차례대로 호출된다.HttpServlet의 주요 메소드
메서드 기능 protected doDelete (HttpServletRequest req,
HttpServletResponse resp)서블릿이 DELETE request를 수행하기 위해 service()를 통해서 호출된다. protected doGet (HttpServletRequest req,
HttpServletResponse resp)서블릿이 GET request를 수행하기 위해 service()를 통해서 호출된다. protected doHead (HttpServletRequest req,
HttpServletResponse resp)서블릿이 HEAD request를 수행하기 위해 service()를 통해서 호출된다. protected doPost (HttpServletRequest req,
HttpServletResponse resp)서블릿이 POST request를 수행하기 위해 service()를 통해서 호출된다. protected service (ServletRequest req,
ServletResponse resp)request를 public service()에서 전달받아 doXXX() 메서드를 호출한다. public service (ServletRequest req,
ServletResponse resp)클라이언트의 request를 protected service()에게 전달한다. 서블릿의 생명주기 메서드
서블릿도 자바 클래스이기 때문에 실행하면 초기화 과정을 진행하고, 메모리에 인스턴스를 생성하여 서비스를 수행한 후 다시 소멸하는 과정을 거친다.
이런 단계를 거칠 때 마다 서블릿 클래스의 메서드가 호출되어 초기화, 데이터베이스 연동, 마무리 작업을 수행한다. 각 과정에서 호출되어 기능을 수행하는 메서드들이 서블릿 생명주기 메서드이다.
따라서 서블릿 생명주기 메서드란 서블릿 실행 단계마다 호출되어 기능을 수행하는 콜백 메서드를 말한다.
생명주기 단계 호출 메서드 특징 초기화 init() * 서블릿 요청 시 맨 처음 한 번만 호출된다.
* 서블릿 생성 시 초기화 작업을 주로 수행한다.작업 수행 doGet()
doPost()* 서블릿 요청 시 매번 호출된다.
* 실제로 클라이언트가 요청하는 작업을 수행한다.종료 destroy() * 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출된다.
* 서블릿의 마무리 작업을 주로 수행한다.서블릿은 다음과 같은 동작 과정을 가진다.
1. 클라이언트1이 요청하면 FirstServlet이 메모리에 로드되어있는지 확인한다.
2. init() 메서드를 호출하여 FirstServlet 인스턴스를 메모리에 로드한다.
3. doGet()이나 doPost() 메서드를 호출하여 서비스를 한다.
4. 클라이언트2가 동일한 서블릿을 요청한다면 다시 FirstServlet이 메모리에 로드되어 있는지 확인한다.
5. 이번에는 메모리에 있는 것이 확인되면 바로 doGet()이나 doPost() 메서드를 호출하여 서비스한다.
서블릿은 메모리에 존재하는 서블릿을 재사용함으로써 훨씬 빠르고 효율적으로 동작한다.
여러 서블릿을 설정한다면 복잡해진다는 단점이 있다.
이때 각 서블릿 클래스에 기호(@)를 이용해서 서블릿 표시를 해주면 훨씬 가독성이 좋아진다.
이처럼 소스 코드에 직접 기능을 설정하는 방법을 어노테이션(annotation)이라고 한다.
어노테이션을 이용해 서블릿 매핑을 하려면 @WebServlet을 이용하면 된다.
어노테이션이 적용되는 클래스는 반드시 HttpServlet 클래스를 상속받아야 한다.
'AI 솔루션 개발자과정(Java, Python)' 카테고리의 다른 글
46일차 - 자바 웹 개발(3) (0) 2022.12.12 45일차 - 자바 웹 개발 (2) (2) 2022.12.09 43일차 - 도커와 웹 사이트 배포하기 (0) 2022.12.07 42일차 - 장고 프로젝트(6) (0) 2022.12.06 41일차 - 장고프로젝트 (5) (0) 2022.12.05