트러블슈팅

error: cannot find symbol @Value("${jwt.secret.key}") 해결

chungmani 2026. 7. 22. 21:12

1. 문제 상황

 

JWT를 구현하면서 application.yml에 저장된 JWT Secret Key를 가져오기 위해 @Value 어노테이션을 사용했다.

근데 심볼을 찾을 수 없다는 오류가 뜸.

 


2. 원인

문제의 원인은 Lombok과 Spring 모두 @Value라는 이름의 어노테이션을 가지고 있는데

나는 Lombok의 @Value 이노테이션을  import하고 있었음.


3. 해결 방법

Spring Framework에서 제공하는 @Value를 import하도록 수정했다.

 

 


4. Spring의 @Value란?

Spring의 @Value는 application.properties 또는 application.yml 등에 설정된 값을 주입받을 때 사용하는 어노테이션이다.

예를 들어 application.yml에 다음과 같이 작성했다고 하자.

jwt:
  secret:
    key: my-secret-key

Java 코드에서 다음과 같이 사용할 수 있다.

@Value("${jwt.secret.key}")
private String secretKeyString;

그러면 Spring이 실행될 때 설정 파일의 값을 읽어서 다음 필드에 넣어준다.

secretKeyString = "my-secret-key";

직접 값을 코드에 작성하는 대신 외부 설정 파일에서 값을 가져올 수 있다.

 


5. Lombok의 @Value란?

import lombok.Value;

 

Lombok의 @Value는 클래스를 불변 객체(Immutable Object) 로 만들어주는 어노테이션이다.

@Value
public class User {
    String username;
    String password;
}

Lombok이 컴파일 시점에 Getter, 생성자 등을 자동으로 만들어준다.

또한 필드를 변경할 수 없도록 만들어 불변 객체를 쉽게 생성할 수 있도록 도와준다.

따라서 Lombok의 @Value와 Spring의 @Value는 이름만 같을 뿐 목적이 완전히 다르다.

 


 

6. JWT에서 Spring @Value를 사용하는 이유

 

JWT를 사용할 때 Secret Key는 중요한 설정값이다.

예를 들어 JWT를 생성하고 검증할 때 동일한 Secret Key를 사용해야 한다.

@Value("${jwt.secret.key}")
private String secretKeyString;

이렇게 설정 파일에 Secret Key를 저장하고 Spring의 @Value로 가져오면 코드에 직접 Secret Key를 작성하지 않아도 된다.

이후 @PostConstruct가 실행되면서 Secret Key를 JWT에서 사용할 수 있는 SecretKey 객체로 변환한다.

@PostConstruct
public void init() {
    byte[] bytes = Decoders.BASE64.decode(secretKeyString);
    this.key = Keys.hmacShaKeyFor(bytes);
}

전체적인 흐름은 다음과 같다.

application.yml
      ↓
jwt.secret.key 설정
      ↓
Spring의 @Value
      ↓
secretKeyString에 값 주입
      ↓
@PostConstruct 실행
      ↓
SecretKey 객체 생성
      ↓
JWT 생성 및 검증에 사용