Skip to content
@Manidle

Manidle

PlannerGram

00. 팀명

🏋️‍♂️Man I-dle🏋️‍♂️

4명의 남자들만 모여 다소 프로젝트가 딱딱 할 수는 있지만

어느 팀 부럽지 않은 뚝딱이들이 모였습니다.

열정과 배움에 대한 열의만큼은 남들에게 떵떵 거릴수 있는 Man I-dle 입니다.

01. 팀원명단

👨 김영광 : 백엔드, 시큐리티, 추가기능개발, 유지보수

👦 김동현 : 백엔드, 시큐리티, 웹퍼블리셔

👨 김도현 : 프론트엔드 총괄

🧑 이세운 : 데브옵스

02. 프로젝트 주제

[PlannerGram]

  1. 여행지 주변의 숙소,대중교통,관광지 등의 정보들을 클라이언트에게 제공 및 추천.
  2. 사용자만의 여행코스를 작성한 게시판을 작성하여 유저들간의 정보공유를 목적으로 함

[PlanerGram 로고]

logo (1)

03. 프로젝트 선정이유

팀원들과 모여 요즘 각자의 관심사를 말하는 시간을 가지던 중, 공통 관심사가 ‘여행’이라는 키워드 였고, ‘여행’ 관련으로 어떤 프로젝트를 진행하면 좋을 지 고민하였다.

우리는 본인의 일상을 게시하며 사람들과 소통하는 FaceBook 혹은 Instagram 같은 SNS 페이지는 많지만 어떠한 주제에 국한되어 사람들과 소통하는 사이트가 현재 미비하다고 느껴지게 되었다.

때문에, 우리는 여행계획을 세울 때 고려해야 할 숙소, 교통수단, 관광지, 렌트카 정보를 사용자에게 제공하여 사용자에게 유용한 정보를 전달해주고, 사용자들이 커뮤니티 게시판에 글을 올리면서 사용자가 이용한 렌트카, 숙소, 교통수단, 관광지 정보를 한 눈에 보기 편하도록 공유하며 사용자들간 소통을 목적으로 한 게시글 기능을 만들어보고자 ‘PlannerGram’ 이라는 주제로 프로젝트를 선정하게 되었다.

03. 프로젝트 기간

  • 2022.08.15 ~ 2022.09.28

04. 프로젝트 일정관리

[노션을 통한 주차별 계획&결과 정리]

image 자세히 보기

05. 기술스택

06. 포지션별 기획

  • 프론트엔드

    • React를 사용한 페이지 구현
    • 재사용성을 높이기 위한 component
    • ReactRouter를 사용한 라우팅
    • 바닐라 CSS가 아닌 MeterialUI를 사용한 화면 꾸미기
  • 백엔드

    • Java + Spring + SpringBoot 를 사용한 CRUD 구현
    • 그저 CRUD가 아닌 RESTful한 API를 만들기
    • RDB을 사용한 짜임새 있는 테이블 연관 관계 구현
    • 문서화를 위해 Swagger 사용
    • 로그인이 중요한 커뮤니티 때문에 SpringSecurity + JWT 를 사용
  • 엔지니어

    • web hookjenkins를 이용한 자동 compile,deploy라인 구축
    • hadoopdocker를 사용한 데이터 분산처리 시스템
    • MQ, cron tab을 이용한 데이터 batch처리

07. 협업방식

  1. 애자일 프로세스

    • check in / check out ground Role 방식을 통한 멤버별 하루 과업량, 출/퇴근시간, 회고 등을 기록.

    • BackLog를 작성하여 프로젝트 총 소요 StoryPoint를 집계하여 개발 계획관리를 진행하는 스크럼(Scrum) 개발방법론으로 진행.

      스크럼(Scrum) 개발방법론

      final project * Manidle

      check in / check out

  2. GitHub

    • Git을 활용한 코드 형상관리.
    • 이슈Tab을 활용하여 팀원들간의 기술공유 및 Exception 공유.
    • Project Tab을 활용하여 BackLog, Sprint 틀 활용.
  3. Notion

    • 주간일정관리 계획 & 결과 공유
    • 프로젝트 정리 & 발표 참고자료 작성
  4. Figma

    • 초기 화면단 WireFrame 작성당시 멤버들과의 화면단 구축 협업작업.

08. 와이어 프레임

  1. Figma Tool을 사용하여 작업
  2. 해당 tool 사용을 통해 손쉬운 화면단 구성
  3. 프론트 & 백엔드 개발자 사이에서의 원활한 개발관련 의사소통이 용이해짐

[Figma를 활용한 PlanerGram의 와이어프레임]

image 자세히 보기

07. ERD (Entity Relationship Diagram)

image (3)

06. 도메인 관련 용어

  • User(유저) : 서비스를 이용하는 사용자.
  • Rentcar(렌트카) : 차량을 일정기간 유상으로 대여하는 사업 및 그 사업을 통해 대여된 차량을 뜻한다
  • Attraction(관광지) : 관광, 여행, 유람에서 역사, 문화, 자연 경관 등의 관광자산을 가진 지역을 뜻한다.
  • Stay(숙박) : 여행자와 관광객들이 숙박을 할 수 있는 시설이 있는 업소이다.
  • TRAIN(기차) : 사람을 실어나르는 여객차를 뜻한다.
  • Post(게시글) : 여러 사람이 볼 수 있도록 서비스되는 서버에 유저(User)가 업로드 한 텍스트를 말한다.
  • REPLY(댓글) : 서버에 업로드 된 게시글(POST)에 유저(USER)가 짧게 덧붙인 텍스트를 말한다.

ATTRACTION 테이블

column data type 설명
attraction_id (PK) BIGINT 관광지 식별자
name VARCHAR 관광지 이름
address VARCHAR 관광지 주소
description VARCHAR 관광지 소개글
price INT 관광지 입장료
likeCount INT 관광지 좋아요 숫자
  • 관광지에 관한 정보가 저장되는 테이블

Attraction_Like 테이블

column data type 설명
attraction_like_id (PK) BIGINT 유저가 좋아요 누른 관광지 식별자
user_id BIGINT 유저식별자
attraction_id BIGINT 관광지 식별자2
  • Attraction(관광지)의 좋아요를 유저정보와 연결시켜주는 테이블.

Board 테이블

column data type 설명
board_id (PK) BIGINT 게시판 식별자
board_name VARCHAR 게시판 이름
  • POST(게시글)을 하위 엔티티로 가지는 게시판 테이블

PLATFORM 테이블

column data type 설명
platform_id (PK) BIGINT 플랫폼 식별자
city_Code VARCHAR 도시코드
city_Name VARCHAR 도시이름
nodeId VARCHAR 기차역코드
nodeName VARCHAR 기차역이름
  • 기차(OPEN API) 역코드 변환 테이블

POST 테이블

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(게시판)의 하위 엔티티, 게시글에 관한 정보를 담고 있는 테이블

POST_ATTRACTION 테이블

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(게시글)에 입력되는 정보

POST_LIKE 테이블

column data type 설명
post_like_id (PK) BIGINT 유저가 좋아요 누른 게시글 식별자
post_id BIGINT 게시글 식별자2
user_id BIGINT 유저 식별자
  • POST(게시글)의 좋아요와 유저정보를 연결해주는 테이블

POST_RENTCAR 테이블

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(게시글)에 입력되는 정보

POST_STAY 테이블

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(게시글)에 입력되는 숙소정보

POST_TRAIN 테이블

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(게시글)에 입력되는 정보

RENTCAR 테이블

column data type 설명
rentcar_id (PK) BIGINT 렌트카 식별자
address VARCHAR 업체주소
companyName VARCHAR 업체이름
carSort VARCHAR 차량종류
carName VARCHAR 차량이름
likeCount INT 좋아요숫자
  • 렌트카에 관한 정보가 저장되는 테이블

RENTCAR_Like 테이블

column data type 설명
rentCar_like_id (PK) BIGINT 유저가 좋아요 누른 렌트카 식별자
rentcar_id BIGINT 렌트카 식별자
user_id BIGINT 유저 식별자
  • RENTCAR(렌트카)의 좋아요와 유저정보를 연결해주는 테이블

REPLY 테이블

column data type 설명
reply_id (PK) BIGINT 댓글 식별자
post_id BIGINT 게시글 식별자
user_id BIGINT 유저 식별자
contents VARCHAR 내용
nickName(DTO) VARCHAR 작성자 닉네임
  • POST(게시글)에 입력되는 댓글정보

STAY 테이블

column data type 설명
stay_id (PK) BIGINT 숙소 식별자
name VARCHAR 이름
address VARCHAR 주소
price INT 1박당 가격
checkIn DATETIME 체크인 시간
checkOut DATETIME 체크아웃 시간
likeCount INT 좋아요 숫자
  • 숙소에 관한 정보가 저장되는 테이블

stay_like 테이블

column data type 설명
stay_like_id (PK) BIGINT 유저가 좋아요 누른 숙소 식별자
stay_id BIGINT 숙소 식별자2
user_id BIGINT 유저 식별자
  • STAY(숙소)의 좋아요와 유저정보를 연결해주는 테이블

USER 테이블

column data type 설명
user_id (PK) BIGINT 유저 식별자
username VARCHAR 로그인 아이디
password VARCHAR 패스워드
nickname VARCHAR 닉네임
roles VARCHAR SECURITY권한
  • 서비스 이용자들의 정보가 저장되는 테이블

User_Info 테이블

column data type 설명
user_info_id (PK) BIGINT 유저 상세정보 식별자
user_id BIGINT 유저 식별자
profileImg VARCHAR 유저 프로필 사진 URL
email VARCHAR 유저 이메일
  • 서비스 이용자들의 추가정보가 저장되는 테이블

08. 트러블 슈팅

  1. 무한 루프 : 테이블들을 서로 매핑해주는 과정에서 Entity를 return했을 때 객체 안에 다른 Entity를 return해주는 무한 순환 참조가 발생됨. DTO패턴 을 사용하여 Entity를 직접 참조하지 않고도 return할 수 있게 코드를 변경하여 무한 루프를 해결.
  2. 타입 에러 : 내장함수를 사용할때 타입이 불일치하여 사용 못하는 문재 발생하여 .orElseThrow(Exception::new) 을 사용하여 해결.
  3. 에러 관리 : 에러발생시 출력되는 에러문을 정확히 이해하지 못하는 현상 발생하여 log문을 따로 출력하여 에러문을 보기쉽게 관리 및 통제
  4. 인스턴스 서버 연결 : 각자의 로컬 서버로 데이터베이스를 관리하는 부분에서 서로 필요한 부분에 데이터가 안 들어가거나 테이블이 미완성 되는 문제를 해결하고자 하나의 인스턴스 서버로 하나의 데이터베이스를 여러 사용자가 이용을 하여 테이블의 부재를 방지.

09. 느낀점

👨김동현

드디어 2달의 프로젝트. 6달의 교육 기간이 끝났습니다.
정말 다투기도 했고 웃기도 하고 성장을 많이한 시간이었습니다. 모든 프로젝트는 후련함도 있지만 아쉬움도 남는 것 같습니다. 프로젝트 기획부터 상당히 촘촘하게 들어갔는데 너무 재밌었습니다. 2달이 가는 줄 몰랐습니다. 6개월동안 많은 성장을 했고 조금이라도 개 발자 비슷한게 되고 있는 것 같아서 뿌듯합니다.

실무 프로젝트와 최대한 흡사하게 진행하기 위해서 Agile에 대해서 공부하기도 하고 협업 전략, 컨벤션에 대해서 많이 고민했습니다. 기술스택은 혼자서 공부할 수 있지만 이런 협업의 기회가, 2달동안 프로젝트를 취업 전에 할 기회는 아마 없을 것 같습니다. 최대한 후회없는 작업을 하려고 했습니다. 재미있었습니다. 조금만 더 쉬고 다들 돌아와서 프로젝트 디벨롭합시다.


👨김도현


즐겁게 팀원들과 함께 코딩을 하면서도 탈도 많고 아쉬운 것도 많은 프로젝트였습니다. 우리의 프로젝트 과정에 Agile 프로세스를 접목시킨 것이 큰 전환점이 되었습니다. 프로젝트 중간이었지만, 짧은 스프린트와 프로젝트 구성의 변화에 관대해지는 것이 저에게는 매우 효과적인 프로세스라고 느껴졌습니다.

짧은 스프린트가 기강을 잡아주고, 관대한 마음으로 자잘한 기능과 구성을 후순위로 미루거나 빼니, 메인기능에 조금 더 집중할 수 있었습니다.

어찌됐든 이 프로젝트를 시작할 때 함깨하는 팀원들보다 많이 뒤처지는 실력이라 시작할 때 많이 미안했는데 끝날 때까지 미안합니다. 우리모두 화이팅입니다.

👨이세운

예전부터 기술명세를 세세하게 작성해서 일정을 나누면 더 좋을것 같다는 생각만 했었는데 실제로 그런식으로 아주 작은 단위로 나눠서 일정을 짜니 훨씬 더 체계적이고 낭비되는 시간을 줄일수있어서 좋았다 하지만 모르는부분을 진행하는것은 이 작업이 얼마나 걸릴지, 이 작업이 얼마나 어려운지 아무것도 파악할수없어서 일정을 짜는데 어려움이 있었다 다음에는 모르는것이 있으면 먼저 간단하게 공부하는기간과 토이프로젝트를 진행해보는 기간을 가지는 방식을 사용해보려고한다 여러기술들의 기본적인 베이스가 되는 기술의 중요성을 많이 느꼈다 기본적인걸 알고있으면 다른기술들을 체득하는 속도가 빠르겠다는걸 체감 할 수 있었다

👨김영광

18개의 테이블, 수많은 연관관계, 오픈 API 등등 백엔드 개발자로서 약 50일동안 많은걸 배웠고, 많은 걸 경험하였다. 솔직히 힘든 시간이 찾아올 때 마다 좌절도 많이 하였지만 내가 생각한 로직대로 프로그램이 잘 돌아갔을때 느낀 성취감과 희열로 지금까지 잘 달려와서 해낼 수 있었지 않았나 싶다.

이번 프로젝트를 계기로 Git 사용법에 매우 친근해졌고, Swagger, JWT, 애자일 프로세스등 새로운걸 많이 배울 수 있었던 50일 이였던것 같다. 또한, APi를 만들고 검증하는 단계가 귀찮더라도 꼭 해야하는 작업인것을 깨달았고, 아무리 복잡한 코드라도 내가만든 코드인데 이해가 안되었을때, 클린코드가 향후 유지보수에 얼마나 중요한 영향을 끼치는지 다시 깨닫게 되는 시간이였다.

이번 프로젝트에서 JWT 인가 처리를 통해 멋있는 기능을 만들고 싶었는데 시간적 여유가 없어 구현을 하지 못한게 너무 아쉬웠다. 지금 이 프로젝트는 여기서 끝나지만 잠깐 쉬었다가 Develop 을 위해서 또 달려나갈텐데 그 때도 힘든 순간이 찾아오면 지금 같은 성취감을 생각하며 열심히 하려한다.


10. 참고 자료

Popular repositories Loading

  1. final-front final-front Public

    JavaScript 1

  2. Final-BackEnd Final-BackEnd Public

    Java 2

  3. .github .github Public

Repositories

Showing 3 of 3 repositories

Top languages

Loading…

Most used topics

Loading…