일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 백준#BOJ#2615#오목
- 백준#BOJ#14501#퇴사#브루트포스
- 백준#boj#16932#모양만들기
- 백준#boj#12755
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#1939#중량제한
- 백준#BOJ#12865#평범한배낭
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
@RequiredArgsConstructor 를 사용할때 주의점 본문
스프링부트를 사용하여 개발할때 우리는 의존성 주입을 위해 @RequiredArgsConstructor를 사용합니다.
이때 굉장히 반드시 알고 가야될 개념이 있습니다.
바로 final키워드를 사용한 인스턴스들만 Bean 객체로 등록을 한다는 것 입니다.
final 키워드를 사용하지 않고 사용하면 NullPointerException 이 발생합니다.
(이점을 반드시 알아두고 기억하시길 바라고 다음 내용으로 넘어가겠습니다)
추가로 더 알아보면 @RequiredArgsConstructor를 왜 사용하는 것일까요????
우린 의존성 주입(Dependency Injection) 을 사용해서 Bean 객체로 등록된 아이들에게 제어의 역전(Inversion of control) 을 수행하게 됩니다.
(의존성 주입과 제어의 역전이 뭔지 잘 모르신다며 이것부터 공부하시고 오시길 바랍니다. 정말 잘 정리되어있는 블로그들 너무나도 많습니다)
@Service
class Test{
private final MemberRepository memberRepository;
@Autowired
public Test(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
이런식으로 @Autowired
어노테이션과 생성자를 사용해서 의존성을 주입해주는 방법이 일반적입니다.
의존성 주입에는 크게 3가지 방법이 존재합니다.
1) 필드 주입
2) setter 주입
3) 생성자 주입
이 중 스프링에서 공식적으로 추천하는 방법은 생성자 주입 입니다. 그 이유는 바로 한번 의존성을 주입받은 객체는 프로그램이 끝날때 까지 변하지 않는 특징을 가지므로 [불변성(immutable)]을 표시해주는 것이 좋기 때문입니다
그래서 의존성을 주입할 객체는 final 키워드를 사용하는 것 입니다.
그럼 왜 우리는 불변객체(immutable object) 를 사용하는 것이 좋을까요??
이 부분은 아주 잘 설명되어 있는 블로그 글을 읽어보세요.
우린 현재 의존성을 주입하는 객체는 불변객체(immutable object) 로 만들어주는 것이 좋다는 것 까지 알게 되었고 그렇기 때문에 final 키워드를 사용하는 것 이다 까지 알았습니다.
근데 매번 @Autowired
어노테이션을 사용하고 생성자를 생성해주고 이러기에는 번거로움이 발생하죠?
그래서 탄생하게 된 것이 바로 @RequiredArgsConstructor
입니다.
@Service
@RequiredArgsConstructor
class Test{
private final MemberRepository memberRepository;
}
이렇게만 선언하면 알아서 final
키워드가 붙은 필드에 대해 생성자를 만들어 줍니다.
근데 이상한게 있습니다. 생성자를 만들어 주는 건 알겠는데,,,그러면 의존성 주입은 어떻게 해주는 건가요?
이건 고민할 필요가 없는 것이. 생성자가 단 한개만 선언이 되어있으면 @Autowired 어노테이션을 생략을 해도 됩니다
@Service
class Test{
private final MemberRepository memberRepository;
public Test(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
이렇게 선언해도 @Autowired
어노테이션을 붙인 것과 동일하는 것이죠.
그렇기 때문에 굳이 의존성 주입을 걱정할 필요가 없는 것이죠. why? 어차피 @RequiredArgsConstructor 어노테이션은 필드주입생성자를 대처해주고 현재 생성자가 하나밖에 없는 상태이니 @Autowired 어노테이션을 생략해도 알아서 의존성이 주입되기 때문입니다.
오늘 포스팅 끝!
'나의 개발 메모장' 카테고리의 다른 글
[JPA] could not initialize proxy - no Session 발생 (4) | 2022.01.06 |
---|---|
[static inner class]non-static inner classes like this can only by instantiated using default (0) | 2022.01.04 |
[JPA]Should have [public, protected] no-arg constructor?? (0) | 2021.12.22 |
[Spring]@Transactional 어노테이션을 사용하면 왜 쿼리 로그가 안보일까? (0) | 2021.12.11 |
[eclipse 오류] Starting Tomcat Server at localhost 에러 (0) | 2021.02.02 |