{"id":18459294,"url":"https://github.com/mungdon/planner-project","last_synced_at":"2026-05-05T11:31:13.297Z","repository":{"id":244201363,"uuid":"814413654","full_name":"MungDon/planner-project","owner":"MungDon","description":"우리컴퓨터아카데미학원 두 번째 프로젝트 ","archived":false,"fork":false,"pushed_at":"2024-11-06T07:43:08.000Z","size":4608,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-25T20:47:33.811Z","etag":null,"topics":["java","javascript","mybatis","oauth2","oracle-database","spring-boot","spring-security","thymeleaf"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MungDon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-13T01:08:51.000Z","updated_at":"2024-11-06T07:43:11.000Z","dependencies_parsed_at":"2024-06-16T03:25:09.855Z","dependency_job_id":"8a42a01a-aa9a-43c6-bd3d-a5ad2fb2e3da","html_url":"https://github.com/MungDon/planner-project","commit_stats":null,"previous_names":["mungdon/planner-project"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MungDon/planner-project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MungDon%2Fplanner-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MungDon%2Fplanner-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MungDon%2Fplanner-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MungDon%2Fplanner-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MungDon","download_url":"https://codeload.github.com/MungDon/planner-project/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MungDon%2Fplanner-project/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32648032,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-05T11:29:49.557Z","status":"ssl_error","status_checked_at":"2026-05-05T11:29:48.587Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","javascript","mybatis","oauth2","oracle-database","spring-boot","spring-security","thymeleaf"],"created_at":"2024-11-06T08:22:40.337Z","updated_at":"2026-05-05T11:31:13.273Z","avatar_url":"https://github.com/MungDon.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Planner Project\n\n\u0026nbsp;   \n\u0026nbsp;    \n\n## Project Overview\n\u003e - 기여도 : 100%\n\u003e - 담당 기능 : 회원, 관리자\n\n\u0026nbsp;   \n\u0026nbsp;    \n\n## Project Tech Stack\n\u003e - **Framework** : Spring Boot (3.3.0)\n\u003e - **IDE** : STS 4 (Eclipse)\n\u003e - **View** : Thymeleaf\n\u003e - **DB** : OracleDB\n\u003e - **SQLMapper** : MyBatis\n\u003e - **Language** : Java(JDK 21)\n\u003e - **Build Tool** : Gradle\n\n\u0026nbsp;   \n\u0026nbsp;    \n\n## Project Architecture\n```text\n src\n  ├─config\n  │      AppConfig.java : 애플리케이션 전반에서 필요로 하는 빈(Bean)을 설정하고 관리하기 위한 구성 파일\n  │      EmailConfig.java : 애플리케이션에서 이메일 발송을 위한 STMP 설정 파일\n  │      MvcConfig.java : 실제 이미지 파일이 저장된 폴더를 애플리케이션에서 접근할 수 있도록 설정한 파일\n  │      SecurityConfig.java : Spring Security 설정 파일\n  │      StatusConfig.java : FriendRoleUtils를 애플리케이션 전역에서 사용 가능한 빈(Bean)으로 설정하고 관리하기 위한 구성 파일\n  │      WebConfig.java : 커스텀 어노테이션 사용을 위한 설정 파일\n  │\n  ├─controller\n  │      FriendController.java : 친구 관련 요청 처리 컨트롤러\n  │      MapLikeController.java : 장소 즐겨찾기 관련 요청 처리 컨트롤러\n  │      MemberController.java : 회원 관련 요청 처리 컨트롤러\n  │      NoticeCotroller.java : 공지사항 관련 요청 처리 컨트롤러\n  │      OAuth2Controller.java : 소셜로그인 관련 요청 처리 컨트롤러\n  │      PlannerController.java : 플래너 메인페이지 관련 요청 처리 컨트롤러\n  │      ReplyController.java : 댓글 관련 요청 처리 컨트롤러\n  │      ScheduleController.java : 일정 관련 요청 처리 컨트롤러\n  │      TeamBoardController.java : 그룹 게시판 관련 요청 처리 컨트롤러\n  │      TeamController.java : 그룹 관련 요청 처리 컨트롤러\n  │      TeamMemberController.java : 그룹 회원 관련 요청 처리 컨트롤러\n  │      TeamScheduleController.java : 그룹 일정 관련 요청 처리 컨트롤러 \n  │      VoteController.java : 투표 관련 요청 처리 컨트롤러\n  │\n  ├─dto\n  │  ├─request\n  │  │  ├─admin\n  │  │  │      NoticeDTO.java : 공지사항 DTO\n  │  │  │      ReqNoticeImg.java : 공지사항 이미지 요청 DTO\n  │  │  │\n  │  │  ├─friend\n  │  │  │      FriendDTO.java : 친구 관련 DTO\n  │  │  │      FriendRequestDTO.java 친구신청 DTO\n  │  │  │\n  │  │  ├─member\n  │  │  │      MemberDTO.java : 회원 DTO\n  │  │  │      ReqChangePassword.java : 비밀번호 변경 요청 DTO\n  │  │  │      ReqMemberRestore.java : 회원 복구 요청 DTO\n  │  │  │      ReqMemberUpdate.java : 회원 수정 요청 DTO\n  │  │  │      ReqOAuth2MemberAdd.java : 소셜로그인 회원가입 요청 DTO\n  │  │  │      ReqOAuth2Signup.java : 소셜로그인 추가 회원가입 요청 DTO\n  │  │  │\n  │  │  ├─schedule\n  │  │  │      CalendarDTO.java : 달력 DTO\n  │  │  │      CalendarPrintDTO.java : 달력 안 일정 DTO\n  │  │  │      MapDTO.java : 장소 DTO\n  │  │  │      MapLikeDTO.java : 즐겨찾기 장소 DTO\n  │  │  │      ScheduleDTO.java : 일정 DTO\n  │  │  │      ScheduleSearchDTO.java : 일정 검색 DTO\n  │  │  │      TodayInfo.java : 오늘의 일정 DTO\n  │  │  │\n  │  │  └─team\n  │  │      │  MyTeamListDTO.java : 나의 그룹 목록 DTO\n  │  │      │  TeamDTO.java : 그룹 DTO\n  │  │      │  TeamInfoDTO.java : 그룹 정보 DTO\n  │  │      │  TeamMemberDTO.java : 그룹멤버 DTO\n  │  │      │  TeamMyInfoDTO.java : 그룹 내 정보 DTO\n  │  │      │\n  │  │      ├─board\n  │  │      │      ReplyDTO.java : 댓글 DTO\n  │  │      │      ReplyViewDTO.java : 댓글 상세 DTO\n  │  │      │      TeamBoardDTO.java : 그룹 게시판 DTO\n  │  │      │      TeamBoardListDTO.java : 그룹 게시판 목록 DTO\n  │  │      │      TeamBoardUpdateDTO.java : 그룹 게시판 수정 DTO\n  │  │      │\n  │  │      └─vote\n  │  │              VoteDTO.java : 투표 DTO\n  │  │              VoteInfoDTO.java : 투표 정보 DTO\n  │  │              VoteItemDTO.java : 투표 항목 DTO\n  │  │              VoteMemberDTO.java : 투표 인원 DTO\n  │  │              VoteMemberInsertDTO.java : 투표 한 인원 DTO\n  │  │\n  │  └─response\n  │      └─member\n  │              ResEmailAuthDetail.java : 이메일 인증 코드 응답 DTO\n  │              ResMemberDetail.java : 회원 상세 정보 응답 DTO\n  │\n  ├─enums\n  │      CodeStatus.java : 회원 인증 상태를 나타내는 enum\n  │      ErrorType.java : 동기/비동기 예외를 나타내는 enum\n  │      FriendRole.java : 친구 상태를 나타내는 enum\n  │      Gender.java : 회원의 성별을 나타내는 enum\n  │      Masking.java : 나타내면 안되는 정보를 *로 나타내는 enum\n  │      MemberRole.java : 회원 권한을 나타내는 enum\n  │      MemberStatus.java : 회원 상태를 나타내는 enum\n  │      OAuthType.java : 소셜 로그인의 타입을 나타내는 enum\n  │      TM_Grade.java : 그룹내 등급을 나타내는 enum\n  │\n  ├─exception\n  │      CustomException.java : 커스텀 예외 클래스(동기)\n  │      ErrorCode.java : 내가 원하는 상태코드와 에러메세지를 나타낸 enum\n  │      ErrorResponse.java : 발생한 커스텀 에러와 응답 데이터 포맷을 설정해주는 파일\n  │      GlobalExceptionHandler.java : 전역에서 발생한 커스텀 예외 및 유효성 검사 예외 등 모든 예외를 핸들링하는 클래스(동기)\n  │      RestCustomException.java : 커스텀 예외 클래스(동기)\n  │      RestGlobalExceptionHandler.java : 전역에서 발생한 커스텀 예외 및 유효성 검사 예외 등 모든 예외를 핸들링하는 클래스(비동기)\n  │\n  ├─handler\n  │      CustomAccessDeniedHandler.java : 스프링시큐리티에서 인가 실패 시 발동하는 핸들러\n  │\n  ├─mapper\n  │      EmailMapper.java : 이메일 관련 데이터베이스 접근 담당\n  │      FriendMapper.java : 친구 관련 데이터베이스 접근 담당\n  │      MapLikeMapper.java : 장소 즐겨찾기 관련 데이터베이스 접근 담당\n  │      MapRepository.java : 장소 관련 데이터베이스 접근 담당\n  │      MemberMapper.java 회원 관련 데이터베이스 접근 담당\n  │      NoticeMapper.java : 공지사항 관련 데이터베이스 접근 담당\n  │      ReplyMapper.java : 댓글 관련 데이터베이스 접근 담당\n  │      ScheduleMapper.java : 일정 관련 데이터베이스 접근 담당\n  │      TeamBoardMapper.java : 그룹 게시판 관련 데이터베이스 접근 담당\n  │      TeamMapper.java : 그룹 관련 데이터베이스 접근 담당\n  │      TeamMemberMapper.java : 그룹 회원 관련 데이터베이스 접근 담당\n  │      VoteMapper.java : 투표 관련 데이터베이스 접근 담당\n  │\n  ├─oauth\n  │  │  TokenRedirect.java : 로그인의 결과에 따른 URL을 나타내는 enum\n  │  │\n  │  ├─exception\n  │  │      OAuth2AuthenticationProcessingException.java : 인증 관련 예외\n  │  │\n  │  ├─handler\n  │  │      OAuth2AuthenticationFailureHandler.java : 소셜로그인 인증 실패 핸들러\n  │  │      OAuth2AuthenticationSuccessHandler.java : 소셜 로그인 인증 성공 핸들러\n  │  │\n  │  ├─service\n  │  │      CustomOAuth2UserService.java : 시큐리티 소셜로그인 관련 비즈니스 로직\n  │  │      CustomUserDetailService.java : 시큐리티 일반로그인 관련 비즈니스 로직  \n  │  │      OAuth2Service.java : 소셜로그인 관련 비즈니스 로직\n  │  │      OAuth2UserPrincipal.java : OAuth2User와 UserDetails 인터페이스를 구현하여 사용자 정보를 담은 클래스\n  │  │\n  │  └─user\n  │          CustomUserDetail.java : 로그인 후 유저 정보를 시큐리티에 저장하기 위한 커스텀 클래스\n  │          GoogleOAuth2UserInfo.java : 구글 소셜로그인 회원 정보 \n  │          KakaoOAuth2UserInfo.java : 카카오 소셜로그인 회원 정보\n  │          OAuth2Provider.java : 구글인지 카카오인지 들어오는 registerID에 따라 나타내는 enum\n  │          OAuth2UserInfo.java : 구글과 카카오 등 다른 소셜로그인 회원 정보를 일정하게 통합하기 위한 공통 최상위 인터페이스\n  │          OAuth2UserInfoFactory.java : 어떤 소셜로그인이냐의 따라서 유저정보를 반환하는 클래스\n  │\n  ├─service\n  │      EmailService.java : 이메일 관련 비즈니스 로직 처리\n  │      FriendService.java : 친구 관련 비즈니스 로직 처리\n  │      MapLikeService.java : 장소 즐겨찾기 관련 비즈니스 로직 처리\n  │      MapService.java : 장소 관련 비즈니스 로직 처리\n  │      MemberService.java : 회원 관련 비즈니스 로직 처리\n  │      NoticeService.java : 공지 관련 비즈니스 로직 처리\n  │      ReplyService.java : 댓글 관련 비즈니스 로직 처리\n  │      ScheduleService.java : 일정 관련 비즈니스 로직 처리\n  │      TeamBoardService.java : 그룹 게시판 관련 비즈니스 로직 처리\n  │      TeamMemberService.java : 그룹 회원 관련 비즈니스 로직 처리\n  │      TeamService.java : 그룹 관련 비즈니스 로직 처리\n  │      VoteService.java : 투표 관련 비즈니스 로직 처리\n  │\n  └─util\n          CommonUtils.java : 전역에서 사용하는 공통된 메서드를 모아놓은 유틸 클래스\n          FriendRoleUtils.java : 역할, 마스킹, 성별 등의 정보를 변환해주는 유틸리티 클래스\n          Scheduler.java : 스케쥴링 기능을 정의한 유틸 클래스\n          UserData.java : 커스텀 어노테이션 클래스\n          UserDataResolver.java : UserData 어노테이션을 사용했을 때 사용자 인증 정보를 전달하는 역할\n```\n\n\u0026nbsp;   \n\u0026nbsp;    \n\n## 아쉬운 점\n\u003e 이번 팀 프로젝트에서는 Git을 도입해 협업을 시도했으나, 팀원 간 학습 수준의 차이로 인해 충분히 활용하지 못하고 중간에 포기하게 되어 아쉬움이 남습니다.     \n\u003e Git을 통해 체계적인 협업과 코드 관리를 경험하지 못한 점은 이번 프로젝트에서 더욱 아쉽게 느껴졌습니다.     \n\u003e 또한, Spring Security와 소셜 로그인 로직을 충분히 숙지하지 못한 상태에서 구현을 시도하다 보니, 테스트나 커스터마이징 과정에서 많은 시간을 소모했고,    \n\u003e 그로 인해 여러 어려움이 발생했습니다. 사전에 더 깊이 공부했다면 문제 해결이 훨씬 더 수월했을 것이고,    \n\u003e 이를 통해 프로젝트 완성도도 높일 수 있었을 것이라는 아쉬움이 큽니다.    \n\u003e 비즈니스 로직이 복잡해지면서 리팩토링을 진행했지만, 디자인 패턴이나 클린 코드 원칙에 대해 더 깊이 이해하고 있었다면,     \n\u003e 리팩토링 과정에서 더 효율적이고 유지보수성 높은 코드를 작성할 수 있었을 것입니다.      \n\u003e 또한, 이메일 인증 시스템에서는 인증 코드를 RDB에 저장하는 방식을 사용했는데, 유효시간이 지난 데이터를 관리하는 데 불편함을 느꼈습니다.     \n\u003e 추후에는 Redis 같은 인메모리 데이터베이스를 활용해 데이터 유효시간을 설정하고, 보다 효율적으로 관리할 계획입니다.      \n\u003e 특히, 팀 내에서 관리자 파트를 맡았던 팀원이 중도에 포기하면서, 갑작스럽게 제가 그 역할을 맡게 되었습니다.      \n\u003e 시간적 여유가 부족해 관리자 기능을 충분히 구현하지 못해 아쉬움이 컸습니다.     \n\u003e 더불어 일정 관리 파트에서 사용된 카카오맵 기능도 수정해야 했는데, 카카오맵을 처음 다뤄보는 상황이라 충분히 기능을 활용하지 못한 점이 아쉬웠습니다.      \n\u003e 이후에 더 깊이 공부하여 이러한 기술들을 완벽히 익히고, 향후 프로젝트에서 적용할 계획입니다.     \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmungdon%2Fplanner-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmungdon%2Fplanner-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmungdon%2Fplanner-project/lists"}