반응형
문제
import org.springframework.http.HttpMethod;
public class CorsConstant {
public static final String[] ALLOWED_ORIGINS = {
"http://localhost:3000"
};
public static final String[] ALLOWED_METHODS = {
HttpMethod.GET.name(),
HttpMethod.POST.name(),
HttpMethod.PUT.name(),
HttpMethod.DELETE.name(),
HttpMethod.OPTIONS.name()
};
}
@CrossOrigin 어노테이션에 origins를 입력 중, 상수 클래스를 만들어 가져오면 관리하기 편리할까 싶어서 로직을 작성하다가 위와 같은 에러를 만났다.
해결
우선 자바의 어노테이션은 컴파일 시점에 처리가 된다. 따라서 어노테이션의 속성들은 컴파일 시점 상수를 사용해야만 한다.
위의 CorsConstant의 ALLOWED_ORIGINS는 static final을 붙이긴 했지만 우선은 배열이므로 참조위치만 안 바뀔 뿐이지, 내부 요소의 값은 바뀔 수 있다. 따라서 컴파일 시점의 상수가 아니라서 에러가 난 것.
해결은.. 직접 문자열 배열로 써주거나 그냥 WebSecurityConfig로 중앙 집중식으로 써두었다.
@RestController
public class SampleController {
@CrossOrigin(
origins = {
"http://localhost:3000"
}
)
@GetMapping("/api/sample")
public String getSample() {
return "sample data";
}
}
이렇게 쓰거나
@Configuration
public class WebConfig {
public static final String[] ALLOWED_ORIGINS = {
"http://localhost:3000"
};
public static final String[] ALLOWED_METHODS = {
HttpMethod.GET.name(),
HttpMethod.POST.name(),
HttpMethod.PUT.name(),
HttpMethod.DELETE.name(),
HttpMethod.OPTIONS.name(),
RequestMethod.GET.name()
};
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins(ALLOWED_ORIGINS)
.allowedMethods(ALLOWED_METHODS)
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600)
.exposedHeaders("Custom-Response-Header1", "Custom-Response-Header2");
}
};
}
}
이렇게 써주었다.
ENUM으로도 테스트
public enum TestEnum {
GET("GET");
public final String value;
public static final String testValue = "GET";
TestEnum(String value) {
this.value = value;
}
}
ENUM으로도 테스트 해봤는데 어노테이션 속성으로는 static 속성들만 표시가 되었다. (TestEnum.GET도 내부적으로는 public static final TestEnum GET = new TestEnum("GET") 이니깐.)
정리
- 자바의 어노테이션은 컴파일 시에 처리가 되므로, 어노테이션의 속성들은 컴파일 시점 상수여야 한다.
- 배열의 경우, static final을 붙여도 내부 요소는 변경 가능하므로(mutable) 컴파일 시점 상수가 아니다.
참고 링크
반응형
'TIL ✍️' 카테고리의 다른 글
24/08/21(수) 103번째 TIL : EC2 EBS 재부팅 없이 용량 확장 도전기 (0) | 2024.08.30 |
---|---|
24/08/20(화) 102번째 TIL : spring boot에서 active profile 선택하기 (1) | 2024.08.30 |
24/08/16(금) 100번째 TIL : CORS 커스텀 응답 헤더 가져오기 (0) | 2024.08.19 |
24/08/14(수) 99번째 TIL : Spring Security 없이 CORS 설정하기 (0) | 2024.08.19 |
24/08/13(화) 98번째 TIL : Spring boot에서 record로 application.yml 읽기 (0) | 2024.08.13 |