[TIL] 20210831

열심히 사는 루피 🥰·2021년 8월 31일
0

데브코스 백엔드 TIL

목록 보기
17/20

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

  1. 웹서버

    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!!");
    }
}
  1. 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>
  1. annotation을 이용
    • 구현한 test 서블릿 위에 @WebServlet을 달아준다.
@WebServlet(value = "/*", loadOnStartup = 1)
public class TestServlet extends HttpServlet {
    private static final Logger logger = LoggerFactory.getLogger(TestServlet.class);
}
  1. 스프링에서 제공해주는 인터페이스를 구현
    • 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로 패키징.

profile
반가워_! 세상아!

0개의 댓글