정적 페이지 vs 동적 페이지
1. 정적 페이지
- 서버가 경로 이름을 받고 해당 컨텐츠 파일을 반환한다. -> 항상 같은 페이지만 제공하므로 지루하다.
2. 동적 페이지
- 요청하는 파라미터에 따라 다른 결과의 페이지를 제공
Web Service Architecture
Client(browser, mobile app) <-> WAS(Web Application Server) <-> DB(MySQL)
- WAS
- Web Server: 컨테이너로 요청을 보내고 요청 결과를 변환하에 클라이언트에게 응답한다.
- Servlet Container: (JSP, Servlet)가 들어있으며 동적으로 요청을 처리한다.
Servlets 개요
- 웹 기반 요청들의 동적 처리에 이용되는 서버 사이드 자바 프로그램
- form들을 통해 유저들의 input을 모을 수 있다.
- db나 다른 소스들의 레코드를 처리할 수 있다.
- 웹 페이지를 동적으로 만들 수 있다.
- 서블릿은 서블릿 기능을 지원하는 WAS에 존재한다.
과정: client -> form submit request -> servlet response -> html page result -> client
Form 메서드
-GET, POST ...
- GET: url에 쿼리값을 붙여서 보낸다. -> url은 암호화가 불가능 하므로 get 메서드는 암호화 불가능
- POST: body에 값을 넣어서 보낸다. -> body는 암호화 가능 -> POST 메서드 암호화 가능
참고:
- https에서 s는 secure -> body 부분을 암호화 해주어 브라우저와 서버 사이에 주고 받는 데이터들을 모두
암호화 된다.
Servlet 프로그램
과정
- Web Server 요청 -> Servlet Container -> Servlet 로드 -> Thread(Container에서 생성)가 service 처리
- 서버로 들어오는 HTTP 요청은 서블릿 컨테이너에 위임
- 서블릿 컨테이너는 service () 메소드를 호출하기 전에 서블릿을 로드
- 서블릿 컨테이너는 요청개수 만큼 여러 스레드를 생성하여 여러 요청을 처리
- 각 스레드는 서블릿의 단일 인스턴스의 service () 메소드를 실행.
- 요청이 들어온 뒤 일어나는 과정은 모두 JVM 안에서 이뤄지는 것
서블릿 생명주기
- init() -> service() -> destroy()
- inite은 처음 생성될 때 destroy는 서블릿 컨테이너에 의해 unload 됐을 때 각 각 한번씩만 호출된다.
- 서블릿 객체가 생성 될 때, init 메서드가 호출된다.
- 서블릿이 받은 모든 요청에 대해 service 메서드가 호출된다.
- service 메서드는 HTTP 요청 타입을 체크하여 적절한 메서드를 호출한다.
사용 예시 코드
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Hello extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// read form fields
// getParameter: form 값을 받기 위한 메서드
// getParameterValues:하나 이상의 form 값을 받기 위한 메서드(ex, checkbox)
String username = request.getParameter("username");
String password = request.getParameter("password");
// get response writer
// 응답할 때 사용자에게 보여줄 html content를 만들기 위해 사용하는 메서드
PrintWriter writer = response.getWrite();
// build HTML code
String htmlResponse = "<html>";
htmlResponse += "<h2>Your username is: " + username + "<br/>";
htmlResponse += "Your password is: " + password + "</h2>";
htmlResponse += "</html>";
// return response
writer.println(htmlResponse);
}
}
서블릿 병행성
- 자바 서블릿 컨테이너는 전형적인 멀티 쓰레드 환경이다.
참고:
- Thread란?
예시) Thread와 Process의 관계는 학교과 학생의 관계와 같다.
Process는 작업을 할 수 있도록 환경을 제공해주는 것, 실제로 작업하는 것은 Thread, Process는 Thread에게 미션을 준다. 한개의 Thread는 반드시 main함수를 수행한다. 함수를 수행하고 return을 한다면 그 Thread는 없어진다.
- Thread에는 각각 메모리가 할당 되는데 stack이라는 메모리를 가지고 함수를 수행한다.
- stack에는 지역변수,함수 인자들이 들어간다.
- 전역변수는 Thread들이 공유하는 변수
multi Threadiy을 하는 이유
-> 응답시간을 줄이기 위해서
-> multi Threadiy 에서 Thread간에 동기화가 필요하다. 동기화에는 상호배제가 필요
CS : critical section (임계 영역) : CS에 Thread가 들어와 작업을 하고 한 Thread가 작업을 하는 도중에 다른 Thread가 작업을 하려고 접근을 한다면 상호배제를 해준다. -> blocking
(화장실과 같은 원리)
위와 같은 것들을 지켜주지 않으면 원하는 값이 나오지 않는다. -> 논리의 문제가 아니라 타이밍의 문제
※맴버 변수, Static 변수가 있는 경우 상호배제를 반드시 해줘야한다.
'Spring > 이론' 카테고리의 다른 글
관점 지향 프로그래밍(AOP, Aspect Oriented Programming) (0) | 2020.03.07 |
---|---|
의존성 주입(Dependency Injection) (0) | 2020.03.05 |
JSP(Java Server Pages) (0) | 2020.03.05 |
Spring Framework 개요 (0) | 2020.03.04 |
가비지 컬렉션(Garbage Collection, GC) (0) | 2019.10.27 |
댓글