TIL(Today I Learned)/트러블슈팅

[트러블 슈팅] Spring 심화 개인과제

jiyoon0000 2024. 11. 29. 12:21

<배경> - 어떤 현상을 발견했는가?

1. @RequestParam으로 Enum 값 처리 postman 오류

 

2. @NotNull과 Bean Validation이 작동하지 않음

 

3. @PostMapping 어노테이션 사용 불가 오류

 

4. Project JDK is not defined

<발단> 이런 장애가 생길 수 있다는 것을 인지

1. @RequestParam으로 Enum 값 처리 postman 오류

-@RequestParam이 enum 타입 값을 처리하지 못하거나 올바르게 매핑되지 않으면 400 Bad Request 오류가 발생한다는 것을 인지

-클라이언트가 enum 문자열 값을 정확히 전달하지 않거나, 서버가 enum을 변환하지 못할 시에 발생

 

2. @NotNull과 Bean Validation이 작동하지 않음

-Dto에서 @NotNull, @DecimalMin 어노테이션이 작동하지 않는 문제 발생

-SpringBoot Jakarta 패키지를 적용해야하는데 javax를 사용 = 의존성 누락

 

3. @PostMapping 어노테이션 사용 불가 오류

-@PostMapping 어노테이션 사용 시 Annotations are not allowed here 라는 오류 발생

-코드 작성 위치에서 @PostMapping을 사용할 수 없는 구조적인 문제가 존재

-@PostMapping 어노테이션은 Spring MVC에서 HTTP POST 요청을 처리하는 메서드에 사용할 수 있는데, 해당 어노테이션이 클래스 선언이나 메서드 외부에서 사용되면 오류 발생

 

4. Project JDK is not defined

-처음 과제 파일을 다운받아 IntelliJ에서 실행시켰을 때 Project JDK is not defined 라는 경고와 함께 프로젝트가 생성되지 않는 문제 발생, 현재 내가 설정해놓은 것과 다운받은 프로젝트의 설정이 달라 발생된 문제이다.

 

<전개> 장애를 대응, 해결하던 와중에

1. @RequestParam으로 Enum 값 처리 postman 오류(해결)

Postman에서 enum 값을 직접 전달하면서 테스트를 하는데 enum 값이 정확히 매핑되지 않으면서 요청이 거부되었음. 코드에는 enum을 대문자로 적고, 테스트 시에 소문자로 적은 것이 원인이었다.

Spring이 @RequestParam을 통해 전달된 문자열을 자동으로 enum으로 변환하려면, enum값과 요청값이 정확히 일치해야함.

 

2. @NotNull과 Bean Validation이 작동하지 않음

spring-boot-starter-validation 의존성을 추가하고, 패키지도 jakarta.validation으로 변경하여 오류 해결

 

3. @PostMapping 어노테이션 사용 불가 오류

@PostMapping 어노테이션을 해당 어노테이션이 클래스 선언이나 메서드 외부에서 사용되면 오류 발생한다고 하여 위치 확인을 했는데 정확한 위치에서 사용되고 있었음

Gradle 의존성 문제가 있을 수도 있다고 판단

 

4. Project JDK is not defined

프로젝트가 JDK 설정을 제대로 읽지 못하여 Gradle에서 JVM Toolchain 설정을 확인했더니 버전이 달라서 생긴 문제, 그리고 SDK가 선택이 되어 있지 않아서 발생한 문제 -> 버전을 확인하여 프로젝트 설정에서 버전을 맞춰서 문제 해결

Gradle Sync가 실패했을 때, 프로젝트 실행 뿐 아니라 다른 의존성 관리 작업에도 영향을 미쳐 가장 우선적으로 해결이 필요하다는 것을 알게 되었다.

 

<위기> 또 다른 장애 발견 또는 간단하게 해결할 수 없다는 것을 알게 되어서

&  <절정> 근본적인 해결을 위해 이런 방법으로 접근하였다.

 

1. enum 타입 컨버터 추가

테스트 과정 뿐만 아니라 클라이언트를 고려해 봤을 때, 정확한 enum 값을 전달하는 것은 어렵다고 생각하여 검색을 해보니 @RequestParam과 함께 enum 타입 컨버터를 추가 구현하면 대소문자 구분 없이 enum 값을 매핑 가능

-조금 더 공부해본 뒤에 적용가능할 것 같음

 

2. 의존성 확인

javax 대신 jakarta를 import하여 패키지를 전환하고 의존성을 추가하여 문제 해결. Spring Boot 3.x 이상의 환경에서의 유효성 검사에 대해 이해할 수 있게 되었음.

 

3. Spring MVC

Gradle 프로젝트를 다시 동기화해봤지만 동일한 오류 발생, intelliJ의 Download Documentation 버튼을 클릭해 해결 시도

 

Spring Web 관련 의존성이 제대로 다운되지 않아 IntelliJ가 이를 인식하지 못하면서 오류 발생, 이런 오류가 발생했을 경우 Spring 의존성과 관련된 메타데이터를 다시 다운로드 한 후 재실행해야함

 

단순한 의존성 문제인 줄 알았는데, Gradle 캐시와 IntelliJ 간의 연계가 제대로 이루어지지 않으면서 문제가 복잡해짐

 

4. 호환성

IntelliJ에서 프로젝트가 JDK를 인식하지 못해 Gradle 빌드 및 의존성 관리를 수행할 수 없었음, 이때 확인해야 할 것은 시스템에 JDK가 제대로 설치되어있는지 확인하고, Gradle도 올바른 경로를 찾는지 확인해야함

 

<결말> 따라서 이런 방법을 통해 근본적으로 해결 및 앞으로 유지, 보수에 용이하게 개선하게 되었다.

클라이언트-서버 간 데이터 불일치 문제를 근본적으로 해결해야 유지보수가 간편하다는 것을 인지하게 되었다. 또한, 클라이언트가 값을 잘못 전달했을 경우, 명확한 예외 메시지 반환하도록 처리하는 것도 필요한 것 같다.

 

코드를 작성할 때 원하는 어노테이션을 입력하면 자동으로 import가 되서 크게 신경을 쓰지 않았는데 정확한 패키지인지 확인하는 작업을 거쳐야겠다고 생각하게 되었다. 만약 이런 유효성 검사 관련된 어노테이션이 제대로 적용되지 않는 경우, 클라이언트로부터 null 값이나 비정상적인 데이터가 전송될 가능성이 있다는 것을 알게 되었다. 또한, 원하는 기술을 쓰기 위해 적절한 의존성을 추가해야된다는 경각심을 가지게 되었다. JDK, Gradle버전, Spring Boot 버전을 항상 확인하는 습관을 가져야겠다.

 

그리고 협업을 하거나 다른 사람의 코드를 가져와서 사용할 때 버전확인하는 것도 중요하다고 생각하게 되었다.

1. IntelliJ 프로젝트 SDK 설정 확인 및 완료

2. Gradle JVM Toolchain 설정 확인 및 추가(build.gradle)

3. 환경변수 (JAVA_HOME)이 올바르게 설정되어 있는지 확인

4. Gradle Sync 다시시도