error handling

[errorHandling] spring, 로컬 변수에 저장된 값을 yaml에서 못읽어오는 문제

기록하는 습관. 2023. 1. 28. 06:29

안녕하세요. Java백엔드 개발자를 꿈꾸며 공부중인 김은철입니다.

해당 포스팅의 내용은 이해한 내용을 토대로 작성되었습니다.

그렇기 때문에 포스팅에 잘못된 내용이 포함되어 있을 수 있음과 미흡한 점이 있을 수 있습니다.


의아한 내용이나 틀린 내용이 있다면 적극적인 지적과 추가적으로 학습하며 좋을 내용을 알려주시면 감사하겠습니다.


여러분의 지적과 관심은 저의 성장에 큰 도움이 될 것이라 확신합니다.


감사합니다.



주요 구성 환경

IntelliJ IDEA 2022.1.3

Spring Boot 2.7.4

Spring Security 5.7.2

gradle version 7.5

jjwt version 0.11.5



1. 발생 문제

[1] 문제가 된 구성

JWT로그인을 구현하면서 secrectKey를 로컬 환경변수에 저장하고 토큰을 생성하는 JwTokenizer의 필드인 secretKey에 값을 저장시키길 바랐습니다. 주요 구성은 아래와 같습니다.

  • application.yml
// 기타 옵션 조건 생략
jwt:
  key: ${JWT_SECRET_KEY}     
  access-token-expiration-minutes: 20
  refresh-token-expiration-minutes: 300

  • 로컬 환경변수 설정

image


  • JwTokenizer.java
@Component
public class JwtTokenizer {
    // 시크릿 키
    @Getter
    @Value("${jwt.key}")
    private String secretKey;

    // 엑세스 만료시간
    @Getter
    @Value("${jwt.access-token-expiration-minutes}")
    private int accessTokenExpirationMinutes;

    // 리프레쉬 토큰 만료시간
    @Getter
    @Value("${jwt.refresh-token-expiration-minutes}")
    private int refreshTokenExpirationMinutes;


// ....이하 코드 내용 생략
}

[2] 문제가 된 이유와 로그

위와 같은 설정을 주었음에도 불구하고 로컬 환경 변수에 저장된 secretKey의 값을 불러오지 못하는 문제가 발생함을 아래와 같은 로그로 확인이 가능했습니다.

  • Log
// 이하 로그 생략 ...

2023-01-28 05:59:08.695 DEBUG 20004 --- [           main] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
2023-01-28 05:59:08.705 DEBUG 20004 --- [           main] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
What is secretKey ??????????????????????: 12345678987ab

// 이하 로그 생략 ...

의도에 따른다면 로컬 환경 변수에 저장된 secretKey인 djsafhkjsdaflkjhdsjafhiou3h4ou......의 키가 출력이 되었어야 했습니다. 저는 이문제에 대해서 2가지 해결 방안을 제시하며 내용은 아래와 같습니다.


2. 문제의 해결 (2가지)

[1] yaml을 두 가지로 나누어 관리하기

문제가 되었을 때는 yaml파일을 1개로 관리를 했었습니다.

하지만, yaml파일을 2개로 나누어 관리하는 것이 하나의 대안이 될 수 있을 것이라 생각했습니다.

해당 방식을 통해 얻을 수 있는 이점으로는 github를 통해 프로젝트의 상태관리를 할 때 민감한 정보를 담고있는 yaml파일을 gitignore에 추가함으로써 민감한 정보를 손 쉽게 배재할 수 있습니다.

각각의 yaml파일은 내용은 아래와 같습니다.

  • application.yml
// 프로젝트 전반에서 필요한 파일 설정
// 프로퍼티 설정에 대한 코드는 모두 생략하겠습니다.
  • application-secretKey.yml
jwt:
  key:${JWT_SECRET_KEY} 
  access-token-expiration-minutes: 20
  refresh-token-expiration-minutes: 300

프로젝트 빌드시 두 가지 yaml을 읽어와 주어야 하기 때문에 아래와 같은 수정을 해주었습니다.


  • @SpringBootApplication이 포함된 자바 파일의 수정
@EnableJpaAuditing
@SpringBootApplication
public class JwtApplication {
    private static final String PROPERTIES =
            "spring.config.location="
                    +"classpath:/application.yml"
                    +",classpath:/application-secret.yml";

    public static void main(String[] args) {
        new SpringApplicationBuilder(JwtApplication.class)
                .properties(PROPERTIES)
                .run(args);
    }

}

파일의 수정을 통해 아래와 같이 의도한 로그를 얻으며 문제를 해결할 수 있었습니다.


  • Log
// 이하 로그 생략 ...

2023-01-28 06:17:04.560 DEBUG 22680 --- [           main] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
2023-01-28 06:17:04.568 DEBUG 22680 --- [           main] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
What is secretKey ??????????????????????: djsafhkjsdaflkjhdsjafhiou3h4ou5y483u90tjsdfkasdmfndasfkljho3uh981u5lmdoas8u581uo5jljlkdasaksu09r8109833y5hjasdl

// 이하 로그 생략 ...

[2] 프로젝트 / 컴퓨터 껐다가 다시 켜기 or ItellJ IDE 업데이트

결과부터 이야기하자면 문제가 되었던 코드라고 소개한 부분이 틀린것이 아니었습니다. 추측컨데, IntellJ IDE 자체 오류로 환경 변수에 저장된 secretKey를 읽어오지 못했던 것 같습니다.

이 문제 외에, IntellJ IDE 자체 오류가 생각보다 많습니다.

비슷한 구성을 하신 분이라면 컴퓨터를 껐다가 다시 켜시던, 프로젝트를 껐다가 다시 켜시던, IntellJ IDE를 업그레이드 또는 다운그레이 해보시길 권장드립니다. 저는 컴퓨터를 껐다가 다시 켜니 문제가 되었다고 소개드렸던 부분이 잘 작동되었습니다.


* 마무리하며

조금은 어처구니가 없었던 문제였습니다. 생각보다 시간 많이 뺐긴거 같은데....