트러블 슈팅 문서

1.Hibernate: Incorrect column specifier for column 'email'

문제: Hibernate에서 create table 실행 중 Incorrect column specifier for column 'email' Error 가 발생

원인: MHSQL에서 VARCHAR와 AUTO_INCREMENT를 함께 사용할 수 없기 때문.

 

해결 방법

엔티티 클레스에서 email 필드를 @GeneratedValue 어노테이션으로 설정하지 않고,

AUTO_INCREMENT 대시 수동으로 값을 할당하도록 변경.

@Column(nullable = false)
private String email;

 


2. GET 요청에서 필터링 조건이 제대로 동작하지 않음

문제

/api/books?updatedAt=2024-12-09T12:52:51로 GET 요청을 보냈으나, 특정 시간의 데이터만 조회되지 않고 다른 데이터도 반환됨.

원인: MySQL의 DATETIME 형식은 밀리초를 포함하지 않으며, 정확한 매칭이 이루어지지 않음.

해결 방법

JPQL에서 MySQL의 DATE_FORMAT 함수를 사용하여 시간 비교 형식을 통일.

@Query("SELECT s FROM Schedule s " +
       "WHERE (:updateDateTime IS NULL OR FUNCTION('DATE_FORMAT', s.updateDateTime, '%Y-%m-%d %H:%i:%s') = FUNCTION('DATE_FORMAT', :updateDateTime, '%Y-%m-%d %H:%i:%s')) " +
       "AND (:userName IS NULL OR s.userName = :userName) " +
       "ORDER BY s.updateDateTime DESC")

 


3. Postman에서 GET 요청의 날짜 파라미터 처리

문제

/api/books?updatedAt=12131311323123와 같이 잘못된 날짜 포맷이 전달되어도 에러 없이 전체 데이터가 반환됨.

원인: 잘못된 날짜 포맷을 파싱하려고 시도할 때 발생하는 DateTimeParseException을 처리하지 않음.

해결 방법

컨트롤러에서 요청 파라미터를 파싱할 때 유효성을 검증하여 잘못된 포맷에 대해 적절한 에러 메시지 반환.

@GetMapping
public List<ScheduleRequestDTO> getSchedules(
        @RequestParam(required = false) String updateDateTime,
        @RequestParam(required = false) String userName
) {
    LocalDateTime dateTime = null;
    if (updateDateTime != null && !updateDateTime.isEmpty()) {
        try {
            dateTime = LocalDateTime.parse(updateDateTime);
        } catch (DateTimeParseException e) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid date format");
        }
    }
    return scheduleService.getSchedules(dateTime, userName);
}

 


4. POST 요청에서 updateDateTime이 저장되지 않음

문제

POST /api/books 요청 시 updateDateTime 필드가 null로 저장됨.

원인: 엔티티 클래스에서 필드 초기화 코드가 없었음.

해결 방법

엔티티 클래스에서 startDateTime과 updateDateTime 필드를 생성 시점의 현재 시간으로 초기화.

@Entity
public class Schedule {
    @Column(nullable = false)
    private LocalDateTime startDateTime = LocalDateTime.now().withNano(0);

    @Column(nullable = false)
    private LocalDateTime updateDateTime = LocalDateTime.now().withNano(0);
}