본문 바로가기
프로그래밍/세팅 및 오류

[Error] @Value Null 오류

by 노잼인간이라불립니다 2023. 5. 21.

0. 개요

 qa와 production 테이블을 분리해서 호출하게끔 해달라는 요구사항이 들어왔습니다.

 

 전체적으로는 Spring Batch를 이용하여 코드를 작성하였고, 기존에는 Reader부분에서는 Spring Batch가 제공해주는  jdbcPagingReader를 이용해서 데이터를 읽어오거나, jdbc template을 이용하여 DB에서 데이터를 저장, 조회하는 방식으로 코드가 구성되어 있었습니다.

 

1.  문제점

 현재는 1개의 테이블만을 바라보는 쿼리문을 2개의 테이블을 바라보도록 변경하려고 했을 때 가장 먼저 떠오른 방법은 yml파일을 이용하여 qa와 production 각각 다른 테이블 코드를 넣어주어서, 이 값을 읽어 테이블을 crud하는 것이었어요. (이전에 일부 setting값은 공통적으로 사용하고, qa, production 각각 다른 설정이 필요한 부분도 있어서 다른 .yml파일을 만들어서 사용하고 있었습니다. )

 

 열심히 코드를 수정하고나서 테스트를 돌려보니 .yml파일이나 .properties파일에 값을 선언해놓은 값들이 정상적으로 들어오지 않고 Null값으로 들어오는 문제가 발생했습니다.

 

2.  해결

 해결방법은 의외로 간단했어요. 저번과 비슷한 맥락의 오류였기 때문이죠. 그렇기 때문에 문제 정의가 빠르게 가능했고, 해결할 수 있었어요. 그리고 다시 한번 Spring Batch에서는 @Configuration파일이 중요하다는 것을 알게 되었어요.

 

 결론을 말씀드리자면 @Value는 미리 스프링 컨테이너에 올려놓는 객체(Bean)가 아니라고 한다면 작동하지 않아요. 그래서 일반객체에서 @Vaule를 사용하려고 한다면 반드시 @Configuration파일에서 injection시켜서 사용해야 합니다.

 

 그렇기 때문에 @Configuration파일이 있는 곳에서 @Value를 이용해 값을 선언해주고 이 값이 필요한 객체에게 파라미터 값으로 넘겨주는 방식으로 문제를 해결했습니다.

 

- 추가설명

 간단히 말씀드리면 스프링 컨테이너에 싱글톤 객체가 올라갈 때 스프링이 @Value이 있는 필드에 yml이나 properties에서 해당값을 찾아 자동으로 주입해주는데, 개발자가 스스로 일반 객체를 만들어서 사용하게 된다면 스프링컨테이너에 싱글톤 객체로 올라가는 부분의 프로세스가 발생하지 않기 때문에, @Value를 선언해주더라도 값이 주입되지 않습니다..

 

2.  정리

 마지막으로 정리를 해보겠습니다.

 발생한 문제점을 정의해보자면 "@Value를 사용했지만 값이 Null 값이 들어온다." 였습니다. 그리고 이를 해결하기 위한 방법은 "스프링 Bean 객체로 선언된 객체 내부에서만 @Value를 사용했을 때 yml이나 properties에서 값을 가져올 수 있기 때문에 싱글톤 객체 내부에서 @Value를 선언하고 그 필드값을 내가 사용하고자 하는 객체에 파라미터로 받아서 사용한다." 였습니다.

여기서 말하는 스프링 Bean 객체는 스프링에서 싱글톤으로 관리되는 모든 객체를 의미합니다.