사용자브라우저
<--컴퓨터 통신 영역
-->물리적컴퓨터(서버)
신호들이 서버로 전달될 때 신호들은 ip 주소를 보고 ip 주소에 해당하는 서버로 신호를 전달해준다.
IP : 포트 , 번호로 구성되어 있는데 IP 주소로는 신호를 "어떤 물리적 서버" 에 전달해줄 지, 포트 번호로는 해당 서버에서 "어떤 웹서버"로 신호를 최종적으로 전달해줄 지 판단해줄 수 있다.
웹 서버 : HTTP 요청을 받아서 그 요청을 전달하거나, 요청에 맞게 파일을 전달하는 역할
따라서 브라우저로부터 온 신호들은 최종적으로 웹 서버들에게 전달이 됨 (ex) APACHE, Nginx
그런데 웹 서버에서 또 다른 웹 애플리케이션 서버 , 파일 시스템(어떤 정보를 달라 라고 요청)으로 전달이 될 수도 있다 ...
(+ 웹 서버와 웹 애플리케이션 시스템은 서로 다르다! )
웹 서버 VS 웹 애플리케이션 서버
출처 : 블로그 출처1
출처 : 이미지 ,내용 출처2
웹 서버
(EX : Nginx, APACHE)
- 정적자원의 파일을 웹 클라이언트에게 제공할 때 사용
- 동적인 페이지 처리가 필요하다면 웹 애플리케이션 서버에 요청을 넘김
웹 애플리케이션 서버
(EX : 톰캣 - 호랑이얼굴고양이)
- 웹 서버로부터 요청을 받아서 처리, 결과는 웹 서버로 반환
- 주로 동적인 페이지 생성을 위한 데이터베이스 연동의 작업을 진행
=> jar 은 빌드된 결과물
=> jre 가 있는 환경에서 실행할 수 있도록 해주는 것
위의 MAIN 클래스가 JAR 의 원천이라고 할 수 있음
만약 우리가 배포를 하게 되면 이 jar 파일을 서버로 가져다가 / 혹은 이미지로 가져다가 작업을 한다
1) presentation 레이어 : 사용자와 직접적으로 맞닿는 부분
2) logic 레이어 : 요청을 처리하는 결정 짓는 부분
3) data 레이어 : 데이터의 표현을 저장, 불러오는 부분 (ㄹㅇ 실제 데이터는 아니라는 말)
1) controller - 디스패처 서버로부터 직접적으로 요청 받음 & 해당 요청을 검증
2) service - 컨트롤러가 검증한 데이터 받아서 사용자의 입력에 따른 데이터 조작을 수행
3) 레포지토리 - 데이터를 받아서 데이터를 저장하고, db로부터 데이터 불러와서 돌려주는 역할 수행 (db는 스프링 부트 외부에 존재!)
(+)
아래 기술한 스프링 구조 내용 , 이미지 출처 블로그 주소
- controller가 모든 요청 받는다
- 주소(URL)에 해당하는 모델 찾아서 기능 수행
- 해당하는 데이터를 보여줄 View를 찾는다.
- (Controller 파일 들어가면 다 명시되어있음)
Model
View
Controller
DispatcherServlet
Spring Framework가 제공하는 Servlet 클래스
사용자의 요청을 받는다.
Dispatcher가 받은 요청은 HandlerMapping으로 넘어간다.
HandlerMapping
사용자의 요청을 처리할 Controller를 찾는다. (Controller URL Mapping)
요청 url에 해당하는 Controller 정보를 저장하는 table을 가진다.
즉, 클래스에 @RequestMapping(“/url”) annotaion을 명시하면 해당 URL에 대한 요청이 들어왔을 때 table에 저장된 정보에 따라 해당 클래스 또는 메서드에 Mapping한다.
ViewResolver
Controller가 반환한 View Name(the logical names)에 prefix, suffix를 적용하여 View Object(the physical view files)를 반환한다.
예를 들어
view name: home,
prefix: /WEB-INF/views/,
suffix: .jsp는 “/WEB-INF/views/home.jsp”라는 위치의 View(JSP)에 Controller에게 받은 Model을 전달한다.
이 후에 해당 View에서 이 Model data를 이용하여 적절한 페이지를 만들어 사용자에게 보여준다.
장점
Navigation control is centralized - 컨트롤러가 페이지들을 결정하는 모든 로직을 가지고 있다.
유지보수가 쉽다
확장성이 좋다
테스트 하기 용이하다
단점
컨트롤러 코드를 직접 써야 한다. 컨트롤러가 수정되면 다시 컴파일해서 다시 deploy 해야 한다.
하드웨어 서버 - nginx (webserver) - Spring 부트 (톰캣이라는 웹 애플리케이션 서버 내장) - "스프링 부트 내부: 디스패처서버가 request 받고
1) 컨트롤러로 넘기고 서비스로 전달되어서 레포지토리에서 db에서 적절한 정보 꺼내오거나 데이터 저장하고 이를 다시 서비스 -> 컨트롤러에게 response 로 돌려주기
2) 뷰 resolver에게 전달해서 적절한 view를 response 로 돌려주기