Spring
⇒ IoC와 AOP를 지원하는 경량의 컨테이너 프레임워크
개발자가 직접 Servlet 클래스를 작성하지 않고, POJO 만으로 웹 애플리케이션을 구축할 수 있다는 것이 스프링의 특징이다.
컨테이너란?
특정 객체의 생성과 관리를 담당하며 객체 운용에 필요한 다양한 기능을 제공한다. 필요한 객체를 생성하고 객체 간의 의존관계를 관리한다는 점에서 스프링도 일종의 컨테이너라고 할 수 있다.
스프링 컨테이너의 종류
스프링에서는 BeanFactory와 이를 상속한 ApplicationContext 두 가지 컨테이너를 제공한다.
- BeanFactory: 스프링 설정파일(xml 혹은 java)에 등록된 bean 객체를 생성하고 관리하는 가장 기본적인 컨테이너 기능만 제공한다. 컨테이너가 구동될 때 객체를 생성하는 것이 아니라 클라이언트로부터의 요청에 의해서만 객체를 생성한다.(lazy loading)
- ApplicationContext: BeanFactory를 확장한 컨테이너로 트랜잭션관리나 메시지 기반의 다국어 처리 등 다양한 기능을 지원한다. (GenericXmlApplicationContext, AnnotationConfigApplicationContext ..)Spring 동작 원리낮은 결합도, 높은 응집도
스프링은 제어의 역행(IoC)을 통해 애플리케이션을 구성하는 객체 간의 느슨한 결합을 유지한다. 스프링의 IoC는 개체 생성을 자바 코드로 개발자가 직접 처리하는 것이 아니라 컨테이너가 대신 처리하게 한다. 그리고 객체 사이의 의존관계 역시 컨테이너가 처리한다.
1. IoC/DI (Inversion of Control / Dependency Injection) - 제어의 역전 / 의존성 주입
낮은 결합도, 높은 응집도
스프링은 제어의 역행(IoC)을 통해 애플리케이션을 구성하는 객체 간의 느슨한 결합을 유지한다. 스프링의 IoC는 개체 생성을 자바 코드로 개발자가 직접 처리하는 것이 아니라 컨테이너가 대신 처리하게 한다. 그리고 객체 사이의 의존관계 역시 컨테이너가 처리한다.
의존성 주입(DI)란 무엇인가
의존성은 객체와 객체의 결합 관계이다. 만약에 A라는 객체가 B라는 객체를 사용하고 있다. (new B()) 그렇게 되면 A는 B에 의존하게 된다. 의존성 주입은 A라는 객체에서 B를 직접 생성하는 것이 아니라 외부에서 B를 A에 주입함으로써 의존 관계를 없앨 수 있다. 이 것을 의존성 주입이라고 한다.
2. AOP(Aspect Oriented Programming)
관점 지향 프로그래밍이다.
기존의 비즈니스 로직 외 작성해야 하는 코드를 별도로 분리함으로써 개발자가 좀 더 비즈니스 로직에만 집중해서 처리할 수 있는 방법을 제공하는 기법
코드를 작성하다보면 다수의 모듈에 공통적으로 나타나는 부분이 존재한다.(보안처리, 로깅,트랜잭션 처리) 이 부분을 횡단 관심사 라고 한다.
2018/07/01 - [프로그래밍 노트/SPRING] - [Spring] Spring AOP(Aspect Oriented Programming)1
3. PSA(Portable Service Abstraction)
기술적인 복잡함은 추상화를 통해 분리한다.
Spring은 서블릿 애플리케이션임에도 불구하고 서블릿이 전혀 존재하지 않는다. 단지 @Controller 클래스의 @getMapping, @PostMapping, @RequestMapping 어노테이션을 사용해서 요청을 매핑한다. 실제로는 내부적으로 서블릿 기반으로 코드가 동작하지만 서블릿 기술은 추강화 계층에 의해 숨겨져 있다.
이렇게 추상화 계층을 사용해서 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것을 Service Abstraction이라고 한다.
Spring MVC 동작 방식
- 클라이언트가 요청한 URL을 DispatcherServlet이 가로챈다. (web.xml에 DispatcherServlet 등록)
- 가로챈 정보를 HandlerMapping에게 보내 요청을 처리할 수 있는 Controller를 찾아낸다. 디폴트 전략 : BeanNameUrlHandlerMapping, DefaultAnnotationHandlerMapping
- 요청을 찾은 컨트롤러에게 보낸다. (컨트롤러 → 개발자 구현 영역)
- 컨트롤러에서 해당 요청 처리 후 요청을 응답받을 View의 이름을 리턴. 이 이름을 ViewResolver가 먼저 받아 해당하는 View가 있는지 검색
- 해당 View가 존재한다면 처리결과를 View에 보낸 후 결과를 다시 DispatcherServlet에게 전달. DispatcherServlet은 최종 결과를 클라이언트에게 전송
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[SpringBatch] JobParameter와 Scope (0) | 2021.12.01 |
---|---|
[Spring] 스프링MVC 기본 설정(xml, java config) (0) | 2020.12.21 |
[Spring] AOP_3 : @AOP (0) | 2020.04.06 |
[Spring] 스프링 AOP_2 : 프록시 기반 AOP (0) | 2020.04.03 |
[Spring] 스프링 AOP_1 : 개념소개 (0) | 2020.03.29 |