이 에러 때문에 5시간을 소비했기에 너무너무 아까워서 기록하고자 합니다. (너무 허무해서 잊을 수 없다...)
또한 application.yml에 대해 너무나도 무지했다고 느껴 반성하고자 작성합니다....
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 라는 키워드로 구글링을 했습니다.
이 에러는 Spring이 application.yml
파일에서 ${oauth2.provider.apple.client.id}
와 같은 플레이스홀더를 해석하지 못해서 발생합니다. 보통 이런 문제는 다음과 같은 이유로 발생할 수 있다고 하네요.
application.yml
파일에 올바르게 정의되지 않았거나 경로가 잘못되는 경우
application.yml
파일에 해당 키가 없거나, 정확한 경로가 잘못되었음.
플레이스홀더가 올바르게 설정되지 않은 경우
@Value
어노테이션에서 사용한 플레이스홀더가 application.yml
파일에서 정확히 매칭되지 않음.
저의 경우는 1번 경로가 잘못된 경우입니다.....
일단 @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;
}
// 생략
}
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
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}"
가 되어야 정상 작동이 되는 것이네요!!