2025. 3. 21. 13:19ㆍBackend/Spring
개요
과제를 진행을 하면서 공부하는 환경을 바꿔야겠다는 생각이 들어서 사무실로 옮기게 되었다.
MainPC를 사무실로 옮기고, Mini PC로 셋팅을 바꾸었다.
그러면서 생긴 문제가 있는데 똑같은 프로젝트가 각 다른 PC환경에서 생기는 문제를 서술해보겠다.
원인
@GetMapping("/todos")
public ResponseEntity<Page<TodoResponse>> getTodos(
@RequestParam(name = "page", required = false, defaultValue = "1") int page,
@RequestParam(name = "size", required = false, defaultValue = "10") int size,
@RequestParam(name = "weather", required = false) String weather,
@RequestParam(name = "startDate", required = false, defaultValue = DEFAULT_START_DATE) LocalDateTime startDate,
@RequestParam(name = "endDate", required = false, defaultValue = DEFAULT_END_DATE) LocalDateTime endDate
) {
return ResponseEntity.ok(todoService.getTodos(page, size, weather, startDate, endDate));
}
위에 코드가 Mini PC 환경에서 name or value 가 없다면
java.lang.IllegalArgumentException: Name for argument of type [int] not specified,
and parameter name information not available via reflection.
Ensure that the compiler uses the '-parameters'
// 밑 생략
다음과 같은 오류가 나오는 것을 확인을 하였다.
처음 보는 오류이기 때문에 chatGPT에게 물어보았다.
문제 원인 분석
위 예외 메시지는 Spring이 컨트롤러 메서드의 int 타입 매개변수를 처리하는 과정에서 이름을 찾을 수 없다는 것을 의미합니다. 즉, Spring이 매개변수의 이름을 알 수 없기 때문에 바인딩할 수 없는 상태입니다.
이렇게 이야기를 하였다.
처음에는 Spring Security를 적용을 하면서 Path 처리를 제대로 안하여 생긴 문제인줄 알았으나,
// 앞 생략
.authorizeHttpRequests(auth -> auth
.requestMatchers("/h2-console/**").permitAll()
.requestMatchers("/actuator/**").permitAll()
.requestMatchers("/auth/**").permitAll()
.requestMatchers("/admin/**").hasAuthority(UserRole.ROLE_ADMIN.name())
.anyRequest().authenticated()
)
// 뒤 생략
제대로 적용을 하였는데, 문제가 생긴 것이였다.
문제 해결
해결 방법은 간단 하였다.
@GetMapping("/todos")
public ResponseEntity<Page<TodoResponse>> getTodos(
@RequestParam(required = false, defaultValue = "1") int page,
@RequestParam(required = false, defaultValue = "10") int size,
@RequestParam(required = false) String weather,
@RequestParam(required = false, defaultValue = DEFAULT_START_DATE) LocalDateTime startDate,
@RequestParam(required = false, defaultValue = DEFAULT_END_DATE) LocalDateTime endDate
) {
return ResponseEntity.ok(todoService.getTodos(page, size, weather, startDate, endDate));
}
@GetMapping("/todos")
public ResponseEntity<Page<TodoResponse>> getTodos(
@RequestParam(name = "page", required = false, defaultValue = "1") int page,
@RequestParam(name = "size", required = false, defaultValue = "10") int size,
@RequestParam(name = "weather", required = false) String weather,
@RequestParam(name = "startDate", required = false, defaultValue = DEFAULT_START_DATE) LocalDateTime startDate,
@RequestParam(name = "endDate", required = false, defaultValue = DEFAULT_END_DATE) LocalDateTime endDate
) {
return ResponseEntity.ok(todoService.getTodos(page, size, weather, startDate, endDate));
}
위의 코드를 아래와 같이 변경하면 해결이 되었다.
내부 값을 name을 넣거나 value를 넣으면 해결이 되었다.
상세 문제 분석
왜 이런 문제가 생기는 것인가 찾아보았지만 뚜렷한 문제의 원인을 찾을 수가 없었다.
튜터님께 찾아가봤지만 같이 한시간을 찾아봐도 문제를 찾지 못하였다.
MainPC의 환경은 Ubuntu 22.04 LTS 환경이고
MiniPC의 환경은 Windows11 환경이다.
그리고 똑같이 Intellij 를 설치를 하고 똑같은 프로젝트를 clone 했는데 생긴 문제라 정확하게 잘 모르겠다.
다른 사람들도 문제를 상세한 원인에 대해서 찾지 못하고 공통적으로 윈도우인 것을 보니
커널의 문제거나, 윈도우의 문제라고 어렴풋이 생각을 하고 있다.
느낀점
왜 회사에서 같은 환경을 맞추려고 도커를 도입을 하고,
같은 사양을 쓰는지 약간 이해가 된다.
다음 프로젝트를 진행을 할 때는 팀원들과 최대한 환경을 맞춰보도록 해야겠다.
'Backend > Spring' 카테고리의 다른 글
| [Spring] @JsonCreator 와 @JsonProperty 을 사용해야하나? (3) | 2025.08.28 |
|---|---|
| [Spring] 분산락에서 발생하는 레이스 컨디션을 해결..?.part1 (1) | 2025.04.03 |
| [Spring] OutSourcing 프로젝트를 마치며.. (1) | 2025.03.07 |
| [Spring] 테스트 코드를 작성을 해보자. (0) | 2025.02.27 |
| [Spring] Filter와 Interceptor에 대해서 알아보고 사용해보자. (0) | 2025.02.26 |