[Spring Boot] DI, IOC

diense_kk·2023년 10월 30일
0

SpringBoot

목록 보기
6/10
post-thumbnail

스프링은 복잡함을 해결하기 위한 다양한 특징을 가지고 있다. DI , AOP, PSA가 바로 그것이다.

DI (Dependency Injection)

의존성

프로그램 개발을 진행하다 보면 객체간의 의존성이 생기기 마련이다.

Cook클래스는 생성자를 실행 할 때에 cut()을 이용하기 위해서 Knife클래스가 필요하다 이러한 상황을 Cook 클래스가 Knife에 의존성을 가지고 있다(의존하고 있다)라고한다. 그렇다면 의존성이라는것이 왜 안좋은것일까?

  1. Unit Test가 어려워진다.

내부에서 직접 생성하는 객체에 대해서, mocking을 할 방법이 없습니다. 따라서 그만큼 단위테스트를 하기가 까다로워집니다.

  1. Code의 변경이 어려워진다.

Cook 클래스는 생성자에서 Knife객체를 직접 생성하여 사용하고 있다. 만약 나중에 Knife라는 클래스가 Rose Knife(장미칼) 등으로 바뀐다면 지금 처럼 Knife 클래스에 의존하고 있는 Cook의 클래스도 직접 같이 변경해주어야 한다. 즉, 객체간의 강한 결합력이 생긴다. 소프트웨어 모듈화의 목적인 낮은 결합력과 높은 응집도에 해가 가는 행위가 되는 것이다.

의존성 주입(Spring 사용 전)

위와 같은 문제점 때문에 의존성 주입이 생겨났다. 의존성을 주입하지 않는 경우는 위와 같이 직접 필요한 객체를 생성하는 경우라고 보면 된다. 의존성 주입을 하는 경우는 다음과 같은 경우가 있다.

  1. 생성자를 통해 전달받음

  2. setter를 통해 전달 받음

그럼 위와 같은 방법을 사용하면 왜 좋을까? 바로 코드의 수정이 용이하다는 것이다. 앞서 말했듯이 Knife클래스를 RoseKnife클래스로 변경을 해야하는 상황일 때. 의존성을 주입하지 않는다면 Cook클래스의 직접 Knife를 생성하는 부분을 바꾸어주어야 한다. 의존성을 주입하는 상황에서도 주입하는 코드를 변경해주어야 하는것은 똑같지만 한 클래스를 수정했을 때 다른 클래스를 수정해야 하는 상황을 막아준다.

DI(Spring 사용)

위와 같은 이유로 스프링은 DI라는 방식을 이용하여 모듈간의 결합도를 낮추어준다. DI란 IOC Container가 개발자 대신 xml파일에 정의된 대로Bean객체를 생성하고 의존성을 대신 주입하는 것을 의미한다. IOC란 제어의 역전 이라는 말로 사용자가 직접 객체를 생성하고 관리하던 것을 spring의 IOC Container가 대신 해준다는 말이다.

DI를 통해 개발자가 해야하는 일은 다음과 같아졌다.

  • Bean class 작성
  • 주입을 위한 설정(xml파일 기술 또는 @어노테이션)

예시

// 의존성 인터페이스
public interface MessageService {
    String getMessage();
}

// 구체적인 의존성 클래스
public class EmailService implements MessageService {
    @Override
    public String getMessage() {
        return "이메일로 메시지를 보냅니다.";
    }
}

// 의존성 주입을 받는 클래스
public class MessageProcessor {
    private final MessageService messageService;

    // 생성자를 통한 의존성 주입
    public MessageProcessor(MessageService messageService) {
        this.messageService = messageService;
    }

    public void processMessage() {
        String message = messageService.getMessage();
        System.out.println("메시지를 처리합니다: " + message);
    }
}

// 메인 애플리케이션
public class Main {
    public static void main(String[] args) {
        // EmailService를 MessageProcessor에 주입
        MessageService emailService = new EmailService();
        MessageProcessor processor = new MessageProcessor(emailService);

        processor.processMessage();
    }
}

Ioc(Inversion of Control)

IoC(Inversion of Control)란 "제어의 역전" 이라는 의미로, 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
간단히 말해 "제어의 흐름을 바꾼다"라고 한다.

객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.

IOC Container(Spring Container)

IOC Container란 사용자가 작성한 메타데이터(xml 파일 또는 @(어노테이션))에 따라 Bean클래스를 생성 및 관리 하는 Spring의 핵심 컴포넌트.

IOC Container의 설정 방법

@(어노테이션) 사용

프로그램의 규모가 커지면서 XML에 기술할 내용이 많아졌다. 그 때문에 오히려 유지 보수성이 떨어지는 XML 때문에 Annontation(@)이 등장했다.

장점 : 보다 더 직관적인 코드 작성이 가능해진다.(메타데이터와 소스코드를 같이 기술하기 때문), 개발의 생산성이 증대 된다.

0개의 댓글