JSP/Servlet 개념
Java와 Front-end(Javascript, React)를 조금 배우고 나니 어떻게 프론트 엔드와 백엔드가 작동하는지가 궁금해졌다.
그래서 찾아보니 JSP와 Servlet의 개념을 배워야 될 필요성을 느꼈다.
일단 웹 사이트가 어떻게 동작하는지 큰 그림을 그리고 가자. 아래의 그림을 참고하자.
설명을 하자면 클라이언트가 HTML에서 Form형태로 서버에 데이터를 전달한다.(Request)
그리고 전달되어진 데이터들은 WAS(Web Application Server)에 도달한다.(주로 Tomcat을 이용)
WAS내에는 Container + Thread + Servlet가 존재하고 Servlet을 통해 DB와 데이터를 교환한다.
이렇게 큰 구조로 되어있고 세부적인 내용을 하나하나 살펴보자.
1. HTML Form
- Action
Port번호 / APP 이름 / 클라이언트가 요청 할 HTML (EX> localhost:8000/FormatHandlingServlet/LoginForm.html)
- Method
Get method : 사용자가 입력한 데이터가 URL뒤에 붙음. 보안상 취약.(EX> 단순 DB읽기, 반복적인 작업)
Post method : Get method보다 보안성이 우수함.(EX>DB의 데이터에 영향을 주는 작업)
- Submit
버튼으로 데이터를 서버로 보내주는 버튼 역할.
2. WAS(Web Application Server)
Web Server( Apache Server, Nginx, IIS(Windows 전용 Web 서버) + Web Application Server(Servlet, JSP)이다.
근데 WAS만 쓰면 되는데 왜 굳이 Web Server를 사용하는지 궁금할 것이다.
옛날에는 정적인 서버로 컴퓨터에 저장된 html,css,javascript 파일만 주고 받았다.
그러나 컨텐츠들이 많아지면서 데이터를 입력하고 바꿔줘야 할 데이터들이 많아졌다. 그래서 정적인 페이지로는 속도가 너무 느려져서 동적인 서버가 생겼는데 그것이 WAS이다.
둘을 조합해서 사용하는 경우 그 효과가 극대화된다. 정적인 것들(html,css,image)는 Server에서 데이터베이스의 조회나 수정이 필요한 경우는 WAS가 담당하며 효율적으로 웹 사이트를 구성할 수 있다.
위의 내용을 이해했다면 WAS의 자세한 동작 과정을 살펴보자.
1. 클라이언트의 요청을 서버가 받아 HTTP Request로 WAS에게 위임한다.
2. Web.xml파일을 이용하여 Servlet객체를 생성하여 메모리에 올린다.
3. 그리고 Thread를 생성하여 service() 메소드를 호출한다.
4. service() 메소드는 doGet(), doPost()를 이용하여 DB와의 통신을 한다.
여기서 Web.xml, Thread, Servlet, JSP의 개념에 대해서 알아보자.
- Web.xml
Web Application의 설정을 위한 deployment descriptor이다. JSP나 Servlet을 위한 설정 파일이라고 생각하자.
들어있는 정보는 URL, Class name, Servlet name이다.
클래스의 파일을 Servlet이름을 붙히고 그것을 URL Mapping하는 것이다.
1. <servlet>
내부에서만 사용하는 이름과 완전한(패키지 이름까지 포함하여) 클래스명과 서로 매핑한다.
2. <servlet-mapping>
내부에서 사용하는 이름과 URL 이름을 서로 매핑한다.
저렇게 맵핑을 하는 이유는 Class의 이름이 직접적으로 드러나면 보안상 위험하기 때문이다.
- Thread
하나의 프로세스 안에서의 여러 개의 Work-flow이다.(프로세스의 특정 흐름)
주요 특징으로는 Heap영역을 공유한다는 것이다. 그리고 하나의 Thread는 개인 Stack을 가진다.
여기서 Process의 개념을 이해해보자.
Process는 메모리에 올라와 실행되고 있는 프로그램의 객체이다.
아래와 같이 프로세스와 쓰레드는 공유하는 메모리의 차이가 크다.
여기서 문제가 발생하는 것은 여러 개의 Process를 실행할 경우이다.
Process가 많아 지면 CPU가 계속 메모리를 할당하여 사용해야하기 때문에 비효율적이다.
그리고 Context Switching(여러 개의 프로세서가 작동 할 때 이전 프로세서를 복구하는 것)이 발생한다.
그래서 하나의 프로세서에서 여러 개의 Thread를 처리하는 것이 효율적인 CPU활용이다.
- Servlet
백엔드에서 제일 중요한 부분. 내가 직접 작성하고 구현해야 할 것이다.
Servlet은 클라이언트 요청을 동적으로 처리가 가능한 하나의 클래스이다.
Servlet의 Life Cycle은 아래의 그림과 같다.
생성되면 Init() --> service(request, respond) --> destory() 순서로 실행된다.
간단한 Servlet예제 코드를 보면서 공부해보자.
public class LoginServlet extends HttpServlet { //자바에서 상속받은 LoginServlet객체
// doPost()를 재정의
protected void doPost(HttpServletRequest request, HttpServletResponse response throws ServletException, IOException {
// 값 읽어 오기
String name = request.getParameter("name");
String password = request.getParameter("password");
// 출력할 객체를 생성
PrintWriter writer = response.getWriter();
/* 여기서 -> DB 접근 등 Business Logic 부분을 처리 */
// view 생성
String htmlResponse = "<html>";
htmlResponse += "<h2>Your name is: " + name + "<br/>";
htmlResponse += "Your password is: " + password + "</h2>";
htmlResponse += "</html>";
// 요청에 응답을 해줌.
writer.println(htmlResponse);
}
}
다음으로 Servlet Annotation이다. 이것은 Web.xml파일을 대체 할 수 있다.
사용하는 경우는 설정 파일이 너무 길어지면 Annotation을 사용한다.
Annotation Type
@WebServlet : 서블릿 선언
@WebInitParam : 초기화 매개 변수 지정
-JSP(Java Server Page)
HTML내의 Java언어.
JSP의 내부 동작에 대해서 알아보자.
JSP가 실행되면 WAS내부적으로 Java Servlet(.java)를 생성한다.
위에서 설명했던 Servlet이 내부적으로 Cycle을 거쳐 동작한다.
생성된 데이터를 다시 가져와 클라이언트에게 반환해준다.
JSP의 기본 문법에 대해서 알아보자.
1. 템플릿 데이터 : 클라이언트로 출력되는 컨텐츠.(HTML, CSS, JAVASCRIPT, JSON, XML..)
템플릿 데이터는 서블릿 코드를 생성할 때 출력문(톰캣의 경우 out.println)으로 바꿔준다.
2. JSP 전용 태그 : Servlet생성 시 특정 자바 코드로 바뀌는 태그
- Directive(지시자) : 지시자, 속성에 따라 자바 코드를 생성.(<% 지시자 속성= "값" 속성= "값" ...%>)
- Scriptlet Elements(스크립트릿) : 이 코드는 서블릿 파일에 그대로 적용된다.(<% %>)
- Declartion(선언문) : 서블릿의 클래스 멤버를 선언할 때 사용한다.(<% !멤버 %>)
- Expression(표현식) : 문자열을 출력할 때 사용.(<%=%>)
- JSP Action : JSP에서 기본적으로 제공하는 태그들의 집합.
3. JSP 내장 객체 : JSP 기술서에 정의 된 9개의 객체. 별도의 선언없이 이용할 수 있는 자바 객체.
이렇게 JSP/Servlet에 대한 기본적인 지식들을 알았다.
다음으로는 Spring MVC구조에 대해서 알아보겠다. MVC구조는 흔히 많이 사용하는 구조라 이것을 배우고
직접 코드로 구현해보면 될 것 같다.