이번 글에서는 의존관계 주입 방법에 대해서 더 자세히 다뤄볼 것이다.
지금까지의 예제에서는 빈 등록을 이용해서 단순히 실행만 시켜보는 구조였기에 객체간의 의존관계 주입이 없었다.
그렇기에 이번에는 의존관계에 대해 설명 못한 것들(종류, 좋은 방법, 활용하는 법 등)에 대해서 알아보려고 한다.
전 글들에서 언급했던 @Autowired 나 생성자 주입의 중요성과 Lombok도 이 곳에서 모두 다룰 것이다.
그럼 먼저 종류에 대해서 살펴보자.
생성자 주입
@Component
public class StuService implements Service{
private final Repository repository;
public StuService() {}
@Autowired
public StuService(Repository repository) {
this.repository = repository;
}
// 기능 생략
}
생성자 주입은 위와 같이 이루어진다.
주로 필수이고 불변하는 의존관계에 사용된다.
만약 생성자가 하나이고, 스프링 빈에 등록되어 있다면, @Autowired 를 통해 연결해주지 않아도 스프링이 자동으로 연결해준다.
하지만 위에 코드처럼(임의로 만들었음) 생성자가 두개라면 위와 같이 @Autowired 어노테이션을 통해 꼭 명시를 해주어야 한다.
수정자 주입
@Component
public class StuService implements Service{
private Repository repository;
@Autowired
public void setRepository(Repository repository) {
this.repository = repository;
}
// 기능 생략
}
다음은 수정자 주입이다.
수정자 주입은 위와 같이 이루어진다.
주로 선택과 변경 가능성이 있는 의존관계에 사용되며, 주입 받을 대상이 있어야만 @Autowired가 작동한다.
필드 주입
@Component
public class StuService implements Service{
@Autowired
private Repository repository;
// 기능 생략
}
다음으로는 필드 주입이다.
가장 짧고 간단해 보이지만 DI 프레임워크가 없다면 아무것도 못하는 코드이며, 외부에서 변경이 불가능해 테스트하기가 힘들다는 단점이 있다.
고로 존재는 알아둬도 사용하지 않는 것이 좋다.
이 중에서 생성자 주입이 가장 중요하고 많이 쓰인다.
생성자 주입을 사용하면,
다른 주입 방법들과는 달리 final 키워드를 사용할 수 있어 생성자에서 값이 설정되지 않은 오류를 잡아낼 수도 있고,
프레임워크에 의존하지 않고 순수한 자바 언어의 특징을 잘 살리는 방법이기 때문이다.
이러한 생성자 주입 방법을 장려하듯이 스프링에서도 위에서 설명했던 것처럼 생성자가 하나면 자동으로 연결을 해주기도 하고,
Lombok과 같이 편의를 돕는 기능도 제공되고 있다.
그러면 Lombok 이라는 편의 기능은 어떻게 사용하는지와 어떤 지를 좀 살펴보자.
gradle에 아래 내용을 추가해주고
//lombok 라이브러리 추가 시작
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
//lombok 라이브러리 추가 끝
intellij 설정의 plugins 에서 lombok을 다운 받아주면 사용할 수 있다.
만약 다른 IDE를 사용한다면 다운 받아 사용해야되는 것으로 알고 있다.
그러면 사용 방법을 살펴보자.
@Component
@RequiredArgsConstructor
public class StuService implements Service{
private final Repository repository;
// 기능 생략
}
만약 final을 빼고 싶다면 @RequiredArgsConstructor 대신 @AllArgsConstructor 를 사용하면 된다.
첫번째 생성자 주입과는 다르게 엄청나게 간결해진 코드를 볼 수 있다. (@Getter나 @Setter를 통해 getter/setter 자동생성도 지원함)
이렇게 롬복을 사용하면, 반복되는 코드를 확 줄일 수 있어 가독성과 유지보수성을 향상 시킬 수 있고, 코딩의 생산성 또한 향상 시킬 수 있다.
이렇게 의존관계 주입에 대한 내용을 끝내게 되었다.
많이 헷갈리는 부분도 있었지만, 계속 찾아보고 정리해보면서 개념을 잘 잡을 수 있었던 것 같다.
다음에는 빈의 생명주기에 대해서와 DL에 대해서도 정리해볼 것이다.
참고 :
'Spring' 카테고리의 다른 글
[Spring 핵심 원리] 빈 스코프와 DL(Dependency Lookup) (0) | 2022.03.20 |
---|---|
[Spring 핵심 원리] 빈 생명주기 콜백 (0) | 2022.03.20 |
[Spring 핵심 원리] 싱글톤 패턴 (0) | 2022.03.20 |
[Spring 핵심 원리] 수동 빈 등록을 통한 의존관계 주입 (0) | 2022.03.20 |
[Spring 핵심 원리] SOLID (0) | 2022.03.20 |