@Service
@RequiredArgsConstructor
public class PaintServiceImpl implements PaintService{
private PaintRepository paintRepository;
를 사용 했다.
코드에는 문제가 없어 보였는데, 계속 null로 동작이 되었다.
저게 문제였다.
# 해결 :
private final PaintRepository paintRepository; // final로 수정
final을 달아줘야한다.
# 설명 :
final 키워드의 유무가 동작에 큰 영향을 미친다. final은 다음과 같은 특성을 가지고 있다.
불변성 (Immutability):
final로 선언된 변수는 한 번 초기화되면 변경할 수 없어지고. 즉, 이 변수에 다른 객체를 할당할 수 없게 된다. 그래서 의도치 않게 다른 값을 할당하거나 재초기화하는 실수를 방지할 수 있습니다.
의존성 주입:
Spring에서는 @Autowired가 적용된 필드가 final로 선언된 경우, Spring이 해당 필드를 주입해야 하며, 객체 생성 시 필드를 반드시 초기화해야 합니다. 만약 final 필드가 초기화되지 않으면, 객체가 생성될 수 없다.
반대로, final이 없는 경우 Spring이 객체를 주입하지 않았더라도 해당 필드가 null인 상태에서 객체가 생성될 수 있습니다. 이로 인해 나중에 해당 필드를 사용하려고 할 때 NullPointerException이 발생할 수 있다.
# 결론
final로 선언된 변수는 주입과 초기화를 보장하므로, 객체의 상태가 일관되게 유지됨.
이를 통해 불변성을 제공하고, 초기화 문제로 인한 오류를 줄일 수 있다.
특히, 의존성 주입이 중요한 Spring 프레임워크에서는 final을 사용하는 것이 좋다.
이런 이유로, final 키워드가 없으면 의도치 않은 초기화 문제로 인해 코드가 제대로 동작하지 않을 수 있으므로
이런 경우가 있을때, 해당 부분이 잘 되어 있나 확인 해보기.