본문 바로가기

Programming Language/Java

[Java] @Requiredargsconstructor 그리고 NPE 에러

[Spring Boot] @Requiredargsconstructor 그리고 NPE 에러


개요

  프로젝트를 진행하고 규모가 커지면서 많아진 생성자들의 의존성을 편리하게 주입하게 위해 사용하였던 @Requiredargsconstructor 어노테이션과 이에 따라 발생한 NPE에 대해 같은 실수를 반복하지 않기 위해 글을 작성해본다.

 

소개

@Requiredargsconstructor는 무엇일까?

 

Lombok을 통해 초기화 되지않은 final 필드 혹은 @NonNull이 붙은 필드에 대해, 생성자를 자동으로 생성하여 의존성을 주입해주는 어노테이션

 

어노테이션 사용에 대한 고찰

 

Spring Boot를 활용한 프로젝트 경험은 없었고, JAVA만을 사용한 프로젝트의 경험은 적었기에 Lombok을 통한 어노테이션의 사용방법은 더욱 미숙하였다. 프로젝트의 규모가 커지면서 하나의 클래스에 많은 서비스 클래스들을 호출하여 사용하게 되었고, 이에 따라 늘어나는 생성자들로 인해 코드가 길어졌다. 이를 해결하고자 @Requiredargsconstructor 어노테이션을 사용하게 되었는데, 프로그램을 호출하면서 NPE 에러를 만나게 되었다.

 

"NPE는 왜 발생하였을까?"

 

정답은 위에 나와있다. @Requiredargsconstructor 어노테이션은 final 필드에 한하여 생성자를 생성해준다. 하지만, 나는 선언한 서비스에 final 키워드를 붙혀주지 않았고 해당 서비스에 생성자가 생성되지 않아서 빈 껍대기의 서비스가 만들어져 NPE가 발생한 것이다.

 

"그렇다면 왜 생성자가 없으면 에러를 발생시킬까?"

 

생성자로 객체가 생성되지 않으면 객체는 Null 값을 갖게 되고, 그런 Null값에서 선언한 변수 타입이 갖는 메소드 혹은 필드를 호출하면 당연히 없는 값을 호출하고자 함으로 NPE가 발생하게 된다.

 

이번 실수를 계기로 개발을 좀 더 편리하게 하기 위한 어노테이션 사용시, 장점만 보고 사용하는것이 아닌 사용방법 및 주의점 그리고 특징까지도 파악을 하며 사용해야 생각하지 못한 에러를 만나는 상황을 최소화시킬 수 있음을 한번 더 깨닫게 되었다.