[TIL] 20210831
1. 웹 기술
1) 웹 구성요소들
URI: 웹의 많은 리소스를 식별하기 위한 식별자.
상대경로: 내 위치 기준이동 (앞에 슬래시 없음.)
절대경로:
-> 배포될때 리소스 위치가 달라지면서 변경될 수 있다.(찾을수 없을 수 있다.)
-> URI에 아스키만 사용가능, 인코딩-디코딩 신경써야함.
https://velog.io/@hoit_98/TIL-20210827
URI 스케마 : https
호스트명 : velog.io
패스: @hoit_98/TIL-20210827
HTTP: 리소스를 접근하고 수정하게 해준다. URI로 조작대상을 지정해서
Hyper Text Transfer Protocol : 하이퍼 텍스트 문서를 교환하기 위해 만들어진 통신 규약
-- (요청/request) -- >
클라이언트 웹 브라우저 OS 호스트서버
< -- (응답/response) --
-
주요 특징
- TCP/IP 기반
- 요청/응답형 프로토콜
- 동기형 프로토콜 : 요청이 있으면 반드시 응답이 있는
- 스테이트리스 : 요청을 보내고 나면 그 요청에 대한 상태는 날아갑니다. 매번 요청을 보낼때마다 상태 정보를 같이 실어서 보내줘야한다.
(예 토큰/ 쿠키 전달) -
8개의 메서드 가짐
get, post, put, delete, head, options, trace, connect -
CRUD 명 의미 메서드 create 작성 post/put read 읽기 get update 갱신 put delete 삭제 delete
HTML(h) : 연결성을 가진 마크업 언어
hyper Text : 텍스트 안에 링크가 있어 다른정보와 연결성이 있는거.
URI -> 프로토콜 :
웹 특징
- 하이퍼미디어 시스템
- 분산 시스템 : 복수의 컴퓨터가 처리함. 전세계의 브라우저가 다양한 각서버에 접속하여 처리하는 방식.
2) 웹 아키텍쳐
아키텍쳐 : 시스템 구성과, 동작원리, 시스템 구성환경을 설명하는 설계도
웹 어플리케이션 아키텍쳐 : 웹 어플을 구성하는 시스템들간의 상호작용과 동작원리들.
백엔드에서 리소스, DB를 읽어 프론트엔드에 reponse 전달
프론트엔드에서 렌더링 시킨 웹브라우저를 사용자에게 제공.
1. DNS: 브라우저에서 들어온 URI 요청에 해당하는 ip를 찾아 제공
2. Load Balancer: 서버에 들어온 요청을 분산시켜줌(scale out)
-> 여러대의 컴퓨터, 어떻게 분배시켜줄지(알아서 인스턴스에 분배?)
3. 웹서버: 자바, 파이썬 등으로 코드 실행, 여러 개의 서버로 분산가능 -> OLTP
4. DB: jdbc 등을 활용, 데이터베이스의 데이터 제공
5. 캐싱: 똑같은 정보요청이 빈번할때, 비효율적인 db 접근을 줄이고 캐싱한 정보를 가져오게함.
->redis(가벼운 db를 캐싱 서버로 사용)
6a. Job Queue: 오래걸리는 작업을 넣어둔다.
6b. Job Server: job queue에서 할일을 전문으로 하는 서버에 압축해놓고 완료되면 웹서버에게 알린다.
7. 텍스트 서치에 많은 리소스가 쓰이므로 서치용 서비스 분리 가능
8. 분산된 서버에 해당하는 여러개의 서비스 존재할 수 있음
9a.Data firehorse: 클라우드나 Data wareHouse의 데이터를 불러오고 저장
->kafka: 데이터를 받아서 분배
9b.Data wareHouse: 분석용이나 따로 사용하려 데이터웨어하우스에 저장
10.클라우드 저장소 : S3등의 클라우드에 이미지 등을 CDN을 통해 고객이 빠르게 접근할 수 있게 해줌.
11. CDN : 각 전세계에 캐시서버등을 분산해놓고, 근접한 요청을 처리하도록함.
->클라우드 프론트
2. Servlet
-
웹서버
HTTP 웹서버 : HTTP 프로토콜을 지원하는 서버/ 정적컨텐츠만제공
웹 애플리케이션 서버와 차이 : 동적 컨텐츠를 지원하느냐WAS
- db 조회, 비즈니스 로직처리를 하게됨.
- 자바 코드를 실행해 비즈니스 로직을 처리해 동적 컨텐츠를 처리.
- jsp나 서블릿을 구동할수 있다.(동적 처리)
- 일반적인 웹서버 역할도 수행가능(정적 처리)
만든 웹어플리케이션(.war) -> WAS(톰캣, 제티 등)에 deploy
nginx -> 웹서버, 로드밸런싱(돌려막기)
웹서버를 분리해서 기능을 앞단에 해서 클라이언트와 소통,
웹서버 뒤 방화벽 뒤에 WAS 구동시켜 동적인 컨텐츠(인증, 인가 등)를 가져온다.
DB에는 WAS에서만 접근되도록한다
https://velog.io/@change/WEB%EC%84%9C%EB%B2%84-WAS-%EB%B6%84%EB%A6%AC-%EC%9D%B4%EC%9C%A0
서블릿: 클라이언트의 요청을 받아 서비스단에 필요한 것을 요청.
서버 역할(요청수행, 응답)을 하는 컴포넌트.
서블릿은 스펙에 맞게 웹 애플리케이션을 개발 -> WAS에 돌려 구동WAS JSP를 사용하여 랜터링 -> 정적컨텐츠 생성
MVC 패턴
관심을 모델, 뷰, 컨트롤러로 분리
모델: 데이터처리(POJO로 데이터만 담고 있는다) / JAVA Bean(자바 객체)
뷰: 화면(보여지는 것 처리) / JSP
컨트롤러: 로직(모델-뷰를 연결해 사용자 요청처리) / Filter나 Servlet
3. Servlet LifeCycle
웹서버 요청 -> WAS에 요청
웹 컨테이너에서 실행하며 여러 쓰레드 생성 -> 서블릿의 서비스를 요청
서블릿 : init 된 후 종료될때 까지 사용
init() -> 각 쓰레드에서 요청된 서블릿의 서비스(do get/ do Post)를 수행 -> destroy
각 리퀘스트에서
매번 새 서블릿 인스턴스를 생성하는 것(X)
매번 새 쓰레드에서 한 서블릿의 서비스가 요청되는것(O)
-> 따라서 서블릿 안에서 어떤 필드값을 수정, 저장 하면 다른 쓰레드에서도 그 값을 참조할 수 있게됨.
-> 다른요청과 기존 요청과 뒤섞이는 일이 발생한다.
=> !!! 메서드 안에서 변수를 만들고 처리해야 함 !!!
4. Servlet, WAS 실습
구현한 테스트 서블렛
public class TestServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(TestServlet.class);
@Override
public void init() throws ServletException {
super.init();
logger.info("Init Servlet");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String requestURI = req.getRequestURI();
logger.info("Got request from {}",requestURI);
var writer=resp.getWriter();
writer.println("hello servlet!!");
}
}
- 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>
- annotation을 이용
- 구현한 test 서블릿 위에 @WebServlet을 달아준다.
@WebServlet(value = "/*", loadOnStartup = 1)
public class TestServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(TestServlet.class);
}
- 스프링에서 제공해주는 인터페이스를 구현
- WebApplicationInitializer
public class KdtWebApplicationInitializer implements WebApplicationInitializer {
private static final Logger logger = LoggerFactory.getLogger(KdtWebApplicationInitializer.class);
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//WAS 실행 선행 후행으로 작업해줘야할때 사용할 수 있음.
logger.info("Starting Server...");
ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("test", new TestServlet());
servletRegistration.addMapping("/*");
servletRegistration.setLoadOnStartup(1);
}
}
세 방법 모두 톰캣인 WAS 에 war를 배포하는 방식
-> 오래된 방식이라 요즘은 내장 톰켓을 사용해 jar로 패키징.
Author And Source
이 문제에 관하여([TIL] 20210831), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hoit_98/TIL-20210831저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)