개인 프로젝트 : 일정 관리 앱 JPA ver

2024. 10. 16. 23:35·Project

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  (1) 2024.10.04
개인 프로젝트 : 숫자 야구 게임 만들기 Lv 4  (0) 2024.09.23
개인 프로젝트 : 계산기 만들기 Lv2  (0) 2024.09.19
팀 프로젝트 : 우리 팀, 우리만의 이야기를 담을 수 있는 "팀 소개 웹페이지" 만들기  (0) 2024.09.19
'Project' 카테고리의 다른 글
  • 개인 프로젝트 : 일정 관리 앱 Lv 3
  • 개인 프로젝트 : 숫자 야구 게임 만들기 Lv 4
  • 개인 프로젝트 : 계산기 만들기 Lv2
  • 팀 프로젝트 : 우리 팀, 우리만의 이야기를 담을 수 있는 "팀 소개 웹페이지" 만들기
lastdove
lastdove
lastdove 님의 블로그 입니다.
  • lastdove
    lastdove 님의 블로그
    lastdove
  • 전체
    오늘
    어제
    • 분류 전체보기 (80)
      • Spring (16)
      • JAVA (17)
      • JAVA 알고리즘 (20)
      • Project (5)
      • SQL 문제풀이 (17)
      • Git&Linux (2)
      • Web development(입문) (2)
      • Sparta (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
lastdove
개인 프로젝트 : 일정 관리 앱 JPA ver
상단으로

티스토리툴바