제어의 역전과 의존성 주입

YJS·2024년 1월 30일
0

Spring Boot 탐구

목록 보기
10/11
post-thumbnail

🤓오늘의 공부 주제: 제어의 역전과 의존성 주입🤓

Q. 제어의 역전이란 무엇인가?

A. Inversion of Control(IoC)이란 제어의 역전으로 프로그램의 제어 흐름을 프레임워크나 컨테이너에게 위임하는 개념. 일반적으로 객체의 생성과 생명주기를 개발자가 관리하는 것이 아니라 프레임워크가 관리하며, 프레임워크가 애플리케이션의 흐름을 제어.

스프링에서는 객체를 Bean이라고 함. 프로젝트가 실행될때 사용자가 Bean으로 관리하는 객체들의 생성과 소멸에 관련된 작업을 스프링에서 자동적으로 수행해주는데 객체가 생성되는 곳을 Bean 컨테이너라고 부른다.

Q. 의존성 주입이란 무엇인가?

A. 의존성 주입은 객체 간의 의존 관계를 외부에서 설정하고 관리하는 디자인 패턴.

일반적으로 클래스가 다른 클래스에 의존하는 경우, 이러한 의존성을 클래스 내부에서 생성하거나 관리하면 결합도가 높아져 유연성이 감소한다. 의존성 주입은 이러한 문제를 해결하기 위해 객체의 의존성을 외부에서 주입한다.


출처: https://velog.io/@gillog/Spring-DIDependency-Injection

의존성 주입 구현 방법

  1. new 생성자를 활용하여 직접 객체 생성
  2. 외부에서 생성된 객체를 setter를 통해 접근

의존성 주입과 제어의 역전의 장점

  • 유연성: 의존성이 외부에서 주입되기 때문에 클래스 간의 결합도가 낮아져 유연한 구조를 만들 수 있다.
  • 재사용성: 의존성 주입을 통해 독립적인 객체를 만들고 재사용할 수 있다.
  • 테스트 용이성: 의존성을 외부에서 주입하므로 테스트 시에 모의 객체(Mock Object)를 주입하여 테스트하기 쉽다.
// 서비스 인터페이스
public interface MessageService {
    String getMessage();
}

// 서비스 구현체
public class EmailService implements MessageService {
    @Override
    public String getMessage() {
        return "Email message";
    }
}

// 클라이언트 클래스
public class MyApplication {
    private MessageService service;

    // 의존성 주입을 통해 MessageService를 주입받음
    public MyApplication(MessageService service) {
        this.service = service;
    }

    public void processMessages() {
        String message = service.getMessage();
        System.out.println("Message: " + message);
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        // 의존성 주입을 통해 EmailService를 MyApplication에 주입
        MessageService service = new EmailService();
        MyApplication app = new MyApplication(service);
        app.processMessages();
    }
}
profile
우당탕탕 개발 일기

0개의 댓글