[에러 해결] java.lang.IllegalArgumentException: Could not resolve placeholder 에러 해결하기

김진형·2024년 8월 13일
0

1. Why?

이 에러 때문에 5시간을 소비했기에 너무너무 아까워서 기록하고자 합니다. (너무 허무해서 잊을 수 없다...)
또한 application.yml에 대해 너무나도 무지했다고 느껴 반성하고자 작성합니다....

2. 에러 발생

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ~~
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ~~
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ~~

에러가 발생...
그래서 IllegalArgumentException: Could not resolve placeholder 라는 키워드로 구글링을 했습니다.

3. 에러 원인

이 에러는 Spring이 application.yml 파일에서 ${oauth2.provider.apple.client.id}와 같은 플레이스홀더를 해석하지 못해서 발생합니다. 보통 이런 문제는 다음과 같은 이유로 발생할 수 있다고 하네요.

  1. application.yml 파일에 올바르게 정의되지 않았거나 경로가 잘못되는 경우
    application.yml 파일에 해당 키가 없거나, 정확한 경로가 잘못되었음.

  2. 플레이스홀더가 올바르게 설정되지 않은 경우
    @Value 어노테이션에서 사용한 플레이스홀더가 application.yml 파일에서 정확히 매칭되지 않음.

저의 경우는 1번 경로가 잘못된 경우입니다.....

4. 에러 해결

일단 @Value를 사용한 코드는 다음과 같습니다.

@Component
public class AppleOauthProvider implements OauthProvider {

    private final String clientId;
    private final String teamId;
    private final String keyId;
    private final String keyPath;

    private static final String APPLE_JWKS_URL = "https://appleid.apple.com/auth/keys";
    
    public AppleOauthProvider(
        @Value("${oauth2.provider.apple.client.id}") final String clientId,
        @Value("${oauth2.provider.apple.team.id}") final String teamId,
        @Value("${oauth2.provider.apple.key.id}") final String keyId,
        @Value("${oauth2.provider.apple.key.path}") final String keyPath
    ) {
        this.clientId = clientId;
        this.teamId = teamId;
        this.keyId = keyId;
        this.keyPath = keyPath;
    }
    
    // 생략
}
  • 기존 application.yml 코드
spring:
  # .env import
  config:
    import: optional:file:.env[.properties]
  oauth2:
    provider:
      apple:
        auth:
          token-url: https://appleid.apple.com/auth/token
        redirect:
          url: ${REDIRECT_URL}
        client:
          id: ${CLIENT_ID}
        team:
          id: ${TEAM_ID}
        key:
          id: ${KEY_ID}
          path: ../../../../AuthKey_${KEY_ID}.p8
  • 수정한 application.yml 코드
spring:
  # .env import
  config:
    import: optional:file:.env[.properties]
oauth2:
  provider:
    apple:
      auth:
        token-url: https://appleid.apple.com/auth/token
      redirect:
        url: ${REDIRECT_URL}
      client:
        id: ${CLIENT_ID}
      team:
        id: ${TEAM_ID}
      key:
        id: ${KEY_ID}
        path: ../../../../AuthKey_${KEY_ID}.p8

수정한 application.yml을 사용하니 에러가 해결됐습니다. 아래 사진을 보시면

차이점이 보이시나요??

바로 들여쓰기 때문에 경로 설정이 잘못된 거였습니다!!

그렇기에 기존 application.yml 코드라면 "${oauth2.provider.apple.client.id}"
가 아닌"${spring.oauth2.provider.apple.client.id}"가 되어야 정상 작동이 되는 것이네요!!

참고 사이트:
[오류해결] org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ~

0개의 댓글