컨테이너 (Container)
컨테이너는 인스턴스의 생명주기를 관리하며 생성한 인스턴스에게 추가적인 기능을 제공합니다.
예를 들어 Servlet을 실행해주는 WAS(Web Application Server)는 Servlet 컨테이너를 가지고 있다고 말합니다.
WAS에서는 URL로 특정 서블릿에 대한 요청을 받으면 메모리에 캐시되어있는지 확인 후, 최신버전이 있거나 메모리에 올라가있지 않을 경우 서블릿을 컴파일하여 메모리에 올린 후 실행합니다.
서블릿 클래스를 작성하는것은 개발자이지만 메모리에 올리고 실행하고 사용이 끝난 서블릿을 terminate 하는 작업들은 WAS의 Servlet 컨테이너가 대신해주고 있습니다.
IoC (Inversion of Control)
제어의 역전이라는 뜻으로 프로그램의 흐름을 개발자가 직접 제어하는 방식과 다르게 컨테이너에게 오브젝트 제어 권한을 주는것을 의미합니다.
자바 언어를 배울때 개발자가 main() 함수를 통해 프로그램을 실행하고 클라이언트가 직접 객체를 관리해주던 역할이 역전되었다고 생각해보면 되겠습니다.
IoC가 적용된 환경에서는 개발자가 클래스를 작성하고 어노테이션과 선언을 통해 필요한 정보를 입력하면 이를 알맞게 호출하는 것은 컨테이너의 역할입니다.
이러한 방식의 필요성은 AOP(Aspect Oriented Programming)의 필요성과도 연관되어지는데 비즈니스 로직을 제외하고 트렌젝션 처리와 같은 단순하고 반복적인 코드를 제거하고 객체지향방식에 알맞는 낮은 결합도를 유지하여 코드의 재사용성과 유지보수를 용의하게 합니다.
특히 리팩토링과 api 스팩 변경등에 대비하여 테스트 코드의 중요성이 강조되는 상황에서 Mock 객체를 간단하게 주입할 수 있다는 점 또한 중요한 이점입니다.
DI (Dependency Injection)
DI는 의존성 주입이라는 뜻으로, 클래스 사이의 의존 관계를 Bean 정보를 바탕으로 컨테이너가 자동으로 생성해 할당해주는 것을 의미합니다.
컴퓨터를 예로 들자면 컴퓨터에는 cpu, memory, HDD 등의 여러 부품들이 들어갑니다.
이 중 특정 CPU를 컴퓨터에서 사용한다면 DI를 적용하지 않았을 경우
class Cpu { ... } class Computer { Cpu i5 = new Cpu(); }
이러한 형태로 구성될 것입니다.
반면 DI가 적용된 코드는 아래와 같습니다.
@Component class Cpu { ... } @Component class Computer { @Autowired Cpu i5; }
그림과 같이 객체를 생성하는 코드 없이 컨테이너가 어노테이션으로 선언된 객체를 자동으로 할당해주게 되는데 이를 의존성 주입이라고 합니다.
AOP (Aspect Oriented Programming)
관점 지향 프로그래밍은 비즈니스 로직과 각 메소드에 반복적으로 등장하는 공통 로직을 분리함으로써 높은 응집도를 지원합니다.
AOP의 목표는 공통으로 사용하는 기능은 외부의 독립된 클래스로 분리하고, 해당 기능은 프로그램 내에서 선언적으로 적용하는것입니다.
각 기능들의 응집도를 고도로 높여 유지보수를 크게 향상시킬수있는 방법입니다.
'개발 공부 > Spring' 카테고리의 다른 글
[Spring] VO 객체를 map으로 변환하기 (0) | 2019.02.27 |
---|