우당탕탕 좌충우돌 개발일기

스프링 빈과 의존관계(Dependency Injection) 본문

Programming/JAVA

스프링 빈과 의존관계(Dependency Injection)

성동구불주먹 2024. 1. 12. 16:44

✨ 스프링 빈(Bean)을 등록하는 데는 크게 2가지 방법이 있다.

 

1. 컴포넌트 스캔(Component Scanning)

 

@Service, @Repository, @Controller 등과 같은 어노테이션을 사용하여 클래스를 빈으로 등록한다.

(해당 어노테이션들은 @Component를 포함하고 있음)
이 방법은 클래스에 어노테이션을 붙이면 스프링이 자동으로 해당 클래스를 찾아서 빈으로 등록하는 방식이다.

@Service
public class MyService {
    //...
}

 

 

🍅 여기서 잠깐!

 

@Autowired라는 어노테이션을 사용하려면,

기존 컨트롤러,서비스,레포지토리에도 각각  @Controller,@Service,@Repository 어노테이션을 사용해줘야 한다.

그렇지 않을시 해당 클래스들은 단순 자바 클래스로만 인식되어 @Autowired를 사용했을 때 인식이 불가하기 때문이다.

 

어노테이션을 정확하게 사용한 경우에, 생성자에서 @Controller를 사용하면 스프링 빈(Bean)에 등록되어 있는 MyService(@Service)의 객체를 가져다주고 이를 의존성주입(즉, Dependency Injection)이라 한다.

 

 

2. JavaConfig를 이용한 빈(Bean) 등록

 

JavaConfig 방식은 @Configuration 어노테이션을 사용하여 자바 클래스에서 빈(@Bean)을 설정한다.

myService() , myRepository()에 @Bean 태그로 등록하여 사용한다.

 

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

 

 

 

이 외에도 XML 설정 파일을 이용한 명시적인 빈 등록이나 조건에 따른 빈 등록(@Conditional) 방법 등 여러 가지가 있다.

사용자의 요구사항이나 프로젝트의 특성에 따라 적절한 방법을 선택해서 사용하면 되고, 주로 사용하는 방법은 위의 2가지 방법이다.

 


 

✨ 의존성 주입(DI : Dependency Injection)을 하기 위해선 3가지 방법이 있다.

 

1. 생성자 주입(Constructor Injection)

 

가장 일반적이고 간단한 형태의 의존성 주입이다. 클래스의 생성자를 통해 의존성을 주입받는다.

해당 방식은 의존성이 반드시 필요한 경우에만 객체를 생성하게끔 강제할 수 있고, 불변성(Immutable)을 유지할 수 있는 장점이 있다.

 

public class MyClass {
    private final MyDependency myDependency;

    public MyClass(MyDependency myDependency) {
        this.myDependency = myDependency;
    }

    //...
}

 

 

 

2. 세터 주입(Setter Injection)

 

의존성을 설정하는 메서드(세터 메서드)를 통해 주입받는 방식이다.

해당 방식은 객체 생성 후에도 의존성을 변경할 수 있다는 장점이 있는 반면, 객체의 일관성이 깨질 수 있고 누락될 가능성이 있기 때문에 주의가 필요하다.

public class MyClass {
    private MyDependency myDependency;

    public void setMyDependency(MyDependency myDependency) {
        this.myDependency = myDependency;
    }

    //...
}

 

 

 

3. 메서드 주입(Method Injection)

 

메서드의 매개변수를 통해 의존성을 주입받는 방식이다.

해당 방식은 특정 메서드 호출 시에만 필요한 의존성을 주입받을 수 있다. 특히 메서드마다 다른 의존성을 사용해야 하는 경우에 유용하게 사용된다는 특징이 있다.

public class MyClass {
    public void myMethod(MyDependency myDependency) {
        //...
    }

    //...
}

 

 

 

 

반응형

'Programming > JAVA' 카테고리의 다른 글

InputStream / OutputStream(byte단위)  (1) 2024.06.11
테스트 케이스 - assertThrows  (0) 2024.01.09
AfterEach 어노테이션 사용법  (2) 2024.01.04
테스트 케이스 - Assertions  (1) 2024.01.04
Getter & Setter  (0) 2023.12.19