상황
⚠️"특정 사용자 조회" 와 "특정 사용자 삭제" 명령어 처리 시 오류 발생

원인 가능성
- 각 메소드에 orElseThrow() 와 같은 예외 처리를 하지 않은 것
- 삭제 메소드에 존재하지 않는 사용자인 경우 처리할 조건을 지정해주지 않은 것
해결방법
1. [특정 사용자 조회] 메소드 수정
기존 코드 (UserService)
// 특정 사용자 조회 (SELECT - READ)
public User getUserById(Long id){
return userRepository.findById(id).get();
}
// JPA가 자동으로 만들어주는 findById()를 이용해서 조회해볼 수도 있음
public User findById(Long id){
return userRepository.findById(id).orElseThrow();
}
- 특정 사용자 조회 시 return 부에 get()으로 한 것을 해당하는 특정 사용자가 없을 시 예외처리 추가 고려➡️orElseThrow() 로 처리
- 먼저 getUserById()와 findById() 메소드가 겹치므로 findById()의 메소드를 주석처리
- 이 후 getUserById()메소드에 orElseThrow()로 예외처리를 하였다.
수정 코드 (UserService)
// 특정 사용자 조회 (SELECT - READ)
public User getUserById(Long id){
return userRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "사용자를 찾을 수 없습니다."));
}
2. [특정 사용자 삭제] 메소드 수정
기존 코드 (UserService)
// 사용자 삭제 (DELETE)
public void deleteUser(Long id){
userRepository.deleteById(id);
}
getUserById()에 예외 추가
// 사용자 삭제 (DELETE)
public void deleteUser(Long id){
if(!userRepository.existsById(id)){
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "삭제할 사용자가 없습니다.");
}
userRepository.deleteById(id);
}
- 예외처리를 하여서 존재하지 않는 id이면 “삭제할 사용자가 없습니다”라는 에러를 발생시키게끔 하였다.
⚠️하지만 여전히 해결되지 않음
3. 오류 메시지 분석
java.lang.IllegalArgumentException: Name for argument of type [java.lang.Long] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.
➡️Spring이 @PathVariable로 전달된 id값을 제대로 인식못해 생기는 컴파일 옵션 문제였다.
혹은 @PathVariable에 name을명시하지 않았을때 발생할 수 있는 문제였다.
4. Spring이 @PathVariable의 매개변수명(id)을 인식하도록 명시함
기존 코드 (UserController)
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
수정 코드 (@PathVariable("id") 추가)
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable("id") Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
이처럼 @PathVariable에 @PathVariable Long id 가 아닌 @PathVariable(”id”) Long id 처럼 id를 명시한 후
해결할 수 있었다.
✅변경 후 실행결과

@PathVariable 어노테이션에 불명확한 값의 경우 큰 따옴표 안에 명시해야하는 것을 배울 수 있었다.
'Recording > 에러 기록장' 카테고리의 다른 글
[Spring Data JPA] 여러 관계가 매핑된 엔티티의 toString() 메소드 출력 오류 (0) | 2025.02.21 |
---|---|
[Docker] 포트 충돌 문제 해결 (0) | 2025.02.20 |
[Expo] 리액트 네이티브 앱 개발 - IDB 오류 (1) | 2022.07.05 |
[Git] GoormIDE(구름 IDE) - Github(깃허브) 연동 문제 (0) | 2022.04.14 |
[CSS] GoormIDE - 동물상 테스트 Codepen 템플릿 오류 (0) | 2022.04.13 |
상황
⚠️"특정 사용자 조회" 와 "특정 사용자 삭제" 명령어 처리 시 오류 발생

원인 가능성
- 각 메소드에 orElseThrow() 와 같은 예외 처리를 하지 않은 것
- 삭제 메소드에 존재하지 않는 사용자인 경우 처리할 조건을 지정해주지 않은 것
해결방법
1. [특정 사용자 조회] 메소드 수정
기존 코드 (UserService)
// 특정 사용자 조회 (SELECT - READ)
public User getUserById(Long id){
return userRepository.findById(id).get();
}
// JPA가 자동으로 만들어주는 findById()를 이용해서 조회해볼 수도 있음
public User findById(Long id){
return userRepository.findById(id).orElseThrow();
}
- 특정 사용자 조회 시 return 부에 get()으로 한 것을 해당하는 특정 사용자가 없을 시 예외처리 추가 고려➡️orElseThrow() 로 처리
- 먼저 getUserById()와 findById() 메소드가 겹치므로 findById()의 메소드를 주석처리
- 이 후 getUserById()메소드에 orElseThrow()로 예외처리를 하였다.
수정 코드 (UserService)
// 특정 사용자 조회 (SELECT - READ)
public User getUserById(Long id){
return userRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "사용자를 찾을 수 없습니다."));
}
2. [특정 사용자 삭제] 메소드 수정
기존 코드 (UserService)
// 사용자 삭제 (DELETE)
public void deleteUser(Long id){
userRepository.deleteById(id);
}
getUserById()에 예외 추가
// 사용자 삭제 (DELETE)
public void deleteUser(Long id){
if(!userRepository.existsById(id)){
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "삭제할 사용자가 없습니다.");
}
userRepository.deleteById(id);
}
- 예외처리를 하여서 존재하지 않는 id이면 “삭제할 사용자가 없습니다”라는 에러를 발생시키게끔 하였다.
⚠️하지만 여전히 해결되지 않음
3. 오류 메시지 분석
java.lang.IllegalArgumentException: Name for argument of type [java.lang.Long] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.
➡️Spring이 @PathVariable로 전달된 id값을 제대로 인식못해 생기는 컴파일 옵션 문제였다.
혹은 @PathVariable에 name을명시하지 않았을때 발생할 수 있는 문제였다.
4. Spring이 @PathVariable의 매개변수명(id)을 인식하도록 명시함
기존 코드 (UserController)
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
수정 코드 (@PathVariable("id") 추가)
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable("id") Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
이처럼 @PathVariable에 @PathVariable Long id 가 아닌 @PathVariable(”id”) Long id 처럼 id를 명시한 후
해결할 수 있었다.
✅변경 후 실행결과

@PathVariable 어노테이션에 불명확한 값의 경우 큰 따옴표 안에 명시해야하는 것을 배울 수 있었다.
'Recording > 에러 기록장' 카테고리의 다른 글
[Spring Data JPA] 여러 관계가 매핑된 엔티티의 toString() 메소드 출력 오류 (0) | 2025.02.21 |
---|---|
[Docker] 포트 충돌 문제 해결 (0) | 2025.02.20 |
[Expo] 리액트 네이티브 앱 개발 - IDB 오류 (1) | 2022.07.05 |
[Git] GoormIDE(구름 IDE) - Github(깃허브) 연동 문제 (0) | 2022.04.14 |
[CSS] GoormIDE - 동물상 테스트 Codepen 템플릿 오류 (0) | 2022.04.13 |