4명의 남자들만 모여 다소 프로젝트가 딱딱 할 수는 있지만
어느 팀 부럽지 않은 뚝딱이들이 모였습니다.
열정과 배움에 대한 열의만큼은 남들에게 떵떵 거릴수 있는 Man I-dle 입니다.
[PlannerGram]
- 여행지 주변의 숙소,대중교통,관광지 등의 정보들을 클라이언트에게 제공 및 추천.
- 사용자만의 여행코스를 작성한 게시판을 작성하여 유저들간의 정보공유를 목적으로 함
[PlanerGram 로고]
팀원들과 모여 요즘 각자의 관심사를 말하는 시간을 가지던 중, 공통 관심사가 ‘여행’이라는 키워드 였고, ‘여행’ 관련으로 어떤 프로젝트를 진행하면 좋을 지 고민하였다.
우리는 본인의 일상을 게시하며 사람들과 소통하는 FaceBook 혹은 Instagram 같은 SNS 페이지는 많지만 어떠한 주제에 국한되어 사람들과 소통하는 사이트가 현재 미비하다고 느껴지게 되었다.
때문에, 우리는 여행계획을 세울 때 고려해야 할 숙소, 교통수단, 관광지, 렌트카 정보를 사용자에게 제공하여 사용자에게 유용한 정보를 전달해주고, 사용자들이 커뮤니티 게시판에 글을 올리면서 사용자가 이용한 렌트카, 숙소, 교통수단, 관광지 정보를 한 눈에 보기 편하도록 공유하며 사용자들간 소통을 목적으로 한 게시글 기능을 만들어보고자 ‘PlannerGram’ 이라는 주제로 프로젝트를 선정하게 되었다.
- 2022.08.15 ~ 2022.09.28
[노션을 통한 주차별 계획&결과 정리]
-
프론트엔드
React
를 사용한 페이지 구현- 재사용성을 높이기 위한
component
화 ReactRouter
를 사용한 라우팅- 바닐라 CSS가 아닌
MeterialUI
를 사용한 화면 꾸미기
-
백엔드
Java
+Spring
+SpringBoot
를 사용한 CRUD 구현- 그저 CRUD가 아닌
RESTful
한 API를 만들기 RDB
을 사용한 짜임새 있는 테이블 연관 관계 구현- 문서화를 위해
Swagger
사용 - 로그인이 중요한 커뮤니티 때문에
SpringSecurity
+JWT
를 사용
-
엔지니어
web hook
과jenkins
를 이용한 자동compile
,deploy
라인 구축hadoop
과docker
를 사용한 데이터 분산처리 시스템MQ
,cron tab
을 이용한 데이터batch
처리
-
애자일 프로세스
-
check in / check out ground Role 방식을 통한 멤버별 하루 과업량, 출/퇴근시간, 회고 등을 기록.
-
BackLog를 작성하여 프로젝트 총 소요 StoryPoint를 집계하여 개발 계획관리를 진행하는 스크럼(Scrum) 개발방법론으로 진행.
스크럼(Scrum) 개발방법론
-
-
GitHub
- Git을 활용한 코드 형상관리.
- 이슈Tab을 활용하여 팀원들간의 기술공유 및 Exception 공유.
- Project Tab을 활용하여 BackLog, Sprint 틀 활용.
-
Notion
- 주간일정관리 계획 & 결과 공유
- 프로젝트 정리 & 발표 참고자료 작성
-
Figma
- 초기 화면단 WireFrame 작성당시 멤버들과의 화면단 구축 협업작업.
- Figma Tool을 사용하여 작업
- 해당 tool 사용을 통해 손쉬운 화면단 구성
- 프론트 & 백엔드 개발자 사이에서의 원활한 개발관련 의사소통이 용이해짐
- User(유저) : 서비스를 이용하는 사용자.
- Rentcar(렌트카) : 차량을 일정기간 유상으로 대여하는 사업 및 그 사업을 통해 대여된 차량을 뜻한다
- Attraction(관광지) : 관광, 여행, 유람에서 역사, 문화, 자연 경관 등의 관광자산을 가진 지역을 뜻한다.
- Stay(숙박) : 여행자와 관광객들이 숙박을 할 수 있는 시설이 있는 업소이다.
- TRAIN(기차) : 사람을 실어나르는 여객차를 뜻한다.
- Post(게시글) : 여러 사람이 볼 수 있도록 서비스되는 서버에 유저(User)가 업로드 한 텍스트를 말한다.
- REPLY(댓글) : 서버에 업로드 된 게시글(POST)에 유저(USER)가 짧게 덧붙인 텍스트를 말한다.
column | data type | 설명 |
---|---|---|
attraction_id (PK) | BIGINT | 관광지 식별자 |
name | VARCHAR | 관광지 이름 |
address | VARCHAR | 관광지 주소 |
description | VARCHAR | 관광지 소개글 |
price | INT | 관광지 입장료 |
likeCount | INT | 관광지 좋아요 숫자 |
- 관광지에 관한 정보가 저장되는 테이블
column | data type | 설명 |
---|---|---|
attraction_like_id (PK) | BIGINT | 유저가 좋아요 누른 관광지 식별자 |
user_id | BIGINT | 유저식별자 |
attraction_id | BIGINT | 관광지 식별자2 |
- Attraction(관광지)의 좋아요를 유저정보와 연결시켜주는 테이블.
column | data type | 설명 |
---|---|---|
board_id (PK) | BIGINT | 게시판 식별자 |
board_name | VARCHAR | 게시판 이름 |
- POST(게시글)을 하위 엔티티로 가지는 게시판 테이블
column | data type | 설명 |
---|---|---|
platform_id (PK) | BIGINT | 플랫폼 식별자 |
city_Code | VARCHAR | 도시코드 |
city_Name | VARCHAR | 도시이름 |
nodeId | VARCHAR | 기차역코드 |
nodeName | VARCHAR | 기차역이름 |
- 기차(OPEN API) 역코드 변환 테이블
column | data type | 설명 |
---|---|---|
post_id (PK) | BIGINT | 게시글 식별자 |
user_id | BIGINT | 유저 식별자 |
board_id | BIGINT | 게시판 식별자2 |
title | VARCHAR | 제목 |
contents | VARCHAR | 본문 |
like_count | INT | 좋아요 숫자 |
read_count | INT | 조회수 |
boardName | VARCHAR | 게시판 이름(DTO) |
nickname | VARCHAR | 작성자 닉네임(DTO) |
- BOARD(게시판)의 하위 엔티티, 게시글에 관한 정보를 담고 있는 테이블
column | data type | 설명 |
---|---|---|
post_attraction_id (PK) | BIGINT | 참고된 관광지 식별자 |
attraction_id | BIGINT | 관광지 식별자 |
post_id | BIGINT | 게시글 식별자 |
name(DTO) | VARCHAR | 이름 |
address(DTO) | VARCHAR | 주소 |
description(DTO) | VARCHAR | 소개글 |
price(DTO) | INT | 입장료 |
likeCount(DTO) | INT | 좋아요 숫자 |
- POST(게시글)에 입력되는 정보
column | data type | 설명 |
---|---|---|
post_like_id (PK) | BIGINT | 유저가 좋아요 누른 게시글 식별자 |
post_id | BIGINT | 게시글 식별자2 |
user_id | BIGINT | 유저 식별자 |
- POST(게시글)의 좋아요와 유저정보를 연결해주는 테이블
column | data type | 설명 |
---|---|---|
post_rentcar_id (PK) | BIGINT | 참고된 렌트카 식별자 |
rentcar_id | BIGINT | 렌트카 식별자2 |
post_id | BIGINT | 게시글 식별자 |
address(DTO) | VARCHAR | 업체주소 |
companyName(DTO) | VARCHAR | 업체이름 |
carSort(DTO) | VARCHAR | 차량종류 |
carName(DTO) | VARCHAR | 차량이름 |
likeCount(DTO) | INT | 좋아요 숫자 |
- POST(게시글)에 입력되는 정보
column | data type | 설명 |
---|---|---|
post_stay_id (PK) | BIGINT | 참고된 숙소 식별자 |
stay_id | BIGINT | 숙소 식별자 |
post_id | BIGINT | 게시글 식별자 |
name(DTO) | VARCHAR | 이름 |
address(DTO) | VARCHAR | 주소 |
price(DTO) | INT | 1박당 가격 |
checkIn(DTO) | DATETIME | 체크인 시간 |
checkOut(DTO) | DATETIME | 체크아웃 시간 |
likeCount(DTO) | INT | 좋아요 숫자 |
- POST(게시글)에 입력되는 숙소정보
column | data type | 설명 |
---|---|---|
post_train_id (PK) | BIGINT | 참고된 기차 식별자 |
post_id | BIGINT | 게시글 식별자 |
depplacename | VARCHAR | 출발역 |
arrplacename | VARCHAR | 도착역 |
depplan | VARCHAR | 주소 |
price(DTO) | INT | 1박당 가격 |
checkIn(DTO) | DATETIME | 체크인 시간 |
checkOut(DTO) | DATETIME | 체크아웃 시간 |
likeCount(DTO) | INT | 좋아요 숫자 |
- POST(게시글)에 입력되는 정보
column | data type | 설명 |
---|---|---|
rentcar_id (PK) | BIGINT | 렌트카 식별자 |
address | VARCHAR | 업체주소 |
companyName | VARCHAR | 업체이름 |
carSort | VARCHAR | 차량종류 |
carName | VARCHAR | 차량이름 |
likeCount | INT | 좋아요숫자 |
- 렌트카에 관한 정보가 저장되는 테이블
column | data type | 설명 |
---|---|---|
rentCar_like_id (PK) | BIGINT | 유저가 좋아요 누른 렌트카 식별자 |
rentcar_id | BIGINT | 렌트카 식별자 |
user_id | BIGINT | 유저 식별자 |
- RENTCAR(렌트카)의 좋아요와 유저정보를 연결해주는 테이블
column | data type | 설명 |
---|---|---|
reply_id (PK) | BIGINT | 댓글 식별자 |
post_id | BIGINT | 게시글 식별자 |
user_id | BIGINT | 유저 식별자 |
contents | VARCHAR | 내용 |
nickName(DTO) | VARCHAR | 작성자 닉네임 |
- POST(게시글)에 입력되는 댓글정보
column | data type | 설명 |
---|---|---|
stay_id (PK) | BIGINT | 숙소 식별자 |
name | VARCHAR | 이름 |
address | VARCHAR | 주소 |
price | INT | 1박당 가격 |
checkIn | DATETIME | 체크인 시간 |
checkOut | DATETIME | 체크아웃 시간 |
likeCount | INT | 좋아요 숫자 |
- 숙소에 관한 정보가 저장되는 테이블
column | data type | 설명 |
---|---|---|
stay_like_id (PK) | BIGINT | 유저가 좋아요 누른 숙소 식별자 |
stay_id | BIGINT | 숙소 식별자2 |
user_id | BIGINT | 유저 식별자 |
- STAY(숙소)의 좋아요와 유저정보를 연결해주는 테이블
column | data type | 설명 |
---|---|---|
user_id (PK) | BIGINT | 유저 식별자 |
username | VARCHAR | 로그인 아이디 |
password | VARCHAR | 패스워드 |
nickname | VARCHAR | 닉네임 |
roles | VARCHAR | SECURITY권한 |
- 서비스 이용자들의 정보가 저장되는 테이블
column | data type | 설명 |
---|---|---|
user_info_id (PK) | BIGINT | 유저 상세정보 식별자 |
user_id | BIGINT | 유저 식별자 |
profileImg | VARCHAR | 유저 프로필 사진 URL |
VARCHAR | 유저 이메일 |
- 서비스 이용자들의 추가정보가 저장되는 테이블
- 무한 루프 : 테이블들을 서로 매핑해주는 과정에서 Entity를 return했을 때 객체 안에 다른 Entity를 return해주는 무한 순환 참조가 발생됨. DTO패턴 을 사용하여 Entity를 직접 참조하지 않고도 return할 수 있게 코드를 변경하여 무한 루프를 해결.
- 타입 에러 : 내장함수를 사용할때 타입이 불일치하여 사용 못하는 문재 발생하여 .orElseThrow(Exception::new) 을 사용하여 해결.
- 에러 관리 : 에러발생시 출력되는 에러문을 정확히 이해하지 못하는 현상 발생하여 log문을 따로 출력하여 에러문을 보기쉽게 관리 및 통제
- 인스턴스 서버 연결 : 각자의 로컬 서버로 데이터베이스를 관리하는 부분에서 서로 필요한 부분에 데이터가 안 들어가거나 테이블이 미완성 되는 문제를 해결하고자 하나의 인스턴스 서버로 하나의 데이터베이스를 여러 사용자가 이용을 하여 테이블의 부재를 방지.
드디어 2달의 프로젝트. 6달의 교육 기간이 끝났습니다.
정말 다투기도 했고 웃기도 하고 성장을 많이한 시간이었습니다.
모든 프로젝트는 후련함도 있지만 아쉬움도 남는 것 같습니다. 프로젝트 기획부터 상당히 촘촘하게 들어갔는데 너무 재밌었습니다.
2달이 가는 줄 몰랐습니다. 6개월동안 많은 성장을 했고 조금이라도 개 발자 비슷한게 되고 있는
것 같아서 뿌듯합니다.
실무 프로젝트와 최대한 흡사하게 진행하기 위해서 Agile에 대해서 공부하기도 하고 협업 전략, 컨벤션에 대해서 많이 고민했습니다. 기술스택은 혼자서 공부할 수 있지만 이런 협업의 기회가, 2달동안 프로젝트를 취업 전에 할 기회는 아마 없을 것 같습니다. 최대한 후회없는 작업을 하려고 했습니다. 재미있었습니다. 조금만 더 쉬고 다들 돌아와서 프로젝트 디벨롭합시다.
즐겁게 팀원들과 함께 코딩을 하면서도 탈도 많고 아쉬운 것도 많은 프로젝트였습니다. 우리의 프로젝트 과정에 Agile 프로세스를 접목시킨 것이 큰 전환점이 되었습니다. 프로젝트 중간이었지만, 짧은 스프린트와 프로젝트 구성의 변화에 관대해지는 것이 저에게는 매우 효과적인 프로세스라고 느껴졌습니다.
짧은 스프린트가 기강을 잡아주고, 관대한 마음으로 자잘한 기능과 구성을 후순위로 미루거나 빼니, 메인기능에 조금 더 집중할 수 있었습니다.
어찌됐든 이 프로젝트를 시작할 때 함깨하는 팀원들보다 많이 뒤처지는 실력이라 시작할 때 많이 미안했는데 끝날 때까지 미안합니다. 우리모두 화이팅입니다.
예전부터 기술명세를 세세하게 작성해서 일정을 나누면 더 좋을것 같다는 생각만 했었는데
실제로 그런식으로 아주 작은 단위로 나눠서 일정을 짜니 훨씬 더 체계적이고 낭비되는 시간을 줄일수있어서 좋았다
하지만 모르는부분을 진행하는것은 이 작업이 얼마나 걸릴지, 이 작업이 얼마나 어려운지 아무것도 파악할수없어서 일정을 짜는데 어려움이 있었다 다음에는 모르는것이 있으면 먼저 간단하게 공부하는기간과 토이프로젝트를 진행해보는 기간을 가지는 방식을 사용해보려고한다
여러기술들의 기본적인 베이스가 되는 기술의 중요성을 많이 느꼈다 기본적인걸 알고있으면 다른기술들을 체득하는 속도가 빠르겠다는걸 체감 할 수 있었다
18개의 테이블, 수많은 연관관계, 오픈 API 등등 백엔드 개발자로서 약 50일동안 많은걸 배웠고, 많은 걸 경험하였다. 솔직히 힘든 시간이 찾아올 때 마다 좌절도 많이 하였지만 내가 생각한 로직대로 프로그램이 잘 돌아갔을때 느낀 성취감과 희열로 지금까지 잘 달려와서 해낼 수 있었지 않았나 싶다.
이번 프로젝트를 계기로 Git 사용법에 매우 친근해졌고, Swagger, JWT, 애자일 프로세스등 새로운걸 많이 배울 수 있었던 50일 이였던것 같다. 또한, APi를 만들고 검증하는 단계가 귀찮더라도 꼭 해야하는 작업인것을 깨달았고, 아무리 복잡한 코드라도 내가만든 코드인데 이해가 안되었을때, 클린코드가 향후 유지보수에 얼마나 중요한 영향을 끼치는지 다시 깨닫게 되는 시간이였다.
이번 프로젝트에서 JWT 인가 처리를 통해 멋있는 기능을 만들고 싶었는데 시간적 여유가 없어 구현을 하지 못한게 너무 아쉬웠다. 지금 이 프로젝트는 여기서 끝나지만 잠깐 쉬었다가 Develop 을 위해서 또 달려나갈텐데 그 때도 힘든 순간이 찾아오면 지금 같은 성취감을 생각하며 열심히 하려한다.