네트워크 상에서 동작하는 프로그램 간의 통신의 종착점(Endpoint). 즉, 네트워크에서 데이터를 통신을 할 수 있게 만들어주는 연결부.
소켓은 운영체제에 포함되어 있고, 소켓을 오픈할 때에는 포트번호가 필요하다.
클라이언트가 서버에 문서를 요청(Request)하면 서버는 해당 문서를 응답(Response)한다.
서버는 클라이언트의 IP를 몰라도 된다.
웹서버는 자바를 이해하지 못함. 따라서 톰캣 사용
클라이언트가 웹브라우저에서 읽지 못하는 코드(html, js, css 제외한)가 담긴 파일을 요청하면 웹서버는 해당 파일을 톰캣에 넘기고 톰캣은 결과물을 다시 웹서버로 넘긴다.
예를 들면 JSP파일에서 자바코드를 컴파일 한 후 다시 웹서버(아파치)에 돌려준다. 그럼 해당 웹서버는 톰캣으로부터 받은 HTML을 Response 해준다.
URL (Uniform Resource Locator)
- 자원의 위치를 통해 자원을 요청하는 방식. 웹서버의 파일 위치.
- ex) http://deannn.tistory.com/sample.png
URI (Uniform Resource Indentifier)
- 식별자를 통해 자원을 요청하는 방식
- ex) http://deannn.tistory.com/picture/sample
웹서버에 진입을 했을 때 최초로 할 일이 적혀있는 파일
Session
- 인증을 통해서 접속하는 방법.
- 유효시간을 정하게 되면 각 Session을 해당 시간동안만 접속이 가능하다.
- 정해진 유효시간보다 더 오래 접속하고 싶다면, 재인증을 통해서 갱신하면 된다.
MimeType
- 서버에 들어올 때 가지고 오는 데이터의 타입
- resquest : 서버에게 요청한 정보가 들어있는 객체
- response : request를 토대로 서버에서 응답한 데이터를 담을 객체
필요한 클래스 요청이 도달했을 때 FrontController에 도착한 request 와 response를 그대로 유지시켜준다.
페이지를 이동할 때 RequestDispatcher를 이용하면 이전 페이지에서의 데이터를 그대로 가져올 수 도 있다.
FrontController 패턴을 직접 짜거나 RequestDispatcher를 직접 구현할 필요가 없다. 스프링에는 DispatcherServlet이 있기 때문.
DispatcherServlet은 FrontController 패턴 + RequestDispatcher이다.
DispatcherServlet이 자동생성되어 질 때 수 많은 객체 생성(IoC)된다. 보통 필터들이고, 해당 필터들은 내가 직접 등록할 수도 있지만 기본적으로 필요한 필터들은 자동 등록 되어진다.
request가 들어오면 톰캣에서 web.xml을 지난 후, ContextLoaderListner를 통해 공통적으로 사용하는 데이터를 띄운 후, DispatchServlet(주소 분배 역할)을 통해 목적지인 class로 가게 된다.
ContextLoaderListner는 모든 스레드에서 공통적으로 사용하는 데이터들을 가저갈 수 있게 하는 역할인데, 공통적인 것들을 스레드별로 모두 만들면 낭비되기 때문에 DispatcherServlet 이전에 공통적인 것들은 모두 가져간다. (ex. DB 에 관련된 데이터)
root_ApplicationContext 파일(xml, java ...) 은 공통적으로 사용하는 데이터를 띄우고 IoC 컨테이너에서 관리해준다. ContextLoaderListner는 root_ApplicationContext 파일을 통해 공통적으로 사용하는 데이터를 가져간다.
DispatchServlet가 주소 분배를 하기 위해서는 컴포넌트 스캔을 해야 하는데, (Springboot 기준) 해당 패키지의 소스폴더에서 자바 파일을 전체 스캔하여 파일에서 필요한 클래스만 메모리에 띄운다. 메모리에 띄워야 request 들어온 것들이 목적지로 찾아갈 수 있다.
필요한 클래스인지 판별하는 방법은 어노테이션을 통해 알게 되는데, 대략 아래의 어노테이션들을 메모리에 띄운다. 필요한 경우, 어노테이션을 만든 후 메모리에 띄울 수 도 있다.
DB는 ContextLoaderListner 단계에서 띄워지고, 이 단계에서는 DispatcherServlet에서 아직 클래스들을 메모리에 띄우지 않았기 때문에 클래스에 접근을 하지 못하지만, 나중에 DispatcherServlet에서 매핑된 클래스에서는 ContextLoaderListner에서 띄워진 DB에 접근이 가능하다.
DispatcherServlet에 의해 생성되어지는 수 많은 객체들은 Application Context에서 관리된다. 이것을 IoC라고 한다.
IoC란 제어의 역전을 의미한다. 개발자가 직접 new를 통해 객체를 생성하게 된다면 해당 객체를 가르키는 레퍼런스 변수를 관리하게 어렵다. 그래서 스프링이 직접 해당 객체를 관리한다. 이 때 우리는 주소를 몰라도 된다. 이유는, 필요할 때 DI하면 되기 때문이다.
DI를 의존성 주입 이라고 한다. 필요한 곳에서 ApplicationContext에 접근하여 필요한 객체를 가져올 수 있다. ApplicationContext는 싱글톤으로 관리되기 때문에 어디에서 접근하든 동일한 객체라는 것을 보장해준다.
ApplicationContext의 종류에는 두가지가 있는데, root-applicationContext와 selvlet-applicationContext 이다.
a. Servlet-applicationContext
b. root-applicationContext
root-applicationContext는 해당 어노테이션을 제외한 어노테이션 Service, Repository 등을 스캔하고 DB 관련 객체를 생성한다. 스캔이란 메모리에 로딩하는 것을 뜻한다.
servlet-applicationContext에서는 root-applicationContext가 로드한 객체를 참조할 수 있지만 그 반대는 불가능하다. 생성시점의 차이 때문이다.
필요한 객체를 Bean Factory에 등록할 수 도 있다. 여기에 등록하면 초기에 메모리에 등록되지 않고 필요할 때 getBean()이라는 메소드를 호출하여 메모리에 로드할 수 있다. 이것 또한 IoC이다. 그리고 DI하여 사용할 수 있다.
ApplicationContext와 다른 점은 Bean Factory에 로드되는 객체들을 미리 로드되지 않고 필요할 때 호출하여 로드되기 때문에 lazy-loading이 된다는 점이다.
GET 요청 => http://localhost:8080/post/1
-> 해당 주소 요청이 오면 적절한 컨트롤러의 함수를 찾아서 실행
참고: https://minwan1.github.io/2017/10/08/2017-10-08-Spring-Container,Servlet-Container/
response할 때 html 파일을 응답할지 Data를 응답할지를 결정해야 한다.
html파일을 응답하게 되면 ViewResolver가 관여하게 된다.
ViewResolver는 response 할 때 해당 파일의 위치(prefix)와 확장자(postfix?)를 같이 붙여서 리턴되도록 도와주는 역할이다.
ex) return "hello"
=> WEB-INF/views/hello.jsp
Data를 응답하게 되면 MessageConverter가 작동하는데, 메시지를 컨버팅 할 때 기본 전략은 json이다.
Data를 리턴할 때는 메소드에 @ResponseBody 어노테이션을 붙인다. 그럼 리턴값을 File이 아닌 Data로 취급한다.
그리고 리턴값이 객체이면 MessageConverter가 이 객체를 json으로 변환 후 리턴한다.
1~4 : 톰캣이 실행 될 때 실행되는 단계
1. web.xml이 읽혀짐.
2. Servlet Container 생성
3. applicationContext(roor-context) 읽혀짐.
4. 3번에 의해서 DB 관련 객체들이 메모리에 로드됨.
5. 사용자에 의해 요청이 들어옴.
6. DispatcherServlet이 생성. 모든 소스파일들을 스캔 후 필요한 클래스들을 메모리에 로드.
7. presentation-layer(servlet-context) 읽어서 FrontController 패턴 설정.
8. FrontController 패턴에 해당하는 요청은 따로 가져와서 필요한 클래스에 매핑하여 보낸 후 response.