
의존성은 한 클래스가 다른 클래스에 의존하고 있다는 것을 의미합니다. 즉, 어떤 클래스가 다른 클래스를 사용하거나 그 클래스의 기능을 필요로 할 때, 두 클래스 사이에 의존성이 존재한다고 할 수 있습니다.
예를 들어, 다음과 같은 경우를 생각해 볼 수 있습니다:
public class UserService {
private final UserRepository userRepository; // UserRepository에 대한 의존성
public UserService(UserRepository userRepository) {
this.userRepository = userRepository; // 생성자 주입을 통해 의존성 설정
}
public void saveUser(User user) {
userRepository.save(user); // UserRepository를 사용하여 사용자 저장
}
}
위의 예에서 UserService는 UserRepository에 의존하고 있습니다. 즉, UserService는 UserRepository의 기능을 사용해야 하므로 두 클래스 간에 의존성이 형성됩니다.
의존성 주입(Dependency Injection)은 객체의 의존성을 외부에서 주입하는 디자인 패턴입니다. 이 방법을 사용하면 클래스가 필요한 의존성을 스스로 생성하지 않고, 외부에서 제공받도록 할 수 있습니다.
생성자 주입: 의존성을 생성자를 통해 주입합니다.
public class MyService {
private final MyRepository myRepository;
public MyService(MyRepository myRepository) {
this.myRepository = myRepository; // 의존성 주입
}
}
세터 주입: 세터 메서드를 통해 의존성을 주입합니다.
public class MyService {
private MyRepository myRepository;
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository; // 의존성 주입
}
}
필드 주입: 직접 필드에 주입합니다. (Lombok의 @RequiredArgsConstructor와 같은 방식)
import lombok.RequiredArgsConstructor;
public class MyService {
@Autowired
private MyRepository myRepository; // 의존성 주입
}
@RequiredArgsConstructor 애노테이션은 Lombok에서 제공하는 기능으로, 다음과 같은 특징을 가지고 있습니다:
자동 생성자 생성:
@RequiredArgsConstructor 애노테이션을 사용하면, final 또는 @NonNull이 붙은 필드를 인자로 받는 생성자가 자동으로 생성됩니다. 이 생성자는 클래스의 인스턴스를 생성할 때 필요한 의존성을 주입하는 데 사용됩니다.의존성 주입:
final로 선언되어 클래스가 생성된 이후에는 변경되지 않도록 보장할 수 있습니다.import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class MyService {
private final MyRepository myRepository; // final 필드
}
의존성 주입을 사용하지 않고 클래스 내부에서 직접 객체를 생성할 수도 있습니다:
public class MyService {
private final MyRepository myRepository = new MyRepository(); // 직접 생성
public void saveUser(User user) {
myRepository.save(user);
}
}
| 특성 | 의존성 주입 | 직접 생성 |
|---|---|---|
| 유연성 | 높은 유연성 (구현체 교체 용이) | 낮은 유연성 (구현체 고정) |
| 테스트 용이성 | Mock 객체로 쉽게 테스트 가능 | 테스트 시 직접 생성된 객체 사용 필요 |
| 결합도 | 결합도 낮음 (Loose Coupling) | 결합도 높음 (Tight Coupling) |
| 생명주기 관리 | 컨테이너에서 관리 (자동 소멸) | 객체의 생명주기를 수동으로 관리 |