Tomcat을 사용한 통신 정리

Jan 24, 2024
Tomcat을 사용한 통신 정리

Apache: 프로그램
Tomcat : 애플리케이션
 
 
notion image

연결 순서

  1. 사용자 소켓이 웹 서버(Apache) 소켓에 연결을 요청함
      • 요청 프로토콜 : Get
      요청 시) header 데이터는 있으나 body 데이터는 없음
      요청 정보를 ..해서 다 볼 수 있음
      응답 시) body 데이터가 생김
      uri
      프로토콜에 의해 요청 내용에 들어있는 내용을 제외하고도 많은 데이터들이 자동 전송됨
      • BufferedWriter에 담겨서 전송됨
      전송되는 데이터의 데이터 타입은 문자열!
       
  1. 웹 서버(Apache)의 리스너 포트(8080)가 요청을 감지
      • 랜덤으로 포트를 정해서 새로운 소켓이 생성되고 리스너 포트와의 연결이 끊김
      • 데몬 : 언제 요청이 올지 모르기에 계속 while문을 돌리면서 요청을 기다림
      • BufferedReader에 담김
      문자열을 파싱해서 자신의 object(객체)로 만들어야만 분석이 가능함
      클래스에 변수를 만들고 set에 객체를 저장
 
  1. 문지기를 만남
      • web.xml 파일을 보고 있음
      명령을 내릴 때 작성하고 문지기가 할 일이 적혀있음
      • 필터 역할을 함
      통과시킬지 돌려보낼지 결정함
      목적지가 없으면 인덱스를 알려줌
      ex) 중국 ID 다 차단 → 웹 서버에 중국 ID를 가진 사용자는 접근할 수 없음
      • 가공이 가능함
      stream 필터와 같은 것
      ex) 안녕 → 안녕! : 가공-느낌표 추가
       
  1. Apache에서 파일을 찾아줌
      • if문을 사용해서 파일 찾기는 Apache
      식별자 요청은 Tomcat 에게 위임
      프로그램마다 책임이 다르고 식별자 요청은 Tomcat의 책임
      Apache와 Tomcat 의 사이에도 OS를 거쳐 통신하기에 버퍼가 생김
      • 데이터를 관리하는 webapp이라는 폴더에서 파일을 찾음
      • 정적 페이지 : 동일한 내용
      • 식별자 요청(identifier request)
       
  1. Tomcat = Web Application Server(WAS)
      • 식별자 요청(identifier request) 내역을 파싱함
      • Tomcat이 분석할 수 있는 Java object로 만듦
      Java 언어를 사용함
      Java class가 컴파일이 되어야 실행되기에 컴파일러(Java)가 필요함
      • HttpServletRequest→ 요청 데이터를 담을 객체 생성
      • HttpServletResponse → 응답할 데이터를 만들어 담을 객체 생성
      BufferedReader는 HttpServletRequest와 연결 → 요청이 들어 있음
      BufferedWriter는 HttpServletResponse와 연결 → 비어있다가 코딩후 응답할 자료가 담김
      • 동적 페이지 : 요청에 대한 내용이 계속 바뀌는 것
      코딩 작업을 해야 만들 수 있음
      • Tomcat 의 역할
      1) 서버 소켓 만들기
      2) 반이중 소통 만들기
      3) 요청에 응답하는 구조 만들기
      4) 요청자에 따라 요청을 감시할 스레드 1개와 요청자마다 연결될 스레드가 1개씩 추가
      5) 몇 명이 접속해야 서버가 터지지 않고 유지되는지 알고 제한을 걸어줌
       
  1. Servlet class
      • Tomcat이 new해서 메모리에 띄워줌
      • Tomcat이 service라는 메서드를 실행
      필요한 파라미터 두 개(HttpServletRequest, HttpServletResponse)를 넣어줌
      개발자는 메서드 내부를 코딩하면 됨
      • Dispatcher 호출 → Dispatcher class 생성
      • 작업이 종료되면 메모리에서 사라짐
        • 끝나기 전에 BufferedWriter에 담아서 응답해야 함
      • Front Controller : 모든 컨트롤러들의 맨 앞에 있음
      • 사용자의 요청이 들어올 때마다 Servlet이 생성됨
        • 요청이 다르면 요청마다 스레드를 따로 가지고 있어야지 아니면 혼란이 생길 수 있음
           
** 다양한 요청이 가능할 경우)
1) 요청 데이터를 모두 파싱해야함
2) 코드가 엄청나게 지저분해짐
⇒ 레이어를 만들어 SRP의 원칙을 지킴
 
** 만약 특정 요청 내역이 특정 메서드를 실행하게 되어 있다면)
1) 조건문 없이 바로 실행되어 분기가 가능
2) 라우터를 설계 안하면 servlet이 늘어남
⇒ servlet을 늘리지 않고 하나로 모아서 if로 분기 처리!
/* : 모든 요청을 다 받음
요청이 들어올 때 요청자 마다 1:1대로 안내해주는 것이 아니라 1명이 전체를 안내함
하나의 servlet에 요청을 다 보내서 분기 처리하기 좋음
공통 로직 처리하기 좋음
진짜 필요한 controller들을 실행시킴
단! 코드를 다 짜놔야 가능함
메모리가 너무 늘어나 부화가 많이 생김
→ 라우터가 무조건 필요함
Front Controller로 하나로 모아서 라우팅 해야 함

여기까지가 Apache, Tomcat이 해주는 일!
** if로 설계하는 방법은 기업마다 다 다르고 실수가 많이 발생할 수 있음
그래서 자유도를 줄이고 일관성을 높임
Spring. web이라는 Spring Framework에서 제공하는 웹 개발과 관련된 모듈의 이름
 
  1. Dispatcher(Servlet) class
      • 책임 : 라우팅 → Annotaion 보고

      여기까지가 Spring이 해주는 일!
       
      • 응답할 데이터를 BufferedWriter에 담아 전송함
      • controller에 요청
 
  1. Controller class
  • 에러가 뜨게 되면 요청자인 Dispatcher에게 책임을 위임함
  • reflection으로 만들면 동적 분석을 해주면서 메서드를 실행시켜줌
  • 매개변수에 HttpServletRequest를 적기만 하면 쓸 수 있음
 
  1. DAO
      • DB와 연결되어 있음
      • 요청 방식
      POST(Insert), PUT(update), GET(select), DELETE(delete)
 
 
 
 
Share article

vosw1