본문 바로가기
스프링 공부

Spring 스프링 프레임워크 - 의존관계 주입(Dependency Injection, DI )

by 코딩마스터^^ 2024. 8. 8.

스프링 프레임워크에서 의존관계 주입(Dependency Injection, DI)은 객체 간의 의존성을 설정하는 핵심 개념입니다. DI는 객체가 스스로 다른 객체를 생성하는 대신, 외부에서 객체의 의존성을 주입하는 방법을 통해 결합도를 낮추고 유연성을 높입니다.

 

https://any-ting.tistory.com/146

 

[Spring Boot] 구조 분석 (4) - 의존관계 주입 방식

- 지난 시간 안녕하세요. 지난 시간에는 @Autowired 어노테이션에 대해 알아봤습니다. 놓고 오신 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드리겠습니다. [Spring Boot] 구조 분석 (3) - @Autowired

any-ting.tistory.com

 

DI(Dependency Injection) 프레임워크인 Spring Boot 프레임워크에는 Container라는 개념이 존재합니다.

 

해당 Container에는 우리가 사용할 클래스를 미리 생성해서 싱글톤으로 관리합니다.

 

우리가 생성하고 싶은 클래스를 Container의 등록을 하기 위해서는 @Componet, @Controller, @RestController, @Service, @Repository와 같은 어노테이션을 사용하면 Bean으로 해당 클래스를 생성해 Container에 등록합니다.

 

 

 

 

컨테이너에 등록된 클래스를 불러와서 사용하자! 의존성을 주입받아서~

 

DI는 주로 세 가지 방식으로 이루어집니다:

1. 생성자 주입

2. 세터 주입

3. 필드 주입

 

 

1. 생성자 주입 (Constructor Injection)

생성자 주입은 객체의 생성 시점에 의존성을 주입하는 방법입니다. 이를 통해 객체가 생성될 때 필요한 모든 의존성이 주입됩니다. 생성자 주입은 의존성이 필수적일 때 주로 사용됩니다.

package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    private final MyRepository myRepository;

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

    public void performService() {
        myRepository.doSomething();
    }
}

 

 

@Autowired는

스프링 프레임워크에서 의존성 주입을 위해 사용되는 어노테이션입니다. 이 어노테이션은 스프링 컨테이너가 자동으로 빈을 찾아 주입해주는 역할을 합니다. 주로 생성자, 세터, 필드에 사용되어 빈 간의 의존성을 설정합니다.

주요 특징

  1. 자동 의존성 주입:
    • 스프링 컨테이너에서 타입에 맞는 빈을 찾아 자동으로 주입합니다.
  2. 옵션 설정:
    • 주입할 빈이 필수인지 선택인지 설정할 수 있습니다. (required 속성 사용)

 

 

 

2. 세터 주입 (Setter Injection)

세터 주입은 객체가 생성된 후 세터 메서드를 통해 의존성을 주입하는 방법입니다. 선택적 의존성을 주입할 때 유용합니다.

package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    private MyRepository myRepository;

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

    public void performService() {
        myRepository.doSomething();
    }
}

 

 

3. 필드 주입 (Field Injection)

필드 주입은 객체의 필드에 직접 의존성을 주입하는 방법입니다. 간결하지만, 테스트가 어려울 수 있으며, 주로 스프링이 관리하는 빈에만 사용됩니다.

package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    @Autowired
    private MyRepository myRepository;

    public void performService() {
        myRepository.doSomething();
    }
}

 

 

 

의존성 주입의 구성 요소

  1. 빈 (Bean): 스프링 컨테이너가 관리하는 객체입니다. 애플리케이션의 구성 요소로서, 의존성을 주입받을 수 있습니다.
  2. 빈 정의 (Bean Definition): 빈을 설정하는 방법입니다. 주로 어노테이션(@Component, @Service, @Repository, @Controller), XML 설정, 또는 자바 설정 클래스를 사용합니다.
  3. 빈 주입 (Bean Injection): 의존성을 주입하는 방법입니 다. 생성자, 세터, 필드 주입을 통해 이루어집니다.

 

- 생성자 주입 또는 @RequiredArgsConstructor

생성자 주입이란 클래스가 생성되는 시점에 의존관계를 설정하고 주입하는 방식을 뜻 합니다.

@Service
public class UserService {

    private UserRepositoryInterface userRepository;

    private UserDiskRepository userDiskRepository;

    @Autowired
    public UserService(UserRepositoryInterface userRepository, UserDiskRepository userDiskRepository) {
        this.userRepository = userRepository;
        this.userDiskRepository = userDiskRepository;
    }
    
    ...
}

지난 시간에 @Autowired 어노테이션에 대해 설명했습니다. 해당 어노테이션은 의존관계를 주입할 때 사용된다고 설명했습니다.

 

위 코드를 확인하면 생성자 메서드 위의 @Autowired를 선언한 걸 확인할 수 있습니다.

 

이렇게 되면 해당 클래스가 생성될 때 딱 한 번만 의존관계를 주입합니다.

 

@RequiredArgsConstructor 어노테이션

@RequiredArgsConstructor 어노테이션은 위 코드를 조금 더 간결하게 만들며 생성자 주입을 할 때 사용됩니다.

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepositoryInterface userRepository;

    private final UserDiskRepository userDiskRepository;
 
    ...
}

 

반드시 final을 정의해줘야 합니다. final 키워드는 처음 정의된 상태가 변하지 않도록 보장합니다. 즉, 우리가 생성자 주입의 특징처럼 처음 클래스가 생성될 때 딱 한 번만 의존관계를 정의하고 더 이상 변하지 않게 합니다.

 

참조 값을 변경하지 못하도록 하기 때문에 불변성을 확보할 수 있습니다.

https://any-ting.tistory.com/146

 

[Spring Boot] 구조 분석 (4) - 의존관계 주입 방식

- 지난 시간 안녕하세요. 지난 시간에는 @Autowired 어노테이션에 대해 알아봤습니다. 놓고 오신 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드리겠습니다. [Spring Boot] 구조 분석 (3) - @Autowired

any-ting.tistory.com

 

댓글