본문 바로가기
백엔드/Spring Boot 이론

제어의 역전과 의존성 주입

by P_eli 2023. 11. 23.
728x90
반응형

스프링 부트의 중요한 두 가지 개념인 "제어의 역전(Inversion of Control)"과 "의존성 주입(Dependency Injection)"에 대해 알아보려고 합니다. 이 두 가지 개념은 스프링 부트가 어떻게 유연하고 확장 가능한 어플리케이션을 만들 수 있는지를 이해하는 데 중요합니다.

제어의 역전 (IoC: Inversion of Control)

스프링 부트는 제어의 역전을 기반으로 동작합니다. 이는 어플리케이션의 제어 권한이 개발자에서 프레임워크로 넘어간다는 의미입니다. 기존에는 개발자가 코드를 작성하면서 객체의 생성 및 생명주기를 관리했지만, 스프링 부트에서는 이 역할이 프레임워크에게 넘어가게 됩니다.

제어의 역전은 객체의 생명주기를 스프링 컨테이너가 관리하게 되며, 개발자는 필요한 객체를 스프링에게 요청해서 사용하게 됩니다. 이로써 코드의 결합도가 낮아지고, 유지보수가 쉬워지는 장점이 있습니다.

의존성 주입 (DI: Dependency Injection)

의존성 주입은 객체 간의 결합도를 낮추기 위한 핵심 개념 중 하나입니다. 개발자가 직접 객체를 생성하고 관리하는 것이 아니라, 스프링 컨테이너가 객체 간의 의존성을 주입해주는 것을 의미합니다.

스프링 부트에서는 주로 생성자를 통한 의존성 주입이 이루어집니다. 즉, 객체가 생성될 때 필요한 의존 객체를 외부에서 주입받게 됩니다. 이로써 코드의 재사용성과 유지보수성이 향상되며, 테스트하기 쉬운 코드를 작성할 수 있게 됩니다.

코드 예시

// 제어의 역전: 개발자가 객체를 직접 생성하지 않고, 스프링 컨테이너에게 객체를 요청
@Service
public class MyService {
    // 의존성 주입: 스프링이 MyRepository 객체를 주입
    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public String fetchData() {
        return myRepository.getData();
    }
}

// MyRepository 인터페이스
public interface MyRepository {
    String getData();
}

// MyRepository 구현체
@Repository
public class MyRepositoryImpl implements MyRepository {
    public String getData() {
        return "데이터 가져오기!";
    }
}

 

위의 코드에서 MyService 클래스는 MyRepository 인터페이스에 의존하고 있습니다.

하지만 MyService는 MyRepository의 구체적인 구현체를 알 필요가 없습니다.

스프링 부트는 MyRepository 인터페이스를 구현한 MyRepositoryImpl 객체를 생성하고 주입해주기 때문에,

개발자는 핵심 비즈니스 로직에만 집중할 수 있습니다.

 

제어의 역전과 의존성 주입은 스프링 부트의 핵심 원리 중 하나이며, 이를 통해 유연하고 확장 가능한 어플리케이션을 구축할 수 있습니다.

728x90
반응형

'백엔드 > Spring Boot 이론' 카테고리의 다른 글

JUnit  (0) 2023.11.27
스프링부트 어노테이션  (0) 2023.11.26
빈과 컨테이너  (0) 2023.11.24
스프링과 스프링부트 차이점  (1) 2023.11.23
스프링 부트의 특징  (0) 2023.11.23