항해99 3주 차 WIL

홍당무·2022년 12월 5일
0

IoC, DI, Bean

IoC (Inversion of Control)

정의 및 특징

제어역전이라는 뜻으로, 일반적인 프로그램에서 객체의 생명주기, 즉 객체의 생성, 초기화, 소멸, 메서드 호출 등을 클라이언트 구현 객체가 직접 관리하는 방식과 더 나아가 다른 사람이 작성한 외부 코드(라이브러리)를 호출하더라도 해당 코드의 호출 시점 역시 직접 관리하는 방식이 아닌 이러한 생명주기를 직접 관리하지 않는 경우를 칭한다.

Spring framework를 사용할 때, Controller, Service 같은 객체들의 동작을 우리가 직접 구현하긴 하지만 해당 객체들이 어느 시점에 호출될 지는 신경쓰지 않는다. 단지 스프링이 요구하는대로 객체를 생명하면 프레임워크가 해당 객체들을 가져다가 생성하고 매서드를 호출하고 소멸시키기 때문이다. 즉, 프로그램의 제어권이 역전된 것이다.

이점

- 프로그램의 진행 흐름과 구체적인 구현을 분리시킬 수 있다.

- 개발자는 비즈니스 로직에 집중할 수 있다.

- 구현체 사이의 변경이 용이하다.

- 객체 간 의존성이 낮아진다.

DI (Dependency Injection)

정의 및 특징

의존 관계 주입이라고도 하며, 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법이다. (new 연산자를 이용한 객체 생성)

- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야 한다.

- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다.

- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

강한 결합

객체 내부에서 다른 객체를 생성하는 것은 강한 결합도를 가지는 구조이다. A 클래스 내부에서 B 라는 객체를 직접 생성하고 있다면, B 객체를 C 객체로 바꾸고 싶은 경우에 A 클래스도 수정해야 하는 방식이기 때문에 강한 결합이다.

느슨한 결합

객체를 주입 받는다는 것을 외부에서 생성된 객체를 인터페이스를 통해서 넘겨받는 것이다. 이렇게 하면 결합도를 낮출 수 있고, 런타임 시에 의존관계가 결정되기 때문에 유연한 구조를 가진다.

Bean

정의

스프링 IoC 컨테이너가 관리하는 객체

Container : 사전적 의미는 무언가를 담는 용기, 그릇. Spring의 컨테이너는 프로그래머가 작성한 코드의 처리과정을 위임받아 독립적으로 처리하는 존재

이점

- 의존성 관리가 수월해진다.

- 싱글톤의 형태이다.

singleton : 기본(Default) 싱글톤 스코프. 하나의 Bean 정의에 대해서 Container 내에 단 하나의 객체만 존재한다.
prototype : 애플리케이션에서 요청 시(getBean()) 마다, 스프링이 새 인스턴스를 생성

방법

ApplicationConfig 라는 자바파일을 만든 후에 @Configuration 이라는 어노테이션을 달고 빈으로 등록할 곳에 @Bean 어노테이션과 함께 코드를 작성하면 빈으로 등록이 된다. 하지만 이 것도 하나하나 빈으로 등록해야하는 번거로움이 있다.

그래서 Spring-Boot는 어노테이션을 통해 Bean을 설정하고 주입 받는 것을 표준으로 삼는다.

ex)Bean, @Component, @Controller, @Service, @Repository

@Bean은 개발자가 컨트롤 할 수 없는 외부 라이브러리를 Bean으로 등록하고 싶은 경우.

@Component는 개발자가 직접 컨트롤 할 수 있는 클래스를 Bean으로 등록하고 싶은 경우.

@Controller, @Service, @Repository 등은 @Component를 비즈니스 레이어에 따라 명칭을 달리 지정해준 것Container에 있는 Spring Bean을 찾아 주입시켜주는 Annotation이다.

Reference

https://devlog-wjdrbs96.tistory.com/165

https://velog.io/@ohzzi/Spring-DIIoC-IoC-DI-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0

https://namu.wiki/w/Spring(%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)

https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%94%84%EB%A7%81_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC

profile
공부하는 백엔드 개발자

0개의 댓글