트러블 슈팅 문서
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);
}