스프링부트를 이용해서 혼자서 공부겸 개발을 하다가 보니까 각종 에러나 예외에 대해 맞닥드리게 되는데..
전체적인 구조에 대해 이해도가 없어서 에러내용을 봐도 감이 오질 않았다..
사실 전체적인 구조에 대해 공부를 해놨지만.. 계속 코딩을 하고 스프링부트 자체가 기본적으로 제공을 해주는 것이 많아서
까먹게 되어서 복습겸 정리를 할려고 이 글을 정리를 해야겠다..
처음으로 ServletContainer 와SpringContainer을 이해하기 전에
WebServer와 was(WebApplicationServer)에 대해 간단히 이해를 해보자
WebServer는
정적 데이터만 전달을 하는 webServer이다.
기본적으로 client에 requset를 받아서 정적인 컨텐츠 예를 들어(css,html)등등..을 response를 해주는 서버이다
동적인 컨텐츠를 처리를 해주는 어떤 무엇(?)이 없다.
- 종류는 Apache, Nginx등등..있다
이에 반대로 was는 동적인 데이터를 제공한다, 동적인 데이터를 제공하니까 그럼 was 에서는 WebServer 에서는
제공하지 않는 무엇(?)이 존재 할 것이다.
- 종류는 Tomcat, JBoss등등이 있다
정리를 하면 WebServer는 정적, Was는 동적인 데이터를 제공합니다
서로 의존하는 관계가 아니기 때문에 각각 독립적으로 공존을 할 수 있다
was는 WebServer의 역할을 수행할 수 있다.
그래서 was안에 webserver를 포함시키는 경우도 있다.
추가로 WebContainer라는 개념을 알아두자.
CGI(CommonGateWay Interface)
- 웹서버와 외부 프로그램간의 서로 정보를 주고 받는 Interface로써 규약이다
- 위에 말했다시피 동적인 컨텐츠를 처리해주는 무엇(?)이라고 할 수 있다.
- Java는 따로 CGI 와 같은 기능을 위해 WebContainer 라는 것이 필요하다.
- WebContainer가 있기에 위에 이미지를 보다시피 JSP와 Servlet를 사용할 수 있다
이렇게 자바에서는 WebContainer가 있기에 서블릿과 JSP를 상호작용하며 동적인 컨텐츠를 제공할 수 있다.
WebContainer는 기본적으로 Request마다 스레드(여기도 중요하다)를 만들어서 서블릿에게 연결을 한다
그럼 서블릿에게 requset를 전달을 하며 서블릿 메서드를(규약에 맞게) 실행을 한다
(HttpServlet를 구현한다)
서블릿 interface에는 크게 3가지의 메서드가 존재하는데
init() -> servlet instance를 생성해준다. 최초로 1회 실행을 한다.
service(), doGet(),doPost()..등등.. -> 실제 기능이 수행이 된다 개발자의 개발로직에 맞게 실행된다.
destory()->servlet instance를 제거한다.
WebServiceArchitecture는 다양하게 존재를 하는데 이해가 쉬운 이미지를 가져왔다
위에 이미지를 보면 바로 이해하기가 쉬울 것이다
- 최초로 requset를 보내면 WebServer가 HTTP요청을 받아서 그 요청을 WAS의 구성요소인 WebContainer에게 전달을 한다 (즉 WAS에게 전달을 한다)
- webContainer가 (ServletContainer라고 혼용하여서 부르는듯..?)가 web.xml를 참조하여서 서블릿에 대한 스레드를 생성하고,(이 부분에서 설정에 따라 lazy loading이면 호출이 올 때마다 해당 서블릿에 대해 최초로 init()을 하여서 메모리에 띄우고 아니면 preloading이면 먼저 init()을 한다)
- HttpServletRequest ,HttpServletReponse를 생성하고 그 요청에 맞는 서블릿에게 전달을(service()) 한다.
- 요청을 받은 서블릿은 service()메서드을 실행하며 요청에 맞게 doget(), doPost()개발자가 개발한 개발로직을 수행을 합니다
- 수행이 완료가 되었으면 이제 앞서 생성한 HttpServletReponse에 담아 WebServer에게 전달을 하며 스레드를 종료 및 HttpServletRequest ,HttpServletReponse를 제거합니다.
- 여기서 사용하는 스레드는 스레드풀을 사용을 한다.(스레드를 생성하고 바로 지우고 그런 행위는 너무 비용이 비싸다(멀티 스레드를 환경이다)).
- 톰캣이나 서버가 재시동 및 종료시에는 서블릿이 destroy()메서드를 실행
좀 더 자세히 보면 이런 구조이다.
위에 내용을 정리하고 읽다보니 뒤죽박죽 원래 어느정도 이해도가 없으면 이해가 안갈 것네요..
그리고 위에 글을 읽다보니 즉, 서블릿을 개발자가 관리를 하지않는다. web.xml에서도 서블릿에 대해 매핑에 대해 기술만 하고 개발자가 직접 서블릿을 생성과 개발을 하지 않는다. 여기서 IOC라는 개념이 들어가는 것 같다.
좀 더 자세한 내용은 다음에 작성을 해야겠다 머리속이 정리가 안된다...
그리고 다음으로 SpringContainer(ApplicationContext)에 대해 알아보자
container라는 개념이 많이 나오는데 어떤것을 포함한다고 보면 될 것같다.
스프링 빈을 생성, 관리하는 컨테이너이다. 위에 설명한 서블릿 컨테이너 서블릿 컨테이너처럼 IoC개념이 적용되어 빈들을 스프링컨테이너가 관리한다. 즉 빈의 lifeTime 생명주기를 관리해준다.
여기서 빈은 무엇일까?
스프링IOC컨테이너가 관리해주는 자바객체를 빈이라고 한다.
스프링환경에서 그냥 다 자바객체를 만든다고 스프링IOC에서 관리를 해주는 것이 아니고 등록된 자바객체(bean)들에 한에서 관리를 해준다 빈등록방법은 여기서 다룰 내용은 아닌거 같아서 패스!
또 런타임시에 빈들의 관계 설정을 해주는 것을 DI(Dependency Injection)라고 하는데, 스프링 컨테이너는 DI를 해주는 DI 컨테이너라고도 한다.
(스프링으로 개발을 하다보면 개발자가 직접 new연산자를 이용하여서 하는경우는 거의 없다.. 필요한 경우에는 있겠지만 이렇게 바로 ioc로 스프링컨테이너가 직접 만들어준다) <- 싱글톤으로 객체를 재활용한다.
근데 이렇게 IOC개념을 적용하는 이유가 무엇일까..?
- 개발자가 비즈니스로직에만 집중을 할 수 있다.
- 객체간의 결합도를 낮춰준다
- 가독성이 좋아진다
그리고DI의 개념 의존성 주입이라는 개념이 IOC랑 붙어서 항상 나오게 되는데
DI라는게 스프링IOC가 해주는 일이라고 항상 붙어서 나오는거 같다
DI는 서로 의존성있는 컴포넌트들 간의 관계를 개발자가 직접 코드로 명시하지 않고 컨테이너인 스프링이 런타임에 찾아서 연결해주게 하는 것이다.
DI에 대해 설명은
스프링DI <<< 스프링DI 여기에서 설명이 엄청 잘 되어 있으니 여기를 참조하여 보자
처음 스프링에 접했을때는 IOC,DI를 듣고 대충 그렇구나.. 이렇게 이해를 했지만
개발 및 공부를 하며 다시 글을 읽으면 좀 더 이해가 잘 가는거 같아서 좋다.
DI에 대해 좀 더 와닿던 이유가 스프링을 이용하여 개발을 할 경우에 대부분이 개발을 할 경우에 interface를 대부분 구현하여 impl class를 만들어서 개발을 한다. 이렇게 하는 이유가 있다
- 두 객체 간의 관계라는 관심사의 분리
- 두 객체 간의 결합도를 낮춤
- 객체의 유연성을 높임
- 테스트 작성을 용이하게 함
그리고 DI 의존성주입도 여러가지의 방법이 있다 크게
생성자주입, 필드주입, 수정자주입이 존재한다.
예전에는 간결하고 쓰이기 편한 필드주입을 많이 사용했다고한다..
하지만 외부에서부터의 접근이 막히며, DI를 지원하는 프레임워크가 아닌이상 사용할 수가 없다..
그래서 주로 생성자주입을 사용한다
생성자주입을 하는이유는 무엇일까?!!?
그이유는 크게 객체의 불변성을 확보를 하는이유가 된다
자바에서는 객체를 변경의 가능성 즉 setter를 지양을 한다. 그래서 처음에 객체를 생성을 할때 의존성을 주입을 하며,
수정과 불변성을 보장을 할 수 있으며 순환참조를 방지할 수 있다
여기까지만 알아보자...
References
https://mangkyu.tistory.com/150
[Web] Web Server와 WAS의 차이와 웹 서비스 구조 - Heee's Development Blog (gmlwjd9405.github.io)Tomcat, Spring MVC의 동작 과정 (taes-k.github.io)
[Web] Web Server와 WAS의 차이와 웹 서비스 구조 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
'Spring' 카테고리의 다른 글
세션관리 (0) | 2022.11.15 |
---|---|
DispatcherServlet (1) | 2022.11.11 |
디자인 패턴 - 생성패턴 -Factory Method (0) | 2022.06.11 |
SPRING MVC.2 (0) | 2021.03.23 |
Spring MVC (0) | 2021.03.22 |