팀명 : 1oT

팀원 :

  배성민
  소우주
  손세림
  신대영
  이준형

1. 프로젝트 소개

배경 : 기존의 ERP, CRM 등의 프로그램은 오래된 디자인과 기능으로 인해 사용자 경험이 저하되고 있습니다. 따라서 최신 트렌드와 기술을 반영하여 보다 나은 사용성을 가진 프로그램을 개발하고자 합니다.

호텔(Hotel)과 유틸리티(Utility)의 합성어로, 호텔 업계에서 지속적인 고객 관리를 위한 통합 시스템을 의미합니다.
이 시스템은 고객에게 효율적인 자료 관리, 인공지능(AI) 기술, 맞춤형 가이드를 제공함으로써 고객 만족도를 극대화하는 것을 목표로 합니다.
주제 및 목표

주제 : 지속적인 고객 관리를 위한 시스템


목표 :
1. 사용자에게 친화적인 UI/UX 설계
2. AI도입으로 업무 효율성 증가
3. 가이드 제공으로 업무 중단 최소화
4. 효율적인 고객 관리
5. 실시간 성능 측정 및 분석
6. 자료 관리

⚙️ Stack / Tool

기술스택
SpringBoot SpringSecurity Vue HTML CSS JavaScript MariaDB Spring Data JPA Bootstrap
Jenkins Kubernetis Docker Redis Grafana Prometheus ngrok Json Web Tokens
개발도구
IntelliJ IDEA Visual Studio HeidiSQL Figma GitHub Slack

개발도구 및 기술스택 Version
  • Java17
  • Spring 3.2.4
  • Gradle 8.5+
  • Spring Security 6
  • Jwt 0.11.5
  • CSS 3
  • HTML 5
  • Bootstrap 5
  • Kubernetis 1.29.1
  • Docker 25.0.3
  • Jasypt 3.0.5
  • J soup 1.17.2

2. 프로젝트 관련 문서

프로젝트 관련 문서

1. WBS

2. 요구사항 명세서

3. API 명세서

4. Modeling

5. 단위 테스트 결과서

6. Storyboard

7. 화면설계서

8. UI/UX 테스트

3. Architecture

Architecture Image

4. 배포 과정

5. 통합 테스트

테스트 결과

통합 테스트 결과서

회고

  팀 원    회고록
배성민  최종 프로젝트였기 때문에 더 노력했다라는 말보다는 항상 같았던 프로젝트였지만 조금 더 욕심이 났던 것 같습니다. 저희 팀의 첫 번째 목표는 분업화해서 각자 하나씩만 몰두하는 것이 아니라 다양한 분야를 서로 도전해보자가 첫 번째였는데 이는 백엔드와 프론트엔드 두 부분에서 잘 지켜졌던 것 같습니다. 주제는 '지속적인 고객 관리를 위한 시스템'이었고 다양한 ERP 주제 중에 직접 선정했지만 처음에는 ERP와 CRM 두 부분의 개념을 정리하며 분리하는데에 조금 어려움이 있었습니다. 하지만 앞서 진행했던 프로젝트 경험을 바탕으로 기획을 조금 더 탄탄하게 했고, 시간을 전보다는 더 여유롭게 쓸 수 있다는 점이 기획 단계에서 '고객 관리를 위한 호텔 시스템'인 호텔리티를 도출해내는데 중요한 역할을 했다고 생각합니다.

 처음에는 단순히 고객에 관련한 기능만 넣으면 되지 않을까 하는 생각이 있었으나, 고객이라는 큰 주제에서 하나 혹은 두 가지의 기능만 분리하기는 어려웠고, 최종인만큼 욕심도 생겼기 때문에 다양한 기능을 추가하며 보다 완벽하게 시스템을 제작하고자 했던 것 같습니다. 기획 이후에는 백엔드에서 CRUD를 모두가 나눠서 각자의 부분에서 맡아서 진행했고, 제가 맡았던 주제는 영업 관리(sales)와 마케팅(marketing)쪽에서 CRUD를 작성했고, 이후에는 프론트에서 처음 전체적인 디자인이나 UI구성 및 스타일의 기초를 제작하였습니다. 백엔드와 프론트 모두 다 같이 한 이후에는 분업이라는 것도 진행했습니다. 저희는 팀으로써 만드는 프로젝트였기 때문에 전체가 다 해본다는 장점, 그리고 본인의 역할에 중점을 두고 시스템을 완성해간다는 장점 두 가지를 모두 경험해볼 수 있었습니다. 예를 들어 후반에는 인프라 구축 / 백엔드 수정 및 고도화 / 프론트엔드 수정 및 고도화 등 나눠서 작업할 수 있었습니다.

 어려웠던 점은 처음 접해보는 시스템이었던 부분이 어려웠던 것 같습니다. 예를 들어 이미 사용하고 있는 시스템과 차별점을 두기 위해서는 그만큼 조금 더 나은 기술이나 장점이 있어야 하는데, 기본적인 부분을 확실하게 전부 이해하지 못한 채로 차별점을 두기가 쉽지 않았습니다. 이러한 부분은 강사님께 여쭤보거나, 멘토링을 하며 멘토님께 실제 현업에 대해서 묻기도 하고, 기존 시스템을 직접 찾아보기도 하며 조금 격차를 줄일 수 있었습니다. 또한 차별점을 두기 위해서 생각했던 다양한 기능들을 전부 포함하지 못 했던 부분도 아쉬웠던 것 같습니다. SMS를 통한 캠페인 발송이나 알림 혹은 채팅과 같은 기능은 시간 부족으로 추가하지 못 했기 때문입니다. 다음에는 이러한 부분까지 고려하여 기획하고, 조금 더 노력해서 원하는 부분을 모두 적용시킬 수 있었으면 합니다. 마지막으로 specification을 적용하며 refactoring이 필요한 코드가 되기도 했고, 어느 부분들을 적용시켜야할지 조금 어려움이 있었던 것 같습니다. 기능 뿐만 아니라 화면에서 동작하는 부분도 고려해야했기 때문입니다. 이 문제점은 팀원들과 끊임없이 소통해가며 해결할 수 있었습니다.

 각자의 역할에 그저 충실했던 것이 아니라 '팀'이라는 단체 안에서 역할을 하고 함께 제작했기 때문에 완성도가 있는 시스템이 나왔다고 생각합니다. 이런 경험이 앞으로의 팀 프로젝트나 다양한 일에 확실히 좋은 영향을 미칠 것이라고 생각합니다. 이 경험들을 바탕으로 팀 안에서의 '나', 그리고 혼자일 때 '나' 모두가 더 나은 사람이 될 것이라고 확신합니다.
소우주 마지막 프로젝트를 시작하며 팀원들과 함께 유종의 미를 잘 거두겠다는 결연한 의지를 다졌습니다. 그동안 진행했던 그 어떤 프로젝트보다 더 긴 기간이었기에 초심을 잃지 않으려 거듭 다짐하며 개발을 진행하였습니다.

“지속적인 고객 관리를 위한 ERP 시스템”이라는 다소 생소한 주제를 접하였지만, 팀원들과 함께 철저한 준비를 거쳤습니다. 기획 단계의 기간을 넉넉히 잡아, 주제에 대한 깊이 있는 자료조사를 진행하였고, 이를 바탕으로 세부적인 기획서를 작성하였습니다. 이러한 과정을 통해 우리는 “호텔 직원들을 위한 호텔 고객 관리 시스템”이라는 구체적인 목표를 설정하였습니다. 각 팀원이 맡은 역할에 따라 조사하고 토론하며 시스템의 구조와 기능을 하나씩 구체화해 나갔고, 그 결과 프로젝트의 전반적인 틀을 잡을 수 있었습니다.

Spring Data JPA를 기반으로 한 CRUD와 AWS의 RDS 구축을 위주로 개발을 진행하였습니다. ERP 시스템에서 중요하다고 여겨지는 조회 성능의 향상과 유지보수의 용이성을 위해 JPA Specification과 Pageable을 적용하였습니다. 이로 인하여 어떤 조회 페이지를 로딩할 때 백엔드에서 최소한의 데이터를 프론트엔트로 넘겨줄 수 있도록 하여 페이지 로드 시간을 최소화하였습니다.

호텔 관리에 효율성을 더해줄 기능으로 무엇이 있을까 고민해보았을 때, 호텔에서 가장 중요한 도메인이라고 할 수 있는 예약과 결제 데이터를 분석하여 관리자가 가장 자주 보는 페이지에서 명료하고 간결한 문장으로 설명하는 기능이 있으면 좋겠다는 생각을 하였습니다. 그리하여 메인 페이지에서 LLM 프롬프팅을 통해 데이터를 분석하여 설명하는 기능을 ChatGPT API를 이용하여 구현하였습니다.

꼼꼼함과 협업을 강조하셨던 멘토님과의 멘토링을 통해 팀원들과의 더욱 긴밀한 협력을 하여 미비한 점을 보완할 수 있었습니다. 어려웠던 순간들마다 함께했던 팀원들의 격려와 도움을 통해 초심을 잃지 않고 갈무리할 수 있었고, 나름의 유종의 미를 거둘 수 있었습니다.
손세림 이번 프로젝트는 이전 프로젝트와는 또다른 경험을 쌓을 수 있는 소중한 기회였습니다.

앞선 두 프로젝트에서 로그인 기능 개발을 맡았던 것과 달리 이번 프로젝트에서는 JPA를 활용한 CRUD 기능 개발에 초점을 두었습니다. 제가 맡은 도메인은 호텔 서비스 도메인으로 객실 예약 및 투숙, 결제와 관련된 기능을 개발하였습니다. 해당 기능 개발을 위해 날짜 데이터의 변환과 처리에 중점을 두었고, 이 과정에서 betweenDate를 사용하여 시작 날짜와 종료 날짜를 지정, 특정 월에 대한 정보를 출력하는 로직을 배울 수 있었습니다. 또한, 다양한 연관관계를 가진 Entity들 사이의 데이터 매핑 방법과 DTO 변환 과정에 대해 알 수 있었습니다.

프론트엔드 개발 과정에서는 캘린더 API를 활용하여 예약 및 투숙 시스템을 구현하였습니다. 캘린더에 이벤트를 추가 시 데이터가 출력되지 않는 오류를 해결하는 과정에서 Vue.js 프레임워크의 인스턴스 생명 주기를 이해하고 그 활용 방법을 배웠으며, 실제 화면에 다양한 기능을 통합하는 실전 경험을 쌓을 수 있었습니다.

반면에 프로젝트를 진행하며 아쉬웠던 점도 있었습니다. 프로젝트의 목표를 설정한 후 기획 단계에서 다양한 아이디어들이 나왔고, 이를 프로젝트에 반영하면서 개발해야 할 기능이 많아져 시간 분배에 어려움이 있었습니다. 앞으로는 기획 초기에 우선 순위를 정하고, 개발해야 할 기능의 중요도를 명확히 설정할 계획입니다.

또한, 예약과 투숙 관련 데이터 조회 시 JoinColumn을 과도하게 사용해 조회 성능이 저하되는 문제가 있었습니다. 이 문제를 해결하기 위해 지연 로딩과 fetch join, distinct 등의 최적화 기법을 적용하여 불필요한 쿼리 실행을 줄이고 중복을 최소화할 계획입니다.

여러모로 부족한 점이 많았지만 감사하게도 좋은 팀원들을 만나 서로 협력하며 프로젝트를 성공적으로 마무리 할 수 있었습니다. 다양한 시도와 경험을 통해 겪은 시행 착오와 문제 해결 과정은 저에게 매우 중요한 성장 기회였습니다. 이를 바탕으로 앞으로도 꾸준히 개발 역량을 키워 다른 사람에게 도움을 주며 성장할 수 있는 개발자가 되고자 합니다.
신대영 최종 프로젝트는 그동안 배운 모든 것을 총망라한 결과물이었습니다. 각자의 역할을 충실히 수행하며, 목표를 향해 한 걸음씩 나아갔습니다. 프로젝트가 진행될수록 우리 팀의 결속력은 더욱 강해졌고, 마침내 성공적인 마무리를 이룰 수 있었습니다. 프로젝트의 성공은 모두가 함께 힘을 합쳐 이뤄낸 값진 성과라고 생각합니다.

특히, 이번 프로젝트에서 저는 CI/CD 구축을 맡아서 진행했습니다. 이 과정에서 내가 잘 해내지 못하면 모든 과정이 물거품이 될 것 같다는 압박감이 컸습니다. 프로젝트 마무리가 얼마 남지 않은 상황에서 배포 과정 중 발견한 에러는 정말 해결하기 어려웠습니다. 그러나 끊임없이 트러블 슈팅을 진행하며 문제의 원인을 찾아갔습니다. 결국, EKS 서버에 폰트가 설치되어 있지 않아 Excel 다운로드가 진행되지 않는 문제를 발견하였고, Dockerfile에 엑셀 다운로드 명령어를 추가하여 문제를 해결해 나갔습니다. 이 과정을 통해 많은 것을 배울 수 있었고, 큰 성취감을 느낄 수 있었습니다.

이번 교육 과정을 통해 우리는 단순히 기술적인 지식뿐만 아니라, 협력과 문제 해결 능력, 그리고 끈기와 열정의 중요성을 배웠습니다. 이러한 경험들이 앞으로 우리 각자의 길에 큰 자산이 될 것이라 확신합니다. 마지막으로, 함께 수고해준 모든 분들께 진심으로 감사의 말씀을 드립니다.
이준형 이번 파이널 프로젝트로 진행한 Hotelity는 호텔 업계에서 지속적인 고객 관리를 위한 통합 시스템으로 호텔 운영과 고객 관리를 위해 필요한 기능을 포함합니다. 시스템 사용자는 대시보드에서 예약을 효율적으로 관리할 수 있고 고객 관리를 위한 캠페인 발송 등을 할 수 있습니다.

초기 팀원들과 회의와 멘토링을 통해 프로젝트의 주요 기능과 요구사항을 정의하고, 시스템 아키텍처 및 데이터베이스 설계 그리고 RESTful API 설계를 통해 프론트엔드와 백엔드 간의 통신을 명확히 정의했습니다.

GitHub를 이용한 효율적인 코드 관리와 이슈관리 그리고 Slack과 정기적인 회의를 통해 의견 충돌과 프로젝트의 일정 관리를 할 수 있었습니다.
이렇게 팀원들과의 원활한 커뮤니케이션과 협업이 프로젝트 성공에 중요한 역할을 한다는 것을 배웠습니다.

이번 파이널 프로젝트를 하며 배운 기술적인 부분과 팀원들과의 협업으로 문제를 해결하는 과정을 통해 향후 다른 프로젝트를 진행함에 있어 다음과 같은 점을 적용하고자 합니다.

우선, 새로운 기술 스택을 배우는 데 주저하지 않고 적극적으로 도전하며, 각 기술의 장단점을 명확히 이해하여 프로젝트의 특성에 맞게 선택하고 활용할 것입니다. 또한, 효율적인 협업을 위해 초기 기획 단계에서 명확한 역할 분담과 목표 설정이 중요함을 깨달았으므로, 이를 철저히 준비하여 프로젝트 진행 중 불필요한 혼선이 없도록 할 것입니다.

또한, 정기적인 소통과 피드백을 통해 팀원 간의 신뢰와 협력 관계를 더욱 강화하고, 문제 발생 시 신속하게 대응할 수 있는 체계를 구축할 계획입니다. 이를 통해 프로젝트의 품질을 높이고, 일정 내에 목표를 달성할 수 있도록 할 것입니다.

마지막으로, 이번 프로젝트를 통해 얻은 경험을 바탕으로 지속적인 자기 계발을 통해 더욱 성장하고, 팀원들과 함께 더 나은 결과를 만들어 나갈 수 있도록 노력하겠습니다.