스프링부트 개념정리(스프링 컨테이너, 응답)
스프링 컨테이너
스프링에서 아파치는 사용되지않고 전부 톰켓에서 관리되기때문에 아파치는 없다고 생각하고
request가 오게되면 web.xml에서 받아 Dispatch Servlet에서 컴포넌트 스캔을 하게된다
Dispatch Servlet에서의 주역할은 주소분배가있는데 이때 주소에맞게 보낼려면 메모리에서 주소에 대한 데이터를 찾아야한다 그러므로 주소분배 전에 src폴더에서 자바파일들이 메모리에 떠야한다 이 자바 파일들이 메모리에 뜰려면 new하여 stact에 저장되어야하는데 stack에 저장되는 데이터들은 static가 아니라 생겼다 사라졌다하는 객체 형태이다 그럼 모든 자료들을 static으로 하면 안되나요? 안됩니다 static로 하게되면 서로 공유되기때문에 충돌이 무조건 발생하게 될것이고 그렇담 객체 형태로 해야하는데 new를 해줘야하는데 누가 해주냐면 이역할을 DispatcherServlet이 해주게된다 스프링 부트에선 src의 모든 파일을 올스캔 올스캔 범위는 처음에 프로젝트를 생성할때 com.cos.pj라고하면 해당패키지에 속한 모든것을 올스캔하고 스캔된 값을 DispatchServlet이 모두 읽어 메모리에 저장을하게되는데 이때 저장할때도 어노테이션 @Controller, @Restcontroller 등등 우리가 자바클래스에 명시를 해놓으면 일치하는 어노테이션들을 모두 찾아 메모리에 띄우게 된다 어노테이션을 만들어도 되지만 미숙한 지금은 필요없어보이고 나중에 필요할때가 있을것이다
그럼 메모리에 데이터가 모두 올라왔으니 DispatherServlet는 주소에맞는 곳으로 주소분배를 하게됌
ContextLoaderLisner라는게 존재하는대 web.xml에서 DispatchServlet에 가기전에 실행되며 이역할은
첫번째 요청이 들어오게되면 1번째 스레드가 생기게되고 2번재는 2번째 스레드에 할당이되게 된다 이때 모든 스레드가 사용해도되는 공통적인 DB connection같이 사용해야 되는것을 ContextLoaderLisner에 저장이되고 공통적으로 사용되는것을 어디서 알아오냐면 root_ApplicationContext파일에서 읽어온다
applicationContext에는 root와 servlet 두종류가 존재하는데 servlet에서는 web과 관련된 정보를 가지고있고 root는 모든 정보를 가지게된다 그리고 root는 하나만 만들어져 관리가되고 servlet는 여러 스레드 형태로 관리가 된다 가지고있는데 이터를 정리하게되면
servlet에는 controllers, viewResolver, HandlerMapping
root에는 services, repositories
bean Factory
어느 클래스에 @configulation이라고 어노테이션이 달리고 그 클래스가 리턴하는 객체가 있다면 이런객체를 @Bean이라고 메모리에 뛰울 수 있게된다 근데 성질이 다르다 이 또한 IoC이며 Di를 이용하여 사용가능 미리 로드되지 않고 필요할때만 로드되기 때문에 lazy-loading이 된다
응답
get요청 uri = http://localhost:8080/post/1
해당 주소의 적절한 컨트롤러의 함수를 찾아서 실행
이때 리턴값에 "home"라고 명시하면 home.jsp파일을 찾아가야하는데 이런기능은 ViewResolver가 패턴을 만들어준다
DispatchServlet이 컴포넌트스캔하여 메모리에 A클래스 string "hello"을 반환하는 hello라는 함수를 찾았다 이때 hello를 response되게 되는데 hello라는 문자만 반환할것인가? 당연히 아니다 우리가 원하는건 WEB-INF/views/hello.jsp라는 jsp파일을 클라이언트에게 보여주고싶다 이때 앞의 경로(prefix)와 뒤 .jsp()(subfix)를 알아서 달아주게된다
홈페이지가 아닌 데이터 객체를 반환하고싶다면 현재 ViewResolver이 설정되어있다는 가정하에 @responseBody를 붙이고 user라는 객체를 반환하게 되면 user의 id와 이름 등을 json형태로 반환해준다
응답을 할때 메세지 컨버터가 존재하는대 이 컨버터는 json인지 xml인지 알맞게 맞춰 응답을해주는데 좋은점은 만약 json보다 더 좋은 yaml이라는 데이터를 보낼때 메세지 컨버터만 yaml이라고 수정해주면 모든 데이터가 알아서 yaml로 바꿔 정상작동하게된다 컨버터가 없다면 일일이 모두 수정 해줘야한다
프로그램이 실행되는 과정