[글 쓴 의도]

 

 이번 토이 프로젝트 주제는 이전에 진행했던 동일 주제에 로그인, Open API, 회원가입 등 다양한 기능을 추가하는 방향으로 진행하기로 했다. 내가 맡은 부분은 Kaka Open API를 연결하고, 여정을 등록하는 과정에서 장소 이름을 입력하면 도로명 주소로 변환하는 기능을 구현하기로 했다. Key 값을 외부에 노출하지 않기 위해 .env 파일에 KAKAO_KEY 필드를 추가하고 application.yaml 파일에 api.key 항목을 추가해서 @Value 어노테이션으로 관리하려고 했다. 하지만 @Value 어노테이션이 잘 동작하지 않는 것을 확인했다. 이유를 알아보자

 

 

[.env 파일]

 

[application.yaml 파일]

 

 

[@Value를 적용한 필드]

 

[문제가 발생한 이유]

 

 @Value를 썼을 때, 인텔리제이가 아무 잔소리 없이 넘어갔다는 것은 매핑은 잘 되었다고 볼 수 있다. 하지만 Kakao API를 연결하는 과정에서 연결이 안된다. postman으로 직접 Kakao API에 연결도 해보고 필드에 key 값을 하드코딩을 해본 결과도 잘 동작하므로 Key 값의 오타는 아니다. 그럼 문제는 @Value가 잘 매핑되지 않았다로 결론을 냈다. 

 

@Value의 동작 순서

 여러 블로그를 참고한 결과 @Value의 동작 시점은 의존 관계 주입 시점이라는 이유였다.

 

 Spring은 의존관계 주입을 위해서 Controller, Service, Repository 등 @Component 어노테이션이 붙은 친구들을 Bean으로 등록한다. 내가 개발하는 기능은 @Component 어노테이션이 들어가지 않은 클래스에서 진행했기에 (스프링 빈으로 등록되지 않았기에) @Value 어노테이션이 깡통이었던 것이다. 

 

[해결 방법]

 

 @Value 를 사용하는 클래스에 Spring이 발견할 수 있도록 @Component가 들어간 어노테이션을 붙여주면 된다. 해당 클래스는 API 관련 기능만 담당하기에 그냥 @Component를 붙여주자.

 

 

[그래도 안돼]

 왜 안될까 @Component를 붙여도 Spring이  컴포넌트 스캔을 못하는 경우도 있을 수 있어 

 

 이건 팀원분들한테 물어보고 해결해야겠따. 일단 자고 다음에 수정해야겠어

 

 

[문제는 없을까?]

 @Component를 붙여주면 편리하지만 단점이 여러가지 있다.

 

1. Spring IoC 컨테이너에 의해 관리됨으로 테스트나 클래스를 변경할 때 불편하다.

2. 클래스를 테스트할 때 인스턴스를 직접 생성하는 것이 어렵다.

3. 고작 Key 하나만을 위해 Spring이 관리해야 하는 Bean이 늘었다.

 

대안으로는 @Configuration , @Bean을 사용해서 외부 속성으로 주입받는 방법도 있다.  -gpt-