Spring Framework의 특징
- POJO (Plain Old Java Object) 방식의 프레임 워크
- 의존성 주입(Dependency Injection)
- 제어 역전(Inversion of Control)
- 관점지향 프로그래밍(Aspect Oriented Programming) 지원
- 높은 확장성과 다양한 라이브러리 지원
- MVC
📌 Spring Framework의 본질은 객체 관리 컨테이너이다.
✔️ 스프링은 자바객체를 담고 있는 컨테이너이다.
✔️ 스프링 컨테이너는 이들 자바 객체의 생성과 소멸과 같은 라이프사이클을 관리한다.
✔️ 언제든지 스프링 컨테이너로부터 필요한 객체를 가져와 사용할 수 있다.
EJB가 기능 작성을 위해서 인터페이스를 구현하거나 상속하는 것에 비해(많은 규칙이 존재하는 것에 비해) 일반적인 자바 객체를 이용해서 그대로 사용할 수 있음을 의미한다. 경량 프레임워크화를 지원한다.
특정 환경이나 기술에 종속적이지 않은 객체지향 원리에 충실한 자바객체이다. 테스트화가 용이하고, 객체지향 설계를 자유롭게 적용할 수 있다.
프레임워크 내부에서 사용되는 객체간 의존성이 존재할 경우, 개발자는 의존성에 관련한 설정만 해주면 실제 의존성 생성은 프레임워크가 담당한다.
쉽게 말하면, 의존성은 곧 'new 객체생성연산'이고, 의존성 주입이라함은 자신이 사용할 객체를 직접 만드는 대신 다른 곳(프레임워크)에서 객체를 만들어 넣어준다는 뜻이다.
예를 들어, Controller가 VideoDaoImpl 객체를 직접 만들어 필요한 기능(select( ), addReview( ) 메서드들)을 불러와 작업했다면, Test 클래스에서 Dao 객체를 대신 만들어 넣어준다.
💡 참고 디자인 패턴: 전략 패턴(DI를 정확히 표현), 템플릿 메소드 패턴
제어 역전을 통해 객체 및 프로세스의 제어를 프레임워크가 담당한다. 즉, 자신이 사용할 객체를 다른 곳에서 만들어주는데 그 '다른 곳'이 프레임워크이다. 필요에 따라 개발자의 코드를 호출한다.
(종속성에 대한 인스턴스화를 직접 제어하지 않고 이를 역전시키기 때문에 이러한 프로세스를 제어 역전-Inversion of Control 이라고 한다.)
👉기존에는 자신이 의존성(객체생성)을 가졌다면 그 의존성을 다른 곳에 넘김 - 제어 역전(IoC)
👉제어가 역전됨에 따라 프레임워크가 나에게 의존성을 넣어주는 행위 - 의존성 주입(DI)
즉, 제어 역전함으로써 객체생성의존성에서 벗어나게 해준다.
트랜잭션, 로깅 등 여러 모듈에서 공통적으로 사용하는 기능에 대해서 별도로 분리하여 작성, 관리할 수 있는 기능을 제공한다. 따라서 관심사의 분리를 통해서 소프트웨어의 모듈성을 향상시킨다.
기존의 라이브러리를 스프링에서 사용할 수 있는 기능을 지원하고 있다. 특히 영속성 관련하여 MyBatis나 Hibernate 등의 완성도 높은 데이터베이스 라이브러리와 연결가능한 인터페이스를 제공한다.
💡ORM(Object Relation Mapping): MyBatis나 Hibernate는 ORM이다. 여기서 Object는 DTO의
Object이고, Relation은 테이블을 뜻한다. 따라서 Object와 Relation을 매핑시켜주는 라이브러리이다.