티스토리 뷰

반응형

1. What is IOC ??

IOC(Inversion of Control)

스프링에서 일반적인 Java 객체를 new로 생성하여 개발자가 관리 하는 것이 아닌 Spring Container에 모두 맡긴다.

즉, 개발자에서 -> 프레임워크로 제어의 객체 관리의 권한이 넘어 갔음으로 "제어의 역전" 이라고 한다.\

IOC 개념의 등장

spring의 등장 이전 EJB (Enterprise JavaBeans) 개발자가 생성한 모든 객체는 직접 관리해야했고 로직이 개발의 규모가 커질 수록 코드의 복잡성과 함께 유지보수도 어려움이 커져갔다.

spring의 등장 이후는 어땠을까?
새로운 프레임워크 spring은 3대요소를 외치며 등장했다.

개발자가 방대한 객체를 만들고 관리하는 과정이 어려워짐에 따라 본래의 로직에 집중할 수 없게 된다.
spring에서는 모든 객체의 의존관계, 설정, 생명주기까지 개발자가 등록한 객체를 대신 관리해주게 된다.

개발자 입장에서 보자면 클래스를 spring에게 관리를 위임하는 것으로

복잡했던

  • 객체간의 관계 정리와 추가(유연성과 확장성)
  • 이상적인 모듈화를 위한 결합도 완화(약한결합)
  • Mock객체 주입을 통한 테스트 집중 향상(테스트 용이성)
  • 여러 객체를 통한 중복 메소드 관리(중복 코드 제거)
    의 이점을 가져올 수 있다.

여기서 IOC의 개념을 확인하고 끝날 것이 아닌 객체를 등록하는 DI를 살펴보아야 한다.

DI(Dependency Injection) : 의존성 주입

DI(Dependency Injection) 는 IOC와 함께 spring의 의의를 받쳐주는 요소이다.

IOC의 개념은 등록된 방대한 클래스의 복잡성, 유지보수의 관리를 대신 해주지만 개발자는 위임할 객체를 spring에 직접 등록해주어야한다.

spring를 다루다보면 가장 난해한 단어가 빈(BEAN)이라는 단어이다.

빈은 클래스와 같은 말이지만 정확히는 Spring에서 IOC를 통해 관리되는 객체(클래스)를 의미한다.

즉, 개발자가 IOC를 통해 클래스의 관리를 위임해라 라는 말이 bean을 등록해라라는 짧은 문장으로 통하는 것이다.

객체를 주입하여 @Bean으로 설정하기

주입하는 방법은 여러 방법이 있지만 대표적인 방벙이 @Compoenet,@Configuration과 @Bean이다.

@Compoenet: 어노테이션이 달려있는 클래스 전체를 Application Contenxt에 @Bean으로 등록함
@Configuration: 클래스 내부에 @Bean으로 명시되어 있는 메소드만을 Application Contenxt에 등록한다.

import org.springframework.stereotype.Component;

@Component
public class MyComponent {
    // 클래스 내용
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@Bean과 관련한 에러

Spring을 다루다보면 아래와 같은 에러를 보게되는데

image

개발자가 사용하려는 클래스가 Application Contenxt에 bean으로 등록되지 않았음을 의미한다.

이러한 문장에서 Application Contenxt는 빈을 개발자를 대신하여 관리해주는 IOC를 구성하는 무언가라고 불 수 있다.

Application Contenxt에 등록된 bean은 하나가 될수도 혹은 여러개가 될 수도 있다.

여기에 더해 여러 레퍼런스를 본다면 IOC Contanier라는 용어도 불 수 있는데
이는 Application Contenxt 혹은 beanFactory를 지칭하는 말이기도 하며

다수의 Application Contenxt, beanFactory를 지칭하여 Container라고 부르기도 한다.

Application Contenxt 그리고 beanFactory

조금더 공부한다면 두가지 용어를 듣게 되는데 이 두 가지 모두 빈을 생성하고 관리하는 기능에서는 동일하다.

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
        MessageSource, ApplicationEventPublisher, ResourcePatternResolver {}

Application Contenxt의 인터페이스를 확인해보면 ListableBeanFactory를 상속함을 알 수 있는데
그 말은 본래 Bean을 생성, 관리하는 기능은 beanFactory이지만 빈 관리의 기능과 더불어
Spring에서 제공하는 부가 서비스를 하나로 묶은 인터페이스가 Application Contenxt이게 된 것이다.

DI의 장점

  • 의존성으로 부터 격리시켜 코드 테스트에 용이하다.
  • DI르 통하여, 불가능한 상황을 Mock와 같은 기술을 통하여, 안정적으로 테스트 가능하다.
  • 코드를 확장하거나 변경 할 때 영향을 최소화 한다. (추상화)
  • 순환참조를 막을 수 있다.
반응형

'SPRING 🍃 > Basic' 카테고리의 다른 글

Spring DI - 여러가지 방법 편  (0) 2022.04.17
Spring AOP의 용어  (0) 2022.04.16
Spring AOP 관점지향 프로그래밍  (0) 2022.04.15
Spring ICO / DI - 의존성 주입 편  (0) 2022.04.14
Gradle 과 Maven 차이  (0) 2022.04.07
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함