[Spring] 스프링 프레임워크 면접 질문
Spring Framework
블로그, 도서, 동영상 등 참고하였습니다
스프링 프레임워크(Spring Framework)
자바 개발을 편리하게 해주는 경량급 오픈소스 애플리케이션 프레임워크로 애플리케이션 개발하는데 필요한 기능들을 포괄적으로 제공하기 때문에 개발자들이 개발에 집중할 수 있음
Spring MVC 구조와 처리과정
- DispatcherServlet : 어플리케이션으로 들어오는 모든 Request를 받는 관문입니다. Request를 실제로 처리할 Controller에게 전달하고 그 결과값을 받아서 View에게 전달하여 적절한 응답등 생성할 수 있도록 흐름을 제어한다.
- HandlerMapping : Request URL 각각을 어떤 Controller가 실제로 처리할 것인지 찾아주는 역할을 합니다.
- Controller : Request를 직접 처리한 후 그 결과를 다시 DispatcherServlet 에게 돌려줍니다.
- ModelAndView : Controller가 처리한 결과와 그 결과를 보여줄 View에 관한 정보를 담고 있는 객체입니다.
- ViewResolver : View 관련 정보를 갖고 실제 View를 찾아주는 역할을 합니다.
- View : Controller가 처리한 결과값을 보여줄 View를 생성합니다.
-
클라이언트(Client)가 서버에 어떤 요청(Request)을 한다면 스프링에서 제공하는 DispatcherServlet 이라는 클래스(일종의 front controller)가 요청을 가로챈다.
(web.xml에 살펴보면 모든 url ( / )에 서블릿 매핑을하여 모든 요청을 DispatcherServlet이 가로채게 해둠(변경 가능)) -
요청을 가로챈 DispatcherServlet은 HandlerMapping(URL 분석등..)에게 어떤 컨트롤러에게 요청을 위임하면 좋을지 물어본다.
(HandlerMapping은 servlet-context.xml에서 @Controller로 등록한 것들을 스캔해서 찾아놨기 때문에 어느 컨트롤러에게 요청을 위임해야할지 알고 있다.) -
요청에 매핑된 컨트롤러가 있다면 @RequestMapping을 통하여 요청을 처리할 메서드에 도달한다.
-
컨트롤러에서는 해당 요청을 처리할 Service를 주입(DI)받아 비즈니스로직을 Service에게 위임한다.
-
Service에서는 요청에 필요한 작업 대부분(코딩)을 담당하며 데이터베이스에 접근이 필요하면 DAO를 주입받아 DB처리는 DAO에게 위임한다.
-
DAO는 mybatis(또는 hibernate등) 설정을 이용해서 SQL 쿼리를 날려 DB에 저장되어있는 정보를 받아 서비스에게 다시 돌려준다.
(이 때, 보통 Request와 함께 날아온 DTO 객체(@RequestParam, @RequestBody, …)로 부터 DB 조회에 필요한 데이터를 받아와 쿼리를 만들어 보내고, 결과로 받은 Entity 객체를 가지고 Response에 필요한 DTO객체로 변환한다.) -
모든 비즈니스 로직을 끝낸 서비스가 결과물을 컨트롤러에게 넘긴다.
-
결과물을 받은 컨트롤러는 필요에 따라 Model객체에 결과물 넣거나, 어떤 view(jsp)파일을 보여줄 것인지등의 정보를 담아 DispatcherServlet에게 보낸다.
-
DispatcherServlet은 ViewResolver에게 받은 뷰의 대한 정보를 넘긴다.
-
ViewResolver는 해당 JSP를 찾아서(응답할 View를 찾음) DispatcherServlet에게 알려준다.
(servlet-context.xml에서 suffix, prefix를 통해 /WEB-INF/views/index.jsp 이렇게 만들어주는 것도 ViewResolver) -
DispatcherServlet은 응답할 View에게 Render를 지시하고 View는 응답 로직을 처리한다.
-
결과적으로 DispatcherServlet이 클라이언트에게 렌더링된 View를 응답한다.
Spring IoC의 역할
- 제어권의 역전, 객체의 생성 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 말함
- 제어권이 스프링 프레임워크로 넘어오게 되면서 DI(의존성 주입), AOP(관점 지향 프로그래밍)등을 가능하게 함
IOC 컨테이너의 특징
- IOC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리.
- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가짐.
- 개발자들이 직접 POJO를 생성할 수 있지만, 컨테이너에게 맡김.
DL(Dependency LookUp)
- 클라이언트가 서버에게 자원을 요청할때, 찾는 행위로 객체의 아이디 및 타입을 통해서, Look up 해주는 것을 말함
- 저장소에 저장되어 있는 Bean에 접근하기 위해서, 컨테이너가 제공하는 API를 사용하여 Bean을 Look Up하는 것을 말함.
DI(Dependency Injection)
각 클래스간의 의존관계를 빈 설정(XML 파일) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말함.
Spring과 SpringBoot의 차이