스파르타 코딩

[JDBC를 활용한 CRUD] 일정 관리 앱 만들기 과제 트러블슈팅

스타르타 2024. 10. 4. 13:21
반응형

문제 1: author_id 외래키 추가 시 오류 발생

발생 상황: author_id를 외래키로 추가하려고 했을 때, 이미 author_id가 schedule 테이블에 존재하여 오류가 발생.

해결 방법: 외래키 제약 조건이 추가되지 않은 상황이었기 때문에 다음과 같은 순서로 해결.

  1. 기존의 author_id를 제거하려 시도했으나, 외래키 제약이 설정되지 않았음에도 불구하고 제거할 수 없었음.
  2. ALTER TABLE을 사용해 먼저 외래키 제약을 제거한 후, author_id 컬럼을 삭제하고 다시 추가하면서 외래키 제약을 설정함.

해결 코드:

-- 외래키 제약 조건 제거
ALTER TABLE schedule
DROP FOREIGN KEY fk_author;

-- author_id 컬럼 삭제
ALTER TABLE schedule
DROP COLUMN author_id;

-- author_id 컬럼 다시 추가 및 외래키 설정
ALTER TABLE schedule
ADD COLUMN author_id BIGINT,
ADD CONSTRAINT fk_author FOREIGN KEY (author_id) REFERENCES author(id) ON DELETE CASCADE;

 

문제 2: 삭제 시 비밀번호 검증 관련 NullPointerException

발생 상황: 일정을 삭제할 때, 비밀번호가 null이거나 설정되지 않은 일정에서 NullPointerException 오류가 발생.

해결 방법: 비밀번호가 null인 경우에는 검증 로직을 추가하여 예외 처리.

  1. 비밀번호가 null이거나 일치하지 않을 때 적절한 오류 메시지를 반환하도록 수정.
  2. 비밀번호가 없을 경우를 처리할 수 있도록 null 체크를 추가.

해결 코드:

if (schedule.getPassword() == null || !schedule.getPassword().equals(password)) {
    throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다.");
}

 

문제 3: 페이지네이션 처리 중 빈 페이지 요청

발생 상황: 페이지네이션을 적용한 후, 데이터가 없는 페이지를 요청했을 때 빈 배열을 반환하지 않고 오류가 발생함.

해결 방법: 빈 페이지에 대해 적절한 응답을 반환할 수 있도록 예외 처리를 추가.

  1. 페이지 범위를 넘어가는 요청에 대해 빈 배열을 반환하도록 코드 수정.
  2. 페이지 번호가 데이터 범위를 벗어날 경우 HttpStatus.NOT_FOUND 대신 빈 배열을 반환하도록 변경.

해결 코드:

public List<Schedule> getSchedules(int page, int size) {
    Pageable pageable = PageRequest.of(page, size);
    List<Schedule> schedules = scheduleRepository.findAll(pageable).getContent();

    // 페이지 범위를 넘어서는 요청 처리
    if (schedules.isEmpty() && page > 0) {
        return Collections.emptyList();  // 빈 배열 반환
    }

    return schedules;
}

 

문제 4: Postman을 통한 API 테스트 중 테이블에 데이터가 조회되지 않음

발생 상황: Postman에서 테스트한 데이터가 IntelliJ의 Database 탭에서 확인되지 않음. 데이터베이스가 제대로 연결되지 않았거나 테이블이 선택되지 않은 문제로 추정.

해결 방법:

  1. application.properties 파일에서 데이터베이스 설정을 확인하여 MySQL이 제대로 연결되어 있는지 확인.
  2. IntelliJ Database에서 Refresh 버튼을 클릭하여 데이터베이스 상태를 갱신.

해결 코드:

spring.datasource.url=jdbc:mysql://localhost:3306/schedule_db
spring.datasource.username=root
spring.datasource.password=123456789
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
반응형