1. 프로젝트 설명
ScheduleApp
은 사용자들이 일정을 관리할 수 있도록 하는 간단한 스케줄 관리 애플리케이션입니다. 사용자는 일정을 생성하고, 조회하고, 수정하고, 삭제할 수 있습니다. 이 프로젝트는 Spring Boot와 MySQL을 활용하여 백엔드를 구성했으며, 간단한 API를 통해 CRUD 기능을 제공합니다.
2. 사용된 주요 개념
- Spring Boot : 애플리케이션의 기본 구조 및 API 엔드포인트 제공
- JDBC (Java Database Connectivity) : MySQL과의 연결 및 쿼리 수행을 위해 사용
- DTO (Data Transfer Object) : 클라이언트와 서버 간에 데이터를 주고받기 위한 객체
- DAO (Data Access Object) : 데이터베이스와의 상호작용을 담당하는 계층
- Lombok : Getter, NoArgsConstructor 등의 보일러플레이트 코드를 줄이기 위한 어노테이션 사용
- MySQL : 스케줄 데이터를 저장하는 데이터베이스
3. 코드 설명
3-1. ScheduleController.java
컨트롤러는 API 요청을 처리하며, ScheduleService
를 호출하여 비즈니스 로직을 실행합니다.
- POST /api/schedules : 일정 생성
- GET /api/schedules : 모든 일정 조회
- GET /api/schedules/{id} : ID를 통한 일정 조회
- PUT /api/schedules/{id} : 일정 수정
- DELETE /api/schedules/{id} : 일정 삭제
3-2. ScheduleDAO.java
데이터베이스와 직접 상호작용하는 역할을 합니다.
- createSchedule() : 새로운 일정을 데이터베이스에 삽입
- getAllSchedules() : 모든 일정을 데이터베이스에서 조회
- getScheduleById() : 특정 ID에 해당하는 일정을 조회
- updateSchedule() : 일정 내용을 수정
- deleteSchedule() : 일정 삭제
3-3. ScheduleService.java
비즈니스 로직을 담고 있으며, 데이터베이스와의 상호작용은 DAO 객체를 통해 처리합니다.
- createSchedule() : DTO를 DAO에서 처리할 수 있는 객체로 변환 후 저장
- getAllSchedules() : 데이터베이스에서 모든 일정을 가져와 DTO 리스트로 변환 후 반환
- getScheduleById() : 특정 ID의 일정을 조회한 후 DTO로 반환
- updateSchedule() : 특정 ID의 일정을 수정
- deleteSchedule() : 일정 삭제 처리
3-4. DBUtil.java
데이터베이스 연결을 위한 유틸리티 클래스
- getConnection() : MySQL 데이터베이스와 연결하여
Connection
객체를 반환
3-5. ScheduleRequestDTO.java
ScheduleRequestDTO
는 클라이언트로부터 일정 생성 및 수정 요청을 받을 때 사용되는 데이터 전송 객체입니다.
- todo : 할 일 내용
- author : 작성자명
- password : 일정 삭제 및 수정을 위한 비밀번호
3-6. ScheduleResponseDTO.java
ScheduleResponseDTO
는 클라이언트에게 응답할 때 사용되는 데이터 전송 객체입니다.
- id : 일정의 고유 ID
- todo : 할 일 내용
- author : 작성자명
- createdAt : 일정이 생성된 시간
- updatedAt : 일정이 마지막으로 수정된 시간
3-7. Schedule.java
Schedule
클래스는 데이터베이스에 저장되는 실제 일정 객체를 표현하며, 각 필드는 일정의 속성을 나타냅니다.
- id : 일정의 고유 식별자
- todo : 해야 할 일
- author : 작성자명
- password : 수정 및 삭제를 위한 비밀번호
- createdAt : 일정이 처음 생성된 시간
- updatedAt : 일정이 마지막으로 수정된 시간
4. 회고
이번 프로젝트는 Spring Boot와 JDBC를 통해 간단한 스케줄 관리 애플리케이션을 구현하며, CRUD API 구축을 연습할 수 있었습니다. 특히, DTO와 DAO 패턴을 사용함으로써 계층별 역할 분리를 체계적으로 할 수 있었고, 이를 통해 유지보수성과 확장성을 높였습니다.
그러나 MySQL과의 연동 부분에서 null 값 처리와 같은 예상치 못한 문제들이 발생했으며, 이를 해결하는 과정에서 JDBC 예외 처리의 중요성을 다시금 느꼈습니다. 앞으로도 데이터베이스 연동 시 발생할 수 있는 다양한 문제를 사전에 파악하고 방어적인 코드를 작성할 필요성을 배웠습니다.
5. 트러블슈팅
▶ 문제 상황
- 문제 요약 : 일정 생성 API 호출 시, 요청이 성공적으로 처리되었으나, 데이터베이스에 일정이 저장되지 않는 문제가 발생.
- 발생 경로
- POST 요청을 통해
/api/schedules
로 데이터를 보냈으나, 데이터베이스에 기록이 남지 않음. - 로그에서 에러 메시지가 없었으며, SQL 쿼리 실행 중 예외는 발생하지 않았음.
- POST 요청을 통해
▶ 문제 원인
- DAO에서
preparedStatement.setTimestamp()
로LocalDateTime
을Timestamp
로 변환하는 과정에서null
값을 처리하지 않은 것이 문제였습니다.created_at
과updated_at
필드가 null일 때 예외는 발생하지 않지만, 데이터가 삽입되지 않는 현상이 발생했습니다.
▶ 해결 방법
null
값 처리를 추가하여created_at
,updated_at
필드에 값이 없을 경우null
을 삽입하도록 수정했습니다.
pstmt.setTimestamp(4, schedule.getCreatedAt() != null ? Timestamp.valueOf(schedule.getCreatedAt()) : null);
pstmt.setTimestamp(5, schedule.getUpdatedAt() != null ? Timestamp.valueOf(schedule.getUpdatedAt()) : null);
해결 결과
- 데이터베이스에 일정이 정상적으로 저장되었으며,
created_at
및updated_at
값도 올바르게 기록되었습니다.
6. 개선사항
- 트랜잭션 처리 : 데이터베이스 작업 시 트랜잭션 처리를 추가하여, 작업 중 오류가 발생할 경우 롤백이 이루어지도록 개선할 수 있습니다.
- 유효성 검사 : 스케줄 생성 시 입력 값에 대한 유효성 검사를 추가하여 비밀번호, 작성자명 등이 비어 있는 경우 오류를 사전에 방지할 수 있습니다.
- 예외 처리 개선 : 현재는 SQLException만을 처리하고 있는데, 보다 구체적인 예외 상황에 맞는 처리 로직을 추가할 필요가 있습니다.
- 테스트 코드 추가 : 각각의 기능에 대한 단위 테스트와 통합 테스트를 작성하여 안정성을 높이는 것이 필요합니다.
'Project' 카테고리의 다른 글
개인 프로젝트 : 일정 관리 앱 JPA ver (0) | 2024.10.16 |
---|---|
개인 프로젝트 : 숫자 야구 게임 만들기 Lv 4 (0) | 2024.09.23 |
개인 프로젝트 : 계산기 만들기 Lv2 (0) | 2024.09.19 |
팀 프로젝트 : 우리 팀, 우리만의 이야기를 담을 수 있는 "팀 소개 웹페이지" 만들기 (0) | 2024.09.19 |