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 생성 및 검증에 사용
'트러블슈팅' 카테고리의 다른 글
| [Spring] 고객 조회 기능 구현하며 겪은 트러블슈팅 - Pageable과 JPQL 적용기 (0) | 2026.07.13 |
|---|---|
| Session 로그인 적용하면서 API 구조 리팩토링하기 (0) | 2026.07.09 |
| [IntelliJ IDEA 기능] Compact Middle Packages / 패키지 설정 (0) | 2026.07.07 |
| [Spring] 전체조회시, 조건 전체조회 (feat.@RequestParam) (0) | 2026.06.30 |
| ArrayList 기반 장바구니 구현 (0) | 2026.06.16 |