Spring 에서는 다양한 장점이 존재하는데 그중 하나는 의존성 주입(DI) 에 대한 개념이다.
이 개념이 어떤 의미인지 모른다면 아래 참고포스팅에서 확인하고 오면 도움이 될것이다.
여기서 나오는 annotation중 하나는 autowired 라는 annotation이고
이 annotation의 역할은 스프링 bean에 등록되어있는 객체를 주입해주는 역할이다.
하지만 스프링팀에서 autowired를 사용하는것보다 RequiredArgsConstructor를 사용하는것을 추천하는 글을 보았다.
일단 먼저 RequiredArgsConstructor annotation은 하는 역할이 자동으로 필수 생성자를 만들어주는 역할을 한다.
비슷한 annotation으로는 NoArgsConstructor, AllArgsConstructor 이 있는데 말 그대로 빈 생성자와 모든 컬럼을 포함하는 생성자를 만들어주고 DTO에서 주로 사용을 하게 된다.
다시 RequiredArgsConstructor 로 돌아와서 autowired 대신에 RequiredArgsConstructor를 쓰는 이유를 설명을 하면
기본 문법은 다음과 같다.
- Autowired 사용시
@Controller public class Controller { @Autowired privat Servcic service; } |
- RequiredArgsConstructor 사용시
@Controller @RequiredArgsConstructor public class Controller { private final Servcic service; } |
이렇게 나뉘게 된다.
만약 저 RequiredArgsConstructor 를 안써준다면 아래와 같은 코드이다.
@Controller public class Controller { private final Servcic service; public Controller(Service service){ this.service = service; } } |
로 바뀌게 된다. 즉 생성자를 생성하는 코드를 annotation으로 대체를 해준 것이다.
결국 autowired를 대신해서 생성자를 사용하라고 권장하는 이유는 다음과 같다.
생성자 주입을 사용할 경우 아래와 같은 장점이 있다고 한다.
- 순환 참조 방지
- 테스트 코드 작성 용이
- 코드 악취 제거
- 객체 변이 방지 (final 가능)
아직은 직접 코드에서 이 사용에 대한 장점을 체감해보진 못하였지만 알고 있는것이랑 모르고 사용하는것에 대한 차이는 분명히 있을것이다.
참고 포스팅
https://thenicesj.tistory.com/144
'IT > Java' 카테고리의 다른 글
Map, Set, List 에 대해서 (40) | 2022.07.30 |
---|---|
배열의 복사(깊은복사, 얕은복사) (60) | 2022.07.29 |
substring , indexOf (lastIndexOf), charAt 을 이용한 문자열 추출 (42) | 2022.07.24 |
JPA에서의 어노테이션 (44) | 2022.07.22 |
LocalDateTime 날짜 비교 (36) | 2022.07.21 |
댓글