쇼핑몰 페이지에 아임포트 연동 구현 중 결제정보 검증과정에 필요한 API KEY를 깃헙에 노출하지 않기 위해서 properties 파일에서 불러올 필요가 있었다. 그런데 이 값이 null이었다.
우선 application.properties에 spring.profiles.include=API-KEY 를 적고 추가 프로퍼티 파일을 include 해주고 gitignore에 properties 파일을 깃헙 업로드 제외하도록 작성했다.
참고로 properties의 값 부분에 "" 따옴표를 적으면 에러가 발생한다.
이제 결제를 관리하는 컨트롤러 클래스에서 @value 어노테이션으로 api키와 api시크릿 키를 불러오고, 생성자에서 두 키를 인자로 iamportClient 객체를 생성해야 했는데, 키값들이 null이 나와 iamportClient 객체가 제대로 생성되지 않았다. null이 나오는 원인을 찾아봤지만 나와 다른 경우였다.(참고링크1, 참고링크2)
내 경우 컨트롤러에서 @value를 불러오는데 null이 나오는 것이다. @Controller 어노테이션은 @Component의 역할도 포함하고 있기 때문에 컨트롤러 클래스는 스프링 bean으로 등록되었고, 따라서 @value 어노테이션이 동작해야 맞는데 왜 null 값이 나올까?
자바의 생성자 호출 시점이 문제였다.
컨트롤러의 생성자 안에서 @value어노테이션 변수 값은 null이 나오지만, 컨트롤러의 다른 getMapping 메소드 안에서는 변수값이 제대로 나오는 것을 확인했다.
적어도 최초 빌드 때 @controller 클래스 생성(생성자 호출) -> @Value 값 끌어오기 순서로 실행된다. 그래서 컨트롤러 안에서 @value값이 null이 나왔던 것.
해결방법으로는 1. 생성자 안에서 iamportClient 객체를 만들지 말고 결제검증이 필요한 순간에 객체를 만들거나 2. api 키 값을 끌어오는 별도의 클래스를 만들어 get메소드를 사용하는 방법이 있겠다.
나는 2번방법으로 별도의 클래스를 만들어 get메소드를 작성해보았다. 이렇게 함으로써 HomeController, IamportAPI > Controller 생성자 순으로 호출되니 키값들이 제대로 출력되는 것을 확인할 수 있었다.