엘리스트랙

스프링 의존관계 복습!

Zmann 2024. 2. 6. 23:17
728x90

 

 

 

 

IoC

IoC(Inversion of Control)는 객체 지향 프로그래밍에서의 디자인 원칙 중 하나로, 컴포넌트의 흐름 제어를 관련된 컴포넌트 자체가 아닌 외부 컨테이너에게 위임하는 것을 의미합니다.

즉 프레임워크가 프로그램의 흐름을 제어하고 개발자의 코드를 호출한다는 것을 의미합니다.

스프링 프레임워크에서 IoC는 주로 DI(Dependency Injection)의 형태로 나타납니다.

 

DI

DI(Dependency Injection)는 '의존성 주입'이란 뜻으로, 클래스 간의 의존 관계를 느슨하게 만들어 주는 디자인 패턴 중 하나입니다. 이는 클래스가 자신이 필요로 하는 의존성을 직접 생성하거나 검색하는 대신 외부에서 주입받는 방식을 의미합니다.

 

DI의 구현

  • 생성자 주입(Constructor Injection): 클래스의 생성자를 통해 의존성을 주입하는 방식입니다. 이 방식은 의존성이 변하지 않으며, 객체가 생성될 때 모든 의존성이 주입되어야 하는 경우에 적합합니다.
@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
}
  • 세터 주입(Setter Injection): 클래스의 세터 메서드를 통해 의존성을 주입하는 방식입니다. 이 방식은 의존성이 변경될 수 있거나, 객체 생성 후에 의존성을 변경해야 하는 경우에 적합합니다.
@Service
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
}
  • 필드 주입(Field Injection): 클래스의 필드에 직접 의존성을 주입하는 방식입니다. 이 방식은 코드가 간결해지는 장점이 있지만, 테스트하기 어렵고 클래스의 캡슐화를 깨트릴 수 있어 권장되지 않습니다.
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
}

 

 

DI 장점

코드의 결합도를 낮추고 유연성을 높일 수 있습니다. 또한, 코드의 재사용성도 향상되며, 단위 테스트가 더 쉬워집니다.

 

 

 

 

 

 

 

728x90