스프링 프레임워크에서 의존관계 주입(Dependency Injection, DI)은 객체 간의 의존성을 설정하는 핵심 개념입니다. DI는 객체가 스스로 다른 객체를 생성하는 대신, 외부에서 객체의 의존성을 주입하는 방법을 통해 결합도를 낮추고 유연성을 높입니다.
https://any-ting.tistory.com/146
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는
스프링 프레임워크에서 의존성 주입을 위해 사용되는 어노테이션입니다. 이 어노테이션은 스프링 컨테이너가 자동으로 빈을 찾아 주입해주는 역할을 합니다. 주로 생성자, 세터, 필드에 사용되어 빈 간의 의존성을 설정합니다.
주요 특징
- 자동 의존성 주입:
- 스프링 컨테이너에서 타입에 맞는 빈을 찾아 자동으로 주입합니다.
- 옵션 설정:
- 주입할 빈이 필수인지 선택인지 설정할 수 있습니다. (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();
}
}
의존성 주입의 구성 요소
- 빈 (Bean): 스프링 컨테이너가 관리하는 객체입니다. 애플리케이션의 구성 요소로서, 의존성을 주입받을 수 있습니다.
- 빈 정의 (Bean Definition): 빈을 설정하는 방법입니다. 주로 어노테이션(@Component, @Service, @Repository, @Controller), XML 설정, 또는 자바 설정 클래스를 사용합니다.
- 빈 주입 (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
'스프링 공부' 카테고리의 다른 글
제어의 역전 IoC 개념 정리 (0) | 2024.08.14 |
---|---|
스프링 프레임 워크 구조 정리 (1) | 2024.08.09 |
Spring Web MVC/ 스프링 RestAPI를 위한 어노테이션 (0) | 2024.08.07 |
스프링 빈 Spring Bean 정리 (0) | 2024.08.07 |
Spring Context 스프링 컨텍스트? 스프링 컨테이너? 개념 정리 (0) | 2024.08.06 |
댓글