1. 프로젝트 개요
이번 프로젝트는 Spring Boot를 사용하여 일정 관리 애플리케이션을 개발하는 것입니다. 이 애플리케이션은 사용자가 개인 일정을 관리할 수 있도록 다양한 기능을 제공합니다.
2. 주요 기능
- 회원가입 및 로그인: 사용자는 회원가입을 통해 계정을 만들고, 로그인하여 개인 일정을 관리할 수 있습니다.
- 일정 관리: 사용자는 자신의 일정을 추가, 조회, 수정, 삭제할 수 있습니다.
- 댓글 기능: 각 일정에 대해 댓글을 추가하고 관리할 수 있습니다.
3. 기술 스택
- 백엔드: Spring Boot, JPA
- 데이터베이스: MySQL
4. 코드 구성
4.1. Controller
ScheduleController
: 일정 관련 API를 제공하는 컨트롤러입니다. 사용자의 요청을 처리하고, 비즈니스 로직을 호출하여 결과를 반환합니다.createSchedule
: 새로운 일정을 생성합니다. 요청 본문에서 일정 제목과 내용을 받고, 사용자 ID에 기반하여 일정을 추가합니다.getAllSchedules
: 모든 사용자의 일정을 조회합니다.ScheduleService
를 통해 데이터베이스에서 일정을 가져옵니다.updateSchedule
: 특정 ID를 가진 일정을 수정합니다. 요청 본문에서 업데이트할 내용과 ID를 받아 해당 일정을 찾아 수정합니다.deleteSchedule
: 특정 ID를 가진 일정을 삭제합니다.
CommentController
: 댓글 관련 API를 제공하는 컨트롤러입니다.createComment
: 일정에 댓글을 추가합니다. 댓글 내용을 요청 본문에서 받고, 해당 일정을 찾아 댓글을 연결합니다.getCommentsByScheduleId
: 특정 일정에 달린 댓글을 조회합니다.deleteComment
: 댓글을 삭제합니다.
4.2. Service
ScheduleService
: 일정 관련 비즈니스 로직을 처리하는 서비스입니다.createSchedule
: 요청받은 일정 정보를 바탕으로 새로운 일정을 생성하고, 해당 사용자를 찾아 일정을 연결합니다.getAllSchedules
: 데이터베이스에서 모든 일정을 가져와ScheduleDTO
형태로 변환하여 반환합니다.updateSchedule
: 특정 ID를 가진 일정을 업데이트합니다. 기존 일정을 조회하고, 새로운 데이터로 업데이트하여 데이터베이스에 반영합니다.deleteSchedule
: 특정 ID를 가진 일정을 삭제합니다.
CommentService
: 댓글 관련 비즈니스 로직을 처리합니다.createComment
: 댓글 내용을 기반으로 새로운 댓글을 생성하고, 해당 일정과 연결합니다.getCommentsByScheduleId
: 주어진 일정 ID에 대한 댓글 리스트를 가져옵니다.updateComment
: 댓글 내용을 업데이트합니다.
4.3. Repository
ScheduleRepository
: 일정 데이터에 접근하는 리포지토리입니다.findAllByUserId
: 특정 사용자 ID를 기반으로 사용자의 모든 일정을 조회합니다.findById
: 특정 ID로 일정을 조회합니다. 이 메소드는 업데이트 기능에서 사용됩니다.
CommentRepository
: 댓글 데이터에 접근하는 리포지토리입니다.findAllByScheduleId
: 특정 일정 ID에 대한 모든 댓글을 조회합니다.
UserRepository
: 사용자 데이터에 접근하는 리포지토리입니다.findByUsername
: 주어진 사용자명을 기반으로 사용자를 조회합니다.existsByUsername
: 특정 사용자명이 데이터베이스에 존재하는지 확인합니다.
4.4. Entity
Schedule
: 일정 데이터를 나타내는 엔티티로, 일정 제목, 내용, 작성자(User)와의 관계를 정의합니다.Comment
: 댓글 데이터를 나타내는 엔티티로, 댓글 내용과 관련된 일정(Schedule)과의 관계를 정의합니다.User
: 사용자 데이터를 나타내는 엔티티로, 사용자명, 이메일 및 비밀번호 정보를 포함합니다.
5. 트러블슈팅
5.1. 양방향 매핑
- 문제 : 댓글과 일정 간의 양방향 관계 설정 중, 댓글이 일정에 올바르게 연결되지 않음.
- 해결 :
Schedule
클래스에서@OneToMany
를 설정하고,Comment
클래스에서@ManyToOne
을 설정하여 양방향 관계를 명확히 정의하였습니다. 이렇게 하면 일정을 조회할 때 해당 일정의 모든 댓글도 함께 가져올 수 있습니다.
5.2. User와 Schedule 간의 순환 참조 문제
- 문제 설명
- User와 Schedule 간의 순환 참조 문제가 발생할 수 있습니다. 이 두 엔터티는 서로를 참조하므로 JSON 직렬화 과정에서 무한 루프가 발생할 수 있습니다. 예를 들어, User 객체를 직렬화하면 그 안에 포함된 Schedule 리스트가 포함되고, 각 Schedule은 다시 User를 참조하여 무한 루프에 빠질 수 있습니다.
- 해결 방법
- DTO 사용: 양방향 참조 문제를 해결하기 위해 DTO를 활용하여 데이터의 전송을 관리할 수 있습니다. UserDTO와 ScheduleDTO를 만들어 필요한 데이터만 전달하고, 순환 참조를 피할 수 있습니다.
5.3. Optional 사용
- 문제 :
Optional
을 사용하는 과정에서 NullPointerException 발생. - 해결 : 데이터 조회 시
Optional
을 사용하여 데이터가 존재하지 않을 경우 예외를 던지도록 수정하였습니다. 예를 들어, 사용자를 조회할 때findById
메소드로 Optional을 사용하여 결과를 처리하였습니다.
5.4. 어노테이션 이해하기
@Transactional
: 이 어노테이션은 메소드가 하나의 트랜잭션 내에서 실행되도록 보장합니다. 데이터베이스 연산이 실패할 경우 자동으로 롤백되어 데이터의 일관성을 유지합니다.@ControllerAdvice
: 예외 처리 전역 설정을 위한 어노테이션으로, 모든 컨트롤러에서 발생한 예외를 처리할 수 있도록 도와줍니다. 이 어노테이션을 활용해 공통적인 예외 처리 로직을 구현할 수 있습니다.
6. 회고
이번 프로젝트를 통해 Spring Boot의 전반적인 구조와 JPA를 활용한 데이터베이스 연동을 깊이 이해할 수 있었습니다. 특히, RESTful API 설계의 중요성과 예외 처리 방식을 배웠습니다. 이러한 경험을 통해 더 복잡한 비즈니스 로직을 처리할 수 있는 능력을 기르고 싶습니다. 앞으로는 사용자 경험을 개선하기 위해 프론트엔드와의 연동도 강화해 나갈 계획입니다.
'Project' 카테고리의 다른 글
개인 프로젝트 : 일정 관리 앱 Lv 3 (0) | 2024.10.04 |
---|---|
개인 프로젝트 : 숫자 야구 게임 만들기 Lv 4 (0) | 2024.09.23 |
개인 프로젝트 : 계산기 만들기 Lv2 (0) | 2024.09.19 |
팀 프로젝트 : 우리 팀, 우리만의 이야기를 담을 수 있는 "팀 소개 웹페이지" 만들기 (0) | 2024.09.19 |