230830_ 문제 해결 과정

hoy_·2023년 8월 30일
0

Today, I Learned

목록 보기
35/36

08/30 문제 해결 과정


디폴트 값이 null인 현상

	// @Column(columnDefinition = "integer default 0")
    // @ColumnDefault("0")
	private Long contestViews;

: @ColumnDefault("0") 혹은 @Column(columnDefinition = "integer default 0") 설정이 적용되지 않아 반환이 null로 되는 현상이 있었다.

DB에는 "0" 이 제대로 들어간 것처럼 보이지만 실제로 값을 출력해보면 null이 나오는 것.

실제로 위 애너테이션이 디폴트 값을 지정해주는 기능을 하는 것은 맞으나 ddl이 update로 설정되어 있어 발생한 문제로 파악된다.

도중에 ddl을 바꾸게 되면 다른 테이블에 영향을 줄 수 있어서 처음부터 그렇게 설계하지 않았다면 직접 명시하는게 낫다.
ex) contestViews = 0



필드가 null인 현상

: 아주 황당하게도 단순히 스펠링의 대소문자 차이로 생긴 문제였음.


@DateTimeFormat 미적용

	@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
	private LocalDate endDate;

	@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
	private LocalDate startDate;

: LocalDate -> LocalDateTime 으로 변경하여 해결.

LocalDate : 날짜 정보만 출력
LocalTime : 시간 정보만 출력
LocalDateTime : 날짜와 시간 정보 출력



GlobalExceptionHandler 이 지정한 메시지를 들고오지 못함

log와 에러 내용으로 볼 때 NullPointerExceptionHandler 가 해당 에러를 catch한 것은 맞았다. 다만 지정한 예외 문구가 나오지 않는 문제가 있었다.

원인은 테스트를 위해 토큰을 넘겨주지 않은 탓이었다.

public void checkAdmin(UserDetailsImpl userDetails) {
		adminRepository.findByAdminName(userDetails.getUser().getAdminName())
        // 2) 이곳에서 먼저 에러가 발생한 것
				.orElseThrow(
                // 1) 여기서 직접 에러를 던지기 전에
						() -> new NullPointerException("권한이 없습니다.")
				);
	}

NullPointerException 은 말그대로 null 값에 포인트를 두면 발생한다.

메서드가 동작할 때 UserDetails 가 비어있기 때문에 발생한 에러를 NullPointerExceptionHandler 가 catch했고, 직접 에러를 던지기 전에 처리했으니 당연히 내가 지정한 메시지가 나오지 않는 것이다.

더불어 String으로 직접 문구를 던지는 방식은 실무에서 잘 사용하지 않는다고 한다. Enum class 로 미리 에러 코드와 메시지를 지정하고 조건문으로 걸러주는 방식이 보편적인 듯.

profile
배우는 사람

0개의 댓글