JAVA/SPRING
[Spring] 의존성 주입 (Dependency Injection)
KMSEOP
2023. 5. 29. 15:44
728x90
1. 의존성 주입이란?
객체를 직접 생성하는 것이 아니라 외부에서 생성된 객체를 주입하는 방법으로 런타임에 의존성을 동적으로 주입하여 결합도를 낮출 수 있습니다.
스프링에서 의존성을 주입할 수 있는 방법으로는 생성자 주입, 필드 주입, 수정자 주입 등의 방법이 존재하고 스프링에서는 생성자 주입을 권장하고 있습니다.
의존성 주입을 통해 클래스들의 결합도를 낮출 수 있고 객체의 유연성을 높이고 테스트 작성이 용이해진다는 장점이 있습니다.
public class Person {
private Student student;
public Person() {
this.student = new Student();
}
}
위 코드 예시의 문제점은 Person 클래스와 Student클래스가 강한 결합도를 가지고 있습니다.
DI를 이용하여 문제점은 아래와 같이 해결이 가능합니다.
public class Job {}
public class Student extends Job {}
public class Police extends Job {}
public class Person {
private Job job;
public Person() {
job = new Job();
}
}
의존성 주입을 통해 클래스들의 결합도를 낮출 수 있고 객체의 유연성을 높이고 테스트 작성이 용이해진다는 장점이 있습니다.
2. 의존성 주입 방법
생성자 주입
public class Person {
private final Job job;
public Person(Job job) {
this.job = job;
}
}
// lombok을 이용하여 간결하게 사용 가능
@RequiredArgsConstructor
public class Person {
private final Job job;
}
생성자 주입은 생성자가 호출되는 시점에 단 1번만 호출되므로 객체의 불변을 보장합니다.
수정자 주입
public class Person {
private final Job job;
@Autowired
public void setJob(Job job) {
this.job = job;
}
}
수정자 주입은 객체의 변경이 필요할 때 사용 가능합니다. 다만 @Autowired로 주입할 대상이 없는경우에 에러가 발생합니다.
필드 주입
public class Person {
@Autowired
private final Job job;
}
필드 주입은 코드가 간결하나 외부에서 접근이 불가능해 테스트 코드 작성 시 객체를 변경할 수 없다는 단점이 있습니다.
728x90