42s_hoTechCourse Chat App – 05

김남형·2021년 3월 25일
0
post-custom-banner

이거 옛날에 들었던 것 같은데? 옛날에?

이호준 멘토님 왈: "너 Web Server 랑 Web Application의 차이가 뭔지 알아?"

아주 먼 옛날 HoTechCourse를 시작 할 때 물어보시곤 잊고 있던 질문이었다. 그때 당시엔 그냥 지나쳐버린 Web Server는 정적페이지를 Web Application은 동적페이지를 주는거 아냐? 라고 당연하게 신나게 패스해버린 것이 지금까지 받아 온 HoTechCourse와 연결 되어 이해 할 수 있을거란 생각도 못했었다.
아마도 지금까지 계속 잊고 지내왔던 이유는 프로그래머인 내가 직접 관여하지 않고 셋팅 된 것들을 사용해서 인식하지 못했던 것 같다. 그런데 정말 매우 프로그래밍 하는데 매우 중요한데 말이다!

의문 의심 호기심 그리고 행동

HoTechCourse 처음 시작 할땐 몰랐는데
지금와서 보면 당연하다고 생각 하던 것들에 대해 "왜?"라는 의문을 꼭 던지게 된다.
아마도 단순 코드리뷰가 아닌 교육방식에 나도 모르게 익숙해졌기 때문이 아닐까 싶다.
분명 나는 이제는 정말 코드를 작성하고 싶어 코드를 칠거야!라는 계획이었지만 참고자료를 보면서
내가 왜 저렇게 코드를 작성 해야 하는데? 어떤 배경에서 예제코드들이 저렇게 될까 싶었다.

  • "왜?" 라는 의문은
  • "왜 되는건데?" 라는 의심이 되고
  • "왜 이렇게 되는걸까?" 라는 호기심이 되고
  • "오 정말 이런 원리로 작동하는구나" 라는 탐구의 행동이 된다.

(의문) 응 서버니까 동시 요청이 되지? 다음!

지금까지 스프링을 다루면서 당연히 서버니까 동시 요청이 가능하다라고 생각했습니다.
그런데 나도 모르게 습관이 되어버린 "왜?"가 튀어나왔습니다. 동시요청을 왜 처리 할 수 있지?
나는 분명 컨트롤러도 하나 만들었고 스프링 객체들도 싱글턴 객체로 알고 있는데 왜 될까?
나는 한개 이상 만들어 본 적이 없는데 이상하다 왜?라고 의문이 들었습니다.

(의심) 누구냐 누구 때문에 이렇게 작동하는거야?

의심을 풀기 위해 스프링이 부트 될때 나오는 로그를 살펴보았습니다. 스프링부트에 임베디드 되어있어서 신경도 쓰지 않았던 WAS의 역활을 하고 있는 Tomcat이 눈에 띄었습니다.
그 순간 "Web Server Web Application의 차이를 알아?"가 생각났습니다 오호라 이게 실마리지 않을까 생각하게 되었습니다.

(고뇌) 어차피 몰라도 코드만 치면 잘 작동되는데?!

의문을 해결 하기 위해서는 처음에 많은 시간을 투입해야 합니다. 추상화 되어 보이지 않는 것들의 필요성을 느끼지만 당장 내가 이런 것을 채우는 것보다 눈에 보이는 코드를 작성하는게 더 중요하지 않을까?라는 고민에 빠지기도 합니다.
현재는 아직 배우는 입장이기에 바탕을 튼튼히 하는것이 중요하다고 생각합니다. 하지만 만약 업무 중이었다면 일단 만들고 추후에 바탕을 찾았을겁니다. 저는 그렇게 생각합니다.
그러므로 내게 주어진 환경과 시간을 고려하여 코드와 원리의 사이에서 트레이드오프를 잘 선택해야 합니다.

(호기심) 그래 Tomcat 넌 누구니?

여기서 옛날 옛적 이야기가 나오기 시작합니다.

이호준 멘토님 왈:"Web Server, Web Application Server 차이도 모르는데 무슨 프로그래밍이야?"

웹 서버는 정적 데이터를 주는 것 웹 애플리케이션 서버는 동적인 것을 주는 것이라고 막연하게 알고 있지 않은가?
나도 그랬다. 혼란스럽고 이해하기 어려웠던 점을 그림만 봐도 딱 알 수 있도록 풀어서 전달하려고 합니다.
복잡한 상속관계 같은건 인터넷에 좋은 자료가 있으니 바탕을 이해하고 찾아보면 좋을 것 같아요!

Web Server란?

기능

  • HTTP를 통해 클라이언트의 요청을 처리한다.
  • 정적 컨텐츠 제공 (WAS에 위임하지 않음)
  • 동적 컨텐츠 제공을 위한 위임
  • 요청을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달한다.

여기서 꼭 알아야 할 것은 웹 서버는 웹 서버 소프트웨어가 설치되어 있는 컴퓨터 라는 것!!
정적 컨텐츠란 마치 주문한 물건이 택배로 오는 것과 같습니다. 택배 과정 중에 물건이 바뀌지 않으니까요.

Web Application Server란?

WAS는 웹 서버의 구성에 동적 컨텐츠를 만들기 위해 웹 컨테이란 포함하는 개념입니다.
"동적"은 서버가 컨텐츠를 처리하는 것, 예를 들면 데이터베이스에서 꺼내 온 데이터를 화면에 표시 하는것입니다.
동적 컨텐츠란 마치 주문한 물건을 만드는 과정과 같습니다. 그리고 웹 서버란 택배 회사를 통해 고객에게 보내는 것이죠.

Tomcat == 웹 컨테이너이자 서블릿 컨테이너이다.

위키피디아 Tomcat 소개문
Tomcat은 Java 코드를 실행할 수 있는 "순수한 Java" HTTP 웹 서버 환경을 제공 합니다.

-- 교양 참고 사항 --

JAVA SE : JAVA Standard Edition

  • 자바 표준 에디션은 가장 기본이 되는 에디션입니다.

JAVA EE : JAVA Enterprise Edition

  • JSP와 Servlet을 만들고 실행하는 규칙과, EJB(Enterprise JavaBeans)의 분산 컴포넌트, 웹 서비스 규칙 등을 추가로 갖고 있습니다.

Tomcat은 JAVA EE8에서 Servlet, JSP/EL, WebSocket를 구현하고 있습니다.

굉장히 많은 요소들이 나오죠? 톰켓은 그중에서 딱 3가지만 구현하고 있으니 세개만 공부하면 됩니다!
자 이제 3가지를 차근 차근 알아보러 가보도록 하겠습니다.

3가지 중 하나만 Servlet 딱 하나만 하자!

그렇다 JSP/EL, WebSokcet을 당장은 우리가 직접 다룰 일이 없다. 그렇다고 해서 나몰랑~해두 된다는 것이 아니다.
무엇을 구현하고 있는지 알았고 현재 우선적으로 알아야 하는 것이 Servlet일 뿐이다.

Tomcat은 Servlet container다!

서블릿의 탄생 배경 및 정의

자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램입니다.
서블릿 컨테이너는 본질적으로 서블릿과 상호 작용하는 웹 서버의 일부입니다.

Servlet에 대한 상세한 이해를 위한 참고 블로그 링크들
제 4장 서블릿의 이해
서블릿 컨테이너, 스프링부트 동작 과정
[Web] Servlet이란

위의 링크에 상세하게 Servlet에 대해 나와있으니 꼭 읽어보길 추천합니다.

그런데 우리는 서블릿을 구현 한적이 없다.

이제 감이 오는가? 우리가 직접 구현 해야 할 Servlet을 스프링 MVC에서 대신 구현해주고 있다.
DispatcherServlet이 있기 때문에 우리가 어노테이션을 통해 컨트롤러 등을 설정 할 수 있었던 것이다.
그래서 우리가 웹 프로그래밍을 하기 위해 스프링을 사용하고 있었던 것이다.

전체적인 흐름

코드 작성부터 작동 하기까지의 과정

만약 스프링이 없었다면 Servlet클레스를 직접 상속 받아 구현 해야합니다.
그리고 애플리케이션 코드들이 Servlet 단위로 Tomcat에 의해 컨트롤 됩니다.

세부적으로 서블릿 컨테이너는 어떻게 작동하는가

서블릿 컨테이너인 Tomcat이 Servlet를 관리하고 클레스가 로딩되어 있지 않다면
로딩 과정을 거쳐 사용되고 파괴 됩니다.

Tomcat이 JVM 내부에서 어떻게 트래픽을 처리하는가

Tomcat는 웹 컨테이너를 구현한 자바프로그램으로 JVM에서 작동하게 됩니다.
위의 구조에서 중요 한 것은 http 요청에 따라 쓰레드를 할당 하는 것입니다.
단일 프로세스 멀티 쓰레드를 통해 동시 요청을 처리 할 수 있게 됩니다.

(탐구) 탐구의 결과

Apache Tomcat은 Java 서블릿 컨테이너이며 JVM (Java Virtual Machine)에서 실행됩니다. java Servlet 및 JSP API의 구현을 활용하여 Tomcat은 클라이언트로부터 요청을 수신하고 컨테이너 관리 Java 클래스를 동적으로 컴파일하여 관련 애플리케이션 컨텍스트에 지정된대로 요청을 처리하고 그 결과를 클라이언트에 반환 할 수 있습니다.
Tomcat는 내부적으로 기본 200개로 설정 된 쓰레드풀을 통해 동시 요청을 개별 쓰레드를 통해 할 수 있습니다.
그리고 왜 스프링을 사용해서 코드를 작성하고 있는지도 알 수 있었습니다.

이를 통해 스프링 코드를 주의 해야 할 점을 알게 되었습니다.

  1. 스프링 빈이 Stateless여야 한다. (공유 자원 문제)
  2. 멀티 쓰레드를 통한 힙 영역의 객체 생성에 유의 해야함 (Stop-The-World) 지역 변수를 활용하자.
  3. 다른 요청에 따라 DB락이 왜 걸렸는지 알 수 있었습니다. 물론 DB 테이블 문제였지만..
profile
제빵사에서 개발자되기
post-custom-banner

0개의 댓글