[Spring Jpa] @RequestParam과 .contain에서 NPE방지

김재진·2026년 1월 15일

내일배움캠프

목록 보기
38/70

@RequestParam 설정

  • @RequestParam을 사용한 코드를 PostMan을 통해 테스트 할 때 params값이 없을 경우 에러가 발생
@GetMapping("/admin/users")
    public ResponseEntity<Page<GetUserResponse>> getUsers(
            @RequestParam String keyword,
            @PageableDefault Pageable pageable,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam UserStatus status
    ) {
        Pageable converted = PageRequest.of(
                page - 1,
                pageable.getPageSize(),
                pageable.getSort()
        );
           return ResponseEntity.ok(userService.findAllUsers(keyword, converted, status));
    }
  • @RequestParam에 디폴트 값인 (required = true)로 적용되어 null일 경우 오류가 발생하여 해당 부분을 수정
@GetMapping("/admin/users")
    public ResponseEntity<Page<GetUserResponse>> getUsers(
            @RequestParam(required = false) String keyword, // required = false 로 수정하여 null이어도 작동하게 함
            @PageableDefault Pageable pageable,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(required = false) UserStatus status
    ) {
        Pageable converted = PageRequest.of(
                page - 1,
                pageable.getPageSize(),
                pageable.getSort()
        );

        return ResponseEntity.ok(userService.findAllUsers(keyword, converted, status));
    }
  • Service 코드
  • null 객체에 .contain() 메서드에 null 을 입력하여 npe 발생하여 수정
---before---
 @Transactional(readOnly = true)
    public Page<GetUserResponse> findAllUsers(String keyword, Pageable pageable, UserStatus status) {

        Page<User> users;

        if (keyword.contains("@")) { // null 객체에 .contain() 메서드에 null 을 입력하여 npe 발생
            users = userRepository.findByEmailKeyword(keyword,pageable,status);
        } else {
            users = userRepository.findByNameKeyword(keyword,pageable,status);
        }

        return users.map(user -> new GetUserResponse(
 ---after---
 
 @Transactional(readOnly = true)
    public Page<GetUserResponse> findAllUsers(String keyword, Pageable pageable, UserStatus status) {

        // 빈 문자열(keyword)을 null로 바꾸기 위함
        String searchKeyword = (keyword == null || keyword.isEmpty()) ? null : keyword;

        Page<User> users;
		// null 일 경우 둘 중 아무거나 호출해도 전체 조회가 되게
        if (searchKeyword != null && searchKeyword.contains("@")) {
            users = userRepository.findByEmailKeyword(searchKeyword,pageable,status);
        } else {
            users = userRepository.findByNameKeyword(searchKeyword,pageable,status);
        }

        return users.map(user -> new GetUserResponse(
  • @RequestParam(required = false)를 통해 해당 param이 null 이어도 오류를 내지 않고 if (searchKeyword != null && searchKeyword.contains("@")) 와 같이 .contain이 작동하기 전 null 인지 확인하여 .contain 에 null 이 들어가 NPE가 발생하는것을 방지하는 방어코드를 작성하여 오류를 해결했다.
profile
개발공부 처음해보는 사람

0개의 댓글