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