spring

scheduleJPA 트러블슈팅

seungmin576 2025. 2. 7. 19:38

2025-02-07

 

 

내용

 

Lv1과 Lv2의 Create api를 둘다 작성하다가 오류가 났다.

동시에 작성하게 된 이유는 lv2의 연관관계를 바로 구현하기 위해서이다.

처음부터 연관 관계를 구현하게 되면 유저를 먼저 생성해야 일정이 생성 가능해 보인다.

유저생성 api를 작성후 postman으로 쏴봤다.

 

 

 

 

 

 

오류 발생

2025-02-07T18:08:14.735+09:00 ERROR 29812 --- [schedule_jpa] [nio-8080-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'create_date' cannot be null

java.sql.SQLIntegrityConstraintViolationException: Column 'create_date' cannot be null

 

 

데이터베이스에 생성날짜가 null이면 안된다고 하는 것이다.

그 이유는 아래와 같다.

nullable = false 때문에

 

 

 

 

 

원인 찾기

문제는 createDate에 날짜가 자동으로 기입이 안된다는 것이다.

왜 날짜가 자동 기입이 안되는지 모르겠으니 일단 작성한 코드에서 createDate가 기입안되는것 말고 다른 문제는 없는지 확인하기 위해 nullable을 주석처리해본다.

그리고 api가 정상 작동 되는지 실험해본다.

 

 

createDate가 기입 안되는 문제를 제외하면 코드 자체는 정상작동하는 모습이다.

 

그럼 코드에서 오류는 없다는 거라 한번 다 훑어보며 찾아보던중

 

 

 

 

원인 발견

@EnableJpaAuditing 을 메인 실행 클래스에 안붙여서 일어난 대참사이다.

다음에는 절대 안까먹을 것 같다

 

 

 

해결 결과

어노테이션을 안다는건 오류도 안나서 까먹고 안달면 찾기 힘들었다.

다음부터 주의하자


2025-02-11

 

내용

댓글 생성 requestDto에 validation을 적용하고 생성하려했더니 validation을 적용하기전 에는 잘만 실행되던 친구가 갑자기 오류가 난다.

 

 

 

오류 발생

package com.example.schedule_jpa.dto.commentDto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public class CommentRequestDto {
    @NotBlank
    @Size(min = 1, max = 100)
    private final String contents;
    @NotBlank
    private final Long userId;
    @NotBlank
    private final Long scheduleId;
}
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

 

UnexpectedTypeException 이니 validation 타입이 맞지 않을 때 나는 에러인 것 같다.

 

 

 

원인 찾기

userId 쪽에서 validation 타입이 안맞는다고 오류가 나는 것 같다.

 

 

원인 발견

곰곰히 생각해보니 Long 타입은 정수만 들어올 수 있기 때문에 @NotBlak에서 검사해주는 공백인 "" 이나 " " 가 들어올 수 없고(String 타입이기에 애초에 Long에 못들어옴) @NotNull만 해주면 될 것 같다.

 

 

해결 결과

짱 잘된다. 무지성 @NotBlank 연사했는데 타입에 따라 고민하지 않아서 생겼던 오류이다.

 


2025-02-12

 

내용

postman에서 api를 보내줄때 서버 잘못이 아닌데도 500 error가 나는 것이 거슬려 커스텀익셉션을 만들어 원하는 오류 코드를 나오게하는데 성공했다. 그런데 응답 메세지는 ???? 이런식으로 물음표로 나온다.

 

 

 

오류발생

 

 

 

 

원인 찾기

언제 위와 같은 상황이 일어나는지 설명하자면 Filter 클래스를 생성했다.

package com.example.schedule_jpa.filter;

import com.example.schedule_jpa.Common.Const;
import com.example.schedule_jpa.exception.CustomException;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.util.PatternMatchUtils;

import java.io.IOException;

public class LoginFilter implements Filter {

    private static final String[] WHITE_LIST = {"/users/save", "/users/login"};

    @Override
    public void doFilter(
            ServletRequest request,
            ServletResponse response,
            FilterChain chain
    ) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestURI = httpRequest.getRequestURI();
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        try {
            if (!isWhiteList(requestURI)) {
                HttpSession session = httpRequest.getSession(false);

                if (session == null || session.getAttribute(Const.LOGIN_USER) == null) {
                    throw new CustomException("로그인 하셈");
                }
            }
            chain.doFilter(request, response);
        } catch (CustomException e) { 
            httpResponse.getWriter().write("로그인이 필요하다. " + e.getMessage());
        } catch (Exception e){
            httpResponse.getWriter().write("서버 오류가 발생");
        }
    }

    private boolean isWhiteList(String requestURI) {
        return PatternMatchUtils.simpleMatch(WHITE_LIST, requestURI);
    }
}

오류 발생 시 catch 부분에서 받아서 응답이 "로그인이 필요하다. " + "로그인 하셈" 이 나와야 한다.

 

 

 

원인 발견

postman에서 물음표의 갯수가 정확히 "로그인이 필요하다. " + "로그인 하셈" 과 같은 걸로 봐선 이 문자열이 한글이라서 물음표로 나오는게 유력해보인다.

그럼 문자열이 한글일때 어떻게 해야 잘 나오는지 찾아본다.

서버에서 응답할 때 적절한 인코딩을 사용해야 응답이 제대로 나온다고 한다.

캐치 부분에서 HttpResponse의 인코딩을 설정해 주자.

httpResponse.setContentType("text/plain; charset=UTF-8");
httpResponse.setCharacterEncoding("UTF-8");

위 두 코드를 추가해준다.

 

 

해결 결과

잘 나온다. 한글을 사용할때 물음표로 나온다면 항상 인코딩을 의심해보자

'spring' 카테고리의 다른 글

HttpServletResponse 메서드  (0) 2025.02.12
Bcrypt  (0) 2025.02.10
@ModelAttribute 와 @RequestBody  (1) 2025.02.05
Validation, BindingResult, BeanVaildation, Validator  (1) 2025.02.05
Bean 등록 수동 VS 자동  (0) 2025.02.04