본문 바로가기

Spring

[Spring Boot] DI(Dependency Injection: 의존성 주입) 란 무엇인가?

728x90
반응형

DI의 주요 개념

  1. IoC (Inversion of Control):
    • 전통적인 방식에서는 객체가 직접 자신의 의존성을 생성하거나 관리합니다. IoC는 이러한 제어의 흐름을 개발자가 아닌 컨테이너(Sprint Container)에게 맡기는 개념입니다.
  2. 빈(Bean):
    • Spring 컨테이너가 관리하는 객체를 빈이라고 합니다. 빈은 Spring 애플리케이션 컨텍스트에 의해 생성되고 관리됩니다.
  3. 컨테이너(Container):
    • Spring에서는 ApplicationContext가 컨테이너 역할을 하며, 애플리케이션의 빈을 생성, 설정, 관리합니다.

DI 유형

  1. 필드 주입(Field Injection):
    • 필드에 직접 주입하는 방식입니다.
  2. 생성자 주입(Constructor Injection):
    • 생성자를 통해 의존성을 주입받는 방식입니다.
  3. 세터 주입(Setter Injection):
    • 세터 메서드를 통해 의존성을 주입받는 방식입니다.

Spring Boot에서 DI 예제

아래는 간단한 DI 예제를 통해 Spring Boot에서의 의존성 주입을 설명합니다.

1. 프로젝트 설정

Spring Initializr를 통해 Spring Boot 프로젝트를 생성하고, 필요한 의존성을 추가합니다 (spring-boot-starter-web과 spring-boot-starter).

2. 서비스 인터페이스 및 구현 클래스 작성

먼저, 서비스 인터페이스를 정의하고 이를 구현하는 클래스를 작성합니다.

// GreetingService.java
package com.example.demo.service;

public interface GreetingService {
    String greet();
}

// GreetingServiceImpl.java
package com.example.demo.service;

import org.springframework.stereotype.Service;

@Service
public class GreetingServiceImpl implements GreetingService {
    @Override
    public String greet() {
        return "Hello, World!";
    }
}

3. 컨트롤러에서 서비스 주입받기

컨트롤러 클래스에서 서비스 클래스를 주입받아 사용합니다.

// GreetingController.java
package com.example.demo.controller;

import com.example.demo.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private final GreetingService greetingService;

    // 생성자 주입(Constructor Injection)
    @Autowired
    public GreetingController(GreetingService greetingService) {
        this.greetingService = greetingService;
    }

    @GetMapping("/greet")
    public String greet() {
        return greetingService.greet();
    }
}

DI 방식 설명

1. 생성자 주입(Constructor Injection)

가장 권장되는 방식입니다. 생성자 주입은 의존성이 불변(immutable)이고, 필수적인 의존성을 보장할 수 있습니다.

@RestController
public class GreetingController {

    private final GreetingService greetingService;

    @Autowired
    public GreetingController(GreetingService greetingService) {
        this.greetingService = greetingService;
    }

    @GetMapping("/greet")
    public String greet() {
        return greetingService.greet();
    }
}

필드 주입(Field Injection)

필드에 직접 @Autowired 애너테이션을 사용하는 방식입니다. 테스트하기 어렵고, 권장되지 않습니다.

@RestController
public class GreetingController {

    @Autowired
    private GreetingService greetingService;

    @GetMapping("/greet")
    public String greet() {
        return greetingService.greet();
    }
}

세터 주입(Setter Injection)

세터 메서드를 통해 주입하는 방식입니다. 선택적 의존성을 주입할 때 유용할 수 있습니다.

@RestController
public class GreetingController {

    private GreetingService greetingService;

    @Autowired
    public void setGreetingService(GreetingService greetingService) {
        this.greetingService = greetingService;
    }

    @GetMapping("/greet")
    public String greet() {
        return greetingService.greet();
    }
}

요약

  • **의존성 주입(DI)**은 객체 간의 의존성을 외부에서 주입받아 객체 간의 결합도를 낮추고 유연성을 높이는 방법입니다.
  • Spring Boot에서는 주로 @Autowired 애너테이션을 사용하여 의존성을 주입받습니다.
  • DI의 유형에는 필드 주입, 생성자 주입, 세터 주입이 있으며, 생성자 주입이 가장 권장됩니다.

이 예제를 통해 Spring Boot에서의 DI 개념을 이해할 수 있습니다. DI를 활용하면 코드의 유지보수성과 테스트 용이성을 크게 향상시킬 수 있습니다.

728x90
반응형