트러블 슈팅_스프링 과제(일정 관리 앱 develop ver.)

star_pooh·2024년 12월 19일
0

에러 대응기

목록 보기
5/9

이번 스프링 과제(일정 관리 앱 develop version)를 진행하는데 있어서 발생했던 에러와 해결방법, 학습하게 된 내용에 대해 정리하려고 한다.

에러(1)

Mapping Miss

코드를 짜고 스프링을 실행시켰는데 아래와 같은 에러가 발생했다.

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2024-12-19T00:08:38.141+09:00 ERROR 26196 --- [develop_todo] [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Invalid mapping pattern detected:
/{/id}
  ^
Expected close capture character after variable name }

Action:

Fix this pattern in your application or switch to the legacy parser implementation with 'spring.mvc.pathmatch.matching-strategy=ant_path_matcher'.

Disconnected from the target VM, address: '127.0.0.1:62780', transport: 'socket'

Process finished with exit code 1

처음에는 Expected close capture character after variable name } 내용만 보고 괄호 문제인줄 알고 코드 정렬을 했다. 에러가 발생한 파일명도 없어서 모든 파일에 대해서 했다. 하지만 그래도 해결되지 않았다.
에러를 다시 자세히 살펴보니 유효하지 않은 매핑 패턴이 있다는 것이다. 친절히 알려준 {/id}로 검색해보니 HttpMethod 매핑 부분에 오타가 있었다. 오타를 고치고 나니 문제 없이 실행되었다.

@GetMapping("{/id}")
public ResponseEntity<Map<String, TodoResponseDto>> findById(@PathVariable Long id) {
    ...
}

👇 오타 수정 후

@GetMapping("/{id}")
public ResponseEntity<Map<String, TodoResponseDto>> findById(@PathVariable Long id) {
    ...
}

에러(2)

Annotation Miss

Validation을 추가하고 제대로 동작하는지 Postman으로 확인하는데 아래와 같은 에러가 발생했다.

2024-12-19T00:21:33.577+09:00 ERROR 1460 --- [develop_todo] [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw 
exception [Request processing failed: jakarta.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'jakarta.validation.constraints.NotBlank' validating type 'java.lang
.Long'. Check configuration for 'userId'] with root cause

jakarta.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'jakarta.validation.constraints.NotBlank' validating type 'java.lang.Long'. Check 
configuration for 'userId'
	at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:105) ~[spring-context-6.2.0.jar:6.2.0]
	at org.springframework.boot.autoconfigure.validation.ValidatorAdapter.validate(ValidatorAdapter.java:67) ~[spring-boot-autoconfigure-3.4.0.jar:3.4.0]
	at org.springframework.validation.DataBinder.validate(DataBinder.java:1358) ~[spring-context-6.2.0.jar:6.2.0]
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) ~[tomcat-embed-core-10.1.33.jar:6.0]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.0.jar:6.2.0]
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.33.jar:6.0]
	at org.example.develop_todo.lv8.filter.LoginFilter.doFilter(LoginFilter.java:41) ~[main/:na]

userId에 설정한 @NotBlank가 제대로 동작하지 않는다는 것이었다. userId는 Long 타입이었는데, @NotBlank는 문자열(CharSequence)만 허용하기 때문이었다. userId에 null값이 들어오는지 확인하기 위해서는 @NotNull을 사용해야했다. @NotNull은 모든 타입을 허용한다.

학습하게 된 내용

JPA 페이징

JPA를 사용하여 페이징을 간단히 설정할 수 있는데, 사용법을 정리해놓으려고 한다.

// Controller
// 페이징에 필요한 페이지 번호와 페이지 크기를 QueryParam으로 요청 받음
@GetMapping("/cars")
public ResponseEntity<List<CarPagingDto>> findAllCar(
        @RequestParam(defaultValue = "0") int pageNum, // 페이지 번호
        @RequestParam(defaultValue = "10") int pageSize // 페이지 크기
) {
	Page<CarDto> carPagingDtoList = carService.findAllCar(pageNum, pageSize);
    return new ResponseEntity<>(carPagingDtoList, HttpStatus.OK);
}
// Serivce
public List<CarPagingDto> findAllCar(int pageNum, int pageSize) {
    Pageable pageable = PageRequest.of(pageNum, pageSize); // pageable 객체 생성
    Page<Car> foundAllCarList = carRepository.findAllByOrderByCreatedAtDesc(pageable); 

    return foundAllCarList.stream().map(CarPagingDto::toDto).toList(); // Dto로 매핑해서 반환
}
// Repository
@Repository
public interface CarRepository extends JpaRepository<Car, Long> {
	// 페이징을 적용할 쿼리 메소드 추가
    // 생성일을 내림차순으로 갖는 전체 목록 조회
    Page<Car> findAllByOrderByCreatedAtDesc(Pageable pageable); 
}

✅ 이번에는 큼직큼직한 에러보다는 잔실수로 인한 에러가 많았던 것 같다. 오타가 나지 않도록 조금 더 신경써야할 것 같고, 어노테이션을 사용할 때는 사용법에 대해서 좀 더 확실하게 숙지한 후에 사용해야겠다는 생각을 하게 되었다.

✅ 출처 및 참고
https://docs.jboss.org/hibernate/validator/8.0/reference/en-US/html_single/#section-builtin-constraints
https://chaeyami.tistory.com/245

0개의 댓글

관련 채용 정보