다른 변수에 Null Pointer Exception이 떴을 거라 생각했지만, 디버깅을 돌려보니 Null Pointer Exception이 JPA Respoistory나 Service에 떴다.
어떻게 하면 이 곳에 Null이 들어가는 지 의문이 들었는 데, 찾아보니까 의존성 주입이 안돼서 그런 것이었다.
java.lang.NullPointerException: null
at com.example.demo.user.service.UserService.create(UserService.java:93) ~[classes/:na]
@RequiredArgsConstructor을 이용해서 생성자 주입을 통해 UserRepository를 의존성 주입을 시켜줬는 데, final을 달아주지 않아서 생긴 에러였다.
@RequiredArgsConstructor은 final이나 @NonNull이 붙은 필드들에 대한 생성자를 생성해주기 때문에 의존성 주입이 되지 않는다.
private이나 final을 평소에 달지 않고, 직접 생성자를 구현해서 의존성 주입을 했었는 데 잘 동작했어서 생겼던 사소한 나쁜 습관 때문이었다.
꼼꼼히 private이나 final 등 제어자를 잘 달아주기... 메모
@RequiredArgsConstructor의 동작원리를 알면 이 문제에 대해 쉽게 파악했을 것 같다.
생성자를 자동으로 만들어주는 어노테이션에 대해 알아보자
@AllArgsConstructor
- 클래스의 모든 필드를 인자로 받는 생성자를 자동으로 생성해주는 어노테이션
@NoArgsConstructor
- 매개변수가 없는 디폴트 생성자를 자동으로 생성해주는 어노테이션
@RequiredArgsConstructor
- 필드 중 final이나 @NonNull이 붙은 필드들에 대한 생성자를 자동으로 생성해주는 어노테이션