(1) URI
(2) HTTP
(2) HTML(Hyper Text Markup Language)= Hyper Text + Markup
아키텍처: 시스템의 구성 환경등을 설명하는 설계도
URL에 해당하는 도메인에 대한 IP를 가져오기위해 DNS를 이용해
가져옴
Load Balancer가 브라우저가 요청한 것을 분산시켜줌 (수평확장, 수직확장)
웹서버에서 요청을 받으면 요청을 처리
서블릿을 이용하면 자바코드를 실행하고 JDBC를 이용하여 DB에서 데이터를 가져올 수 있음 (OLTP 데이터베이스)
요청의 정보가 바뀔일이 별로 없으면 매번 정보를 디비에서 가져오는것은 비효율적이기때문에 CachingService를이용해 캐싱해둠. 같은 요청이오면 CashingService를 통해 빠르게 응답할수 있음
바로응답을 줄수 없고 오랫동안 작업을 해야하는 것을 Job Queue를 이용하여 넣어놓으면 job서버들을 배치해두고 압축해놓고 압축 다되면 알려줌, 비동기방식으로 움직임
브라우저와 통신하는 동시에 백그라운드로 웹소켓을 이용해 처리할수도 있고 폴링할수도 있음, 컨텐츠서버 (CDN) 에서 올라올수도 있음
ex) 구글드라이브에서 다운받으면 다운 다된후에 알려줌. 다른거 브라우징도 가능
검색해야하는경우 이런 서비스가 있을수 있음
Web app servers은 다양한 서비스들로 구성이 되어질수 있음
웹앱서버가 서비스들한테 나눠서 요청을 보낼수 있음
이미지 같은것을 넣어놓을수 있고 이를 CDN과 연결 가능
CDN : 고객과 가장 가까운 서버
미국에서 올려놓은 이미지 받을때 한국에서 받을때 미국서버를
이용하면 느림 -> cdn을 이용해 각전세계에다가 캐시서버를 분산배치해놓고 근접한사람들의 요청을 처리
(1) 웹서버
(2) 웹 애플리케이션 서버(WAS)
웹서버와 웹애플리케이션 서버의 가장 큰 차이점은 동적서버를 지원하냐 안하냐
디비조회나 비즈니스로직처리를 함
동적인 컨텐츠를 제공하기위해 만들어짐
자바에서는 웹서버를 웹컨테이너 서블릿컨테이너라고 부름
와스에서 웹서버 기능가능 http요청을 받아 서블릿코드에서 디비에 연동해 JSP나 Json을 만들어 응답을 전달해주는 구조
우리가 개발한 프로젝트를 jar나 was로 빌드해서 디플로이 하게되면
웹컨테이너가 로드가 되어 요청을 받아 우리가만든 코드가 동작
오픈소스 탐캣등을 다운바당 설치 물리적인 서버에다가 설치해서 구동
탐캣에다가 우리의 코드를 로드한다는 개념은 동일
와스가 웹서버의 기능 (동적컨텐츠외에 정적컨첸츠)
적콘텐츠 로드하는 웹서버를 앞단에 두어 브라우저와 직접적인 연결
프록시 웹서버가 와스 요청 -> 와스가 요청을 받아 쓰레드가 만듦
쓰레드 만드는 이유: 여러클라이언트의 요청을 동시지원하기 위해
쓰레드가 서블릿의 메서드에 요청되면 doGet(), doPost() 호출
메서드에 따라 메서드가실행되고 응답이 실행되는 구조
Life Cycle
- init() 컨테이너가 딱 한번 호출
- service() 클라이언트 요청 처음에 왔을때 쓰레드를 만들때 사용
- doget() doPost() 호출
하나의 요청은 하나의 쓰레드안에서 돌게댐
매요청이 다른 스레드 에서 호출되는것이 매요청이 서블릿 객체를 만드는것은아니다
여러쓰레드가 하나의 객체에 접근하면서 문제가 될수 있기때문에 메서드 안에서 변수를 만들고 처리해야함
web.xml과 TestServlet 추가
web.xml 파일
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>org.prgrms.kdt.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
public class TestServlet extends HttpServlet {
public static final Logger logger = LoggerFactory.getLogger(TestServlet.class);
@Override
public void init() throws ServletException {
super.init();
logger.info("Init Servlet");
}
@Override // http GET요청이 오면 doGet메소드가 호출이 됨
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// req : request, resp : response
String requestURI = req.getRequestURI();
logger.info("Got Request from {}", requestURI);
PrintWriter writer = resp.getWriter();
writer.println("Hello Servlet!");
}
}
web.xml 지우기
TestServlet에 @추가
loadOnstartup = 1 : 서블릿이 WAS에 올라갈때 미리 로드 시키겠다는 의미
loadOnstartup = -1 : 요청을 받을때 init이 댐
public class KdtWebApplicationInitializer implements WebApplicationInitializer {
public static final Logger logger = LoggerFactory.getLogger(KdtWebApplicationInitializer.class);
// Spring에서 제공하는 WebApplicationInitializer 인터페이스를 상속받으면 onStartup메소드를 실행하여 Servlet을 만들어줌
// 해당 방식은 Old한 방식임
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
logger.info("Starting Server...");
Dynamic servletRegistration = servletContext.addServlet("test", new TestServlet());// 서블릿추가 : TestServlet클래스
servletRegistration.addMapping("/*");
servletRegistration.setLoadOnStartup(1);
}
}