의존성 주입 관련 실수

김형준 Kim Hyeong Jun·2022년 12월 27일
0
post-thumbnail
java.lang.NullPointerException:
Cannot invoke “org.springframework.security.core.userdetails.UserDetailsService.loadUserByUsername(String)” 
because “this.userDetailsService” is null
(생략)

프로젝트를 진행하는 중,
위와 같은 에러르 만났다.
userDeatils 가 null 값이라는 오류인 것으로 보엿다.

✏️ 해결


어이없게도 외부로부터 의존성 주입(생성자 주입)을 받기위해서 선언한 객체에 final 키워드가 빠져있다.

위와 같이 private final 키워드를 명확히 붙여주니 적상적으로 작동하였다.

어찌보면 가벼운 실수일지도 모르지만,
오히려 가벼운 실수일수록 기초적인 부분이 부족하다는 것을 보여주는 것일 수도 있다.

의존성 주입(생성자 주입)

✔️ defendency injection

  • Null 을 주입하지 않는한 NullPointException 이 발생하지 않는다.
  • final 키워드를 사용하여 객체의 불변을 유지할 수 있다.
  • 개발자의 실수로 빈의 주입이 이루어지지 않았을 경우 final 키워드를 사용하면 컴파일 시점에서 오류를 잡아낼 수 있다.
  • 순환 참조를 방지할 수 있다.

✔️ 의존관계란 무엇인가?

“A가 B를 의존한다.”는 표현은 어떤 의미일까? 추상적인 표현이지만, 토비의 스프링에서는 다음과 같이 정의한다.

의존대상 B가 변하면, 그것이 A에 영향을 미친다.

이일민, 토비의 스프링 3.1, 에이콘(2012), p113

즉, B의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이 A에 미친다.

✔️ Dependency Injection?

의존 관계를 외부에서 결정하고 주입하는 것이 DI(의존성 주입)dlek.

  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야 한다.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

이일민, 토비의 스프링 3.1, 에이콘(2012), p114

Reference

Reference 1
Reference 2

profile
I want be a developer🙂

0개의 댓글