1. IoC (Inversion of Control)
IoC는 Inversion of Control의 약자로 "제어의 역전"이라는 뜻이다. 일반적인 프로그래밍은 프로그래머가 코드로 직접 객체를 생성하고 호출하는 과정을 거친다. 이러한 제어 시스템이 역전되어 메서드나 객체의 호출을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 제어의 역전이라고 한다. IoC의 장점으로는 다음과 같은 것이 존재한다.
- 객체간 결합도를 낮춘다.
- 가독성이 증진된다
- 코드 중복을 방지한다
- 유지 보수가 용이하다.
이러한 IoC의 핵심 원리는 스프링 프레임워크가 객체의 생성과 의존관계를 컨테이너가 자동으로 관리한다는 것이다. 이때 스프링은 IoC를 Dependency Lookup(DL), Dependency Injection(DI) 두 가지 형태로 지원한다.
2. Dependency Lookup (DL)
Dependency Lookup(DL)이란 "의존성 검색"으로 컨테이너가 애플리케이션 운용에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색하여 사용하는 방식을 말한다. 즉, Bean 객체에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup(검색)한다. 아래 url에서 사용한 방법과 같이 Bean 정보를 XML 파일에 등록하고, getBean을 통해 객체를 검색하여 가져오는 방식이 DL에 해당한다.
해당 방식은 애플리케이션 개발 과정에서는 거의 사용하지 않고 대부분 Dependency Injection을 사용한다.
3. Dependency Injection (DI)
Dependency Injection(DI)은 "의존성 주입"으로 객체 사이의 의존 관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리하는 것을 말한다. 즉, 클래스 간의 의존 관계를 컨테이너가 주입한다는 것이다. 이때 의존성이란 무엇일까? 의존성(Dependency)은 객체와 객체의 결합관계를 말한다. 만약 한 객체가 다른 객체의 변수나 메소드를 사용한다면 해당 객체에서 이용할 객체를 생성해야 한다. 예를 들어, A 클래스에서 B라는 클래스의 메소드를 활용한다고 하면 A는 B 객체를 생성해야 한다. 이때 A 클래스의 로직이 변경되면 B 클래스의 메소드를 수정해야 할 수 있고, B 클래스의 응답 형식이 변경되면 A 클래스도 변경될 수 있다. 즉, A와 B 클래스의 결합도가 높아 유지 보수가 힘들어진다. 하지만 스프링에서는 A 클래스의 객체가 직접 B 객체를 생성하게 하지 않는다. 즉, 스프링 컨테이너가 B 객체를 성성하여 A 객체에 주입해준다. 따라서 A는 B 객체를 마음대로 갈아 끼울 수 있기 때문에 결합도가 낮아지게 된다. 이때 DI를 수행하는 방식에는 Field Injection, Setter Injection, Constructor Injection이 있다. 해당 방식들은 이후에 따로 살펴보자.
참고) 결합도란?
결합도란 하나의 클래스가 다른 클래스와 얼마나 많이 연결되어 있는지를 나타내는 표현이다. 한 클래스가 다른 클래스에 대해 너무 자세히 알고 있다면 두 모듈은 높은 결합도를 가지게 된다. 반대로 어떤 클래스가 다른 클래스에 필요한 지식만 가진다면 두 모듈은 낮은 결합도를 가진다. 그러면 높은 결합도를 가지는 것이 무엇이 문제일까? 차를 예시로 들어보자. 자동차에는 핸들, 바퀴, 엔진 등 여러 부품들이 존재한다. 이때 엔진이 고장나 엔진을 교체하는데 핸들이나 바퀴를 함께 교체해야 한다면 자동차의 설계가 잘못되었다고 생각할 것이다. 이러한 문제를 방지하기 위해서 객체지향에서는 클래스 혹은 메서드가 적절한 수준의 관계만을 유지하도록 권장한다. 즉, 낮은 결합도를 가지는 프로그램이 좋은 프로그램이라고 볼 수 있다.
'BackEnd > Spring' 카테고리의 다른 글
[Construction Injection] 의존관계 변경 (0) | 2023.04.28 |
---|---|
[Spring] Constructor Injection 기본 사용법 (0) | 2023.04.27 |
[Spring] XML 파일 설정 (태그 및 속성) (0) | 2023.04.27 |
[Intellij] Bean 클래스 등록 및 스프링 컨테이너 구동 (0) | 2023.04.23 |
[Intellij] Spring xml 파일 (applicationContext.xml) 생성 (0) | 2023.04.23 |