W5D1 - SpringBootPart3

Onni·2021년 9월 7일
0

TIL

목록 보기
11/21

Web Technology Oberview

1. WEB

1-1 Web의 구성

(1) URI

(2) HTTP

(2) HTML(Hyper Text Markup Language)= Hyper Text + Markup

  • 하이퍼링크: 링크를 통해 다른정보와 연결성
  • 마크업: 헤드나 바디나 문단에서 중요한 의미를 부여할때 (head, body)
    구조적으로 표현할 수 있게 만든 규칙
  • 마크업 언어 : 문서가 구조를 가질수 있게 만든 언어
    웹은 브라우저를 통해 특정서버정보를 가져옴
    브라우저를 통해 특정리소스를 URI를 통해 접근할때 HTTP프로토콜을타서
    서버에 있는 리소스를 브라우저 받아서 랜더링 해서 문서가 보이고 링크들이 있어서 또다른
    서버에 있는 정보를 가져오게됌

1-2 웹의 기술적 특징

  • 하이퍼미디어: 텍스트뿐만아니라 이미지, 영상 등 다양한 미디어들을 하이퍼링크로 연결
  • 분산시스템: 복수의 컴퓨터로 연산, 웹은 전세계의 브라우저가 엑세스 할수 있는 분산 시스템
    ex)네이버는 여러개의 서버로 이루어져있고 네이버에서 링크를 타고들어가면 다른서버
    로들어가게 됨
    cf) 중앙집중형 : 하나의 컴퓨터가 모든거 처리

1-3 Web Application Architecture

아키텍처: 시스템의 구성 환경등을 설명하는 설계도

  1. URL에 해당하는 도메인에 대한 IP를 가져오기위해 DNS를 이용해
    가져옴

  2. Load Balancer가 브라우저가 요청한 것을 분산시켜줌 (수평확장, 수직확장)

  3. 웹서버에서 요청을 받으면 요청을 처리

  4. 서블릿을 이용하면 자바코드를 실행하고 JDBC를 이용하여 DB에서 데이터를 가져올 수 있음 (OLTP 데이터베이스)

  5. 요청의 정보가 바뀔일이 별로 없으면 매번 정보를 디비에서 가져오는것은 비효율적이기때문에 CachingService를이용해 캐싱해둠. 같은 요청이오면 CashingService를 통해 빠르게 응답할수 있음

  6. 바로응답을 줄수 없고 오랫동안 작업을 해야하는 것을 Job Queue를 이용하여 넣어놓으면 job서버들을 배치해두고 압축해놓고 압축 다되면 알려줌, 비동기방식으로 움직임
    브라우저와 통신하는 동시에 백그라운드로 웹소켓을 이용해 처리할수도 있고 폴링할수도 있음, 컨텐츠서버 (CDN) 에서 올라올수도 있음
    ex) 구글드라이브에서 다운받으면 다운 다된후에 알려줌. 다른거 브라우징도 가능

  7. 검색해야하는경우 이런 서비스가 있을수 있음

  8. Web app servers은 다양한 서비스들로 구성이 되어질수 있음
    웹앱서버가 서비스들한테 나눠서 요청을 보낼수 있음

  • c. OLTP데이터베이스가 아닌 분석용이나 대용량 처리 하기위해 데이터웨어하우스를 구성하기도 함
  • a. 매칭시스템이용하여 데이터웨어하우스나 Cloud Stroage 와 연결
  1. 이미지 같은것을 넣어놓을수 있고 이를 CDN과 연결 가능

  2. CDN : 고객과 가장 가까운 서버
    미국에서 올려놓은 이미지 받을때 한국에서 받을때 미국서버를
    이용하면 느림 -> cdn을 이용해 각전세계에다가 캐시서버를 분산배치해놓고 근접한사람들의 요청을 처리

1-4 웹서버 vs 웹 애플리케이션 서버

(1) 웹서버

  • 웹서버에서는 static 컨텐츠를 호스팅하기 위해사용

(2) 웹 애플리케이션 서버(WAS)

웹서버와 웹애플리케이션 서버의 가장 큰 차이점은 동적서버를 지원하냐 안하냐

  • 디비조회나 비즈니스로직처리를 함

  • 동적인 컨텐츠를 제공하기위해 만들어짐

  • 자바에서는 웹서버를 웹컨테이너 서블릿컨테이너라고 부름

  • 와스에서 웹서버 기능가능 http요청을 받아 서블릿코드에서 디비에 연동해 JSP나 Json을 만들어 응답을 전달해주는 구조

  • 우리가 개발한 프로젝트를 jar나 was로 빌드해서 디플로이 하게되면
    웹컨테이너가 로드가 되어 요청을 받아 우리가만든 코드가 동작

  • 오픈소스 탐캣등을 다운바당 설치 물리적인 서버에다가 설치해서 구동

탐캣에다가 우리의 코드를 로드한다는 개념은 동일

와스가 웹서버의 기능 (동적컨텐츠외에 정적컨첸츠)
적콘텐츠 로드하는 웹서버를 앞단에 두어 브라우저와 직접적인 연결

  • 동적인 콘텐츠는 인증, 인가나 방화벽으로 보호
  • 디비와 연동됨 고객정보가 있으니까 와스가 접근하게 해주고
    와스가 웹서버의 요청에 의해서 동적인 컨텐츠를 디비에서 가져와 연동

2. Servlet

2-1 Servlet?

  • Servlet : 브라우저에서 요청을 받아 서비스의 기능을 호출해주는 하나의 컴포넌트
  • 클라이언트의 요청을 받아 특정 서비스의 기능을 호출 가능
  • 자바 인터페이스로 존재
  • 웹서버안에서 동작하는 자바 프로그램
  • 서블릿을 상속받아 특정메서드를 구현하면 HTTP request를 했을때 WAS가 메서드를 호출해줌
  • servelet이 jsp를 만듦 -> was가 jsp를 읽어 컴파일하고 랜더링 -> html contents가 만들어져서 응답을 가지게 됨

2-2 MVC Pattern in Servle

  • mvc패턴 : Model, View, Controller로 각각의 컴포넌트들이 해야할 관심사를 분리
    (화면, 로직처리, 정보담고있는 부분으로 명확히 분리_
  • Model : 자바 객체 또는 Pojo로 데이터를 담고 있다. (Servlet)
  • View : 모델이 담고 있는 데이터를 시각적으로 보여주는 역할 (Jsp)
  • Controller : 모델과 뷰를 연결하기 위한 매개체. 사용자의 입력/요청을 받아 모델의 상태를 변경해주고 그에 따른 뷰를 업데이트 (자바객체)

2-3 Servlet의 Life Cycle

  • 프록시 웹서버가 와스 요청 -> 와스가 요청을 받아 쓰레드가 만듦

  • 쓰레드 만드는 이유: 여러클라이언트의 요청을 동시지원하기 위해

  • 쓰레드가 서블릿의 메서드에 요청되면 doGet(), doPost() 호출

  • 메서드에 따라 메서드가실행되고 응답이 실행되는 구조

  • Life Cycle
    - init() 컨테이너가 딱 한번 호출
    - service() 클라이언트 요청 처음에 왔을때 쓰레드를 만들때 사용
    - doget() doPost() 호출

  • 하나의 요청은 하나의 쓰레드안에서 돌게댐

  • 매요청이 다른 스레드 에서 호출되는것이 매요청이 서블릿 객체를 만드는것은아니다

  • 여러쓰레드가 하나의 객체에 접근하면서 문제가 될수 있기때문에 메서드 안에서 변수를 만들고 처리해야함

3. 톰캣 실행방법

3-1. web.xml 파일 추가

  • 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>
  • TestServlet
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!");
    }
}

3-2. 애노테이션 이용

  • web.xml 지우기

  • TestServlet에 @추가

    loadOnstartup = 1 : 서블릿이 WAS에 올라갈때 미리 로드 시키겠다는 의미
    loadOnstartup = -1 : 요청을 받을때 init이 댐

3-3. 스프링이제공하는 인터페이스 구현 방법

  • TestServelet 에서 애노테이션 달아준거 지우기
  • KdtWebApplicationInitializer클래스 작성
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);

    }
}
profile
꿈꿈

0개의 댓글