패스트캠퍼스X야놀자: 백엔드 개발 부트캠프_2차 토이프로젝트 후기

GEONMOO·2023년 10월 31일

어느새 한달이 지나 처음으로 스프링을 통한 토이 프로젝트를 진행하게 되었다.

이번에는 우리가 그동안 갈고 닦았던(?) 스프링으로 프로젝트를 진행하게 되어 매우 기대가 되었다.
RFP를 받았을때는 저번과 비슷하여 큰 어려움은 없어보여서 이해를 하는데는 크게 어려움이 없었다.

요구사항은 간단히 이렇다.

  • 본 프로젝트는 여행과 여정을 기록하고 조회, 수정하는 RESTful API를 구현한다.
    과 달리 필요한 설계는 여러분들이 직접 구성한다.
  • 모든 기능을 수행할 수 있는 RESTful API를 설계한다.
  • 여행 정보 및 특정 여행 정보의 여정 목록을 저장하기 위한 ERD를 설계한다.
  • 회원은 여러 여행 기록을 저장할 수 있다.
    본 프로젝트에서는 회원은 고려하지 않습니다. 1번 기능만 구현한다.
  • 여행은 여러 여정을 가질 수 있다.
    여정 정보는 이동정보, 체류정보, 숙박정보 등의 종류를 포함할 수 있다.
  • 회원이 가진 전체 여행 리스트를 조회할 수 있다.
  • 전체 여행 리스트는 여행 정보와 각 여행에 포함된 여정 이름들을 같이 보여준다.
  • 각 여행의 상세 여정 정보는 개별 여행 조회를 통해 수행한다.
  • 회원은 개별 여행 정보를 조회할 수 있다.
  • 특정 여행에 대한 모든 여정 리스트를 보여준다.
  • 여정의 상세 정보를 모두 포함한다.
  • 여행 정보 및 특정 여행 정보의 여정 목록을 데이터베이스에 저장한다.
  • 장소명과 일시 공통 유틸리티 클래스로 생성하여 활용한다.
  • 모든 Data는 JSON으로 반환한다. (옵션. ResponseEntity 객체 사용 가능하다.)

자바로 토이 프로젝트에 하는 거에 비하면 이것저것 옵션도 추가되었지만
난이도는 높지 않았다.

먼저 이를 개발하기 위해 설계도인 DB ERD를 팀원들과 같이 생각해보았다.
ERD에서 어려웠던 점은 여정이 여러 종류로 나뉘기에 이를 어떻게 ERD상에서 나타내고 조회를 해올 것인지에 대한 어려움이 있었는데 여정에 대한 테이블을 3개로 나누고
여행ID를 외래키로 전부 넣은 후 이를 통해 조회해오는 것으로 마무리 지었다.

이후 API 명세서를 작성하여 기능 개발 역할 분담을 나누었다.

내가 맡은 부분은 여행에 대한 POST,PATCH,PUT을 맡았으며 공통 예외 처리 및 유효성 체크를 위한 커스텀 어노테이션을 만들어 보았다.
가장 어려웠던 점은 공통 예외 처리에 익숙하지 않아 공부를 하면서 개발을 진행하였는데
실제 예외가 내가 원하는대로 나오지 않아 해당 부분을 찾아서 개발하느냐 많이 애를 먹었다(?)
다만,끝나고 났을때 어느 프로젝트때보다도 성장한 게 느껴지며 기분이 매우 좋았다.

팀원들이 컨벤션도 확실하게 잡아와서 이를 통해 동일한 컨벤션을 통해 개발을 진행하면서 익숙치 않아 삐걱이는 부분도 존재하였지만,다음 프로젝트에서는 동일한 컨벤션을 가져갈거기에 아마 더 낫지 않을까 생각해본다.

프로젝트를 마무리 하고 나온 결과물들을 정리하면서 글을 마치도록 하겠다.

💡 Topic

  • 여행 여정을 기록과 관리하는 SNS 서비스
  • 사용자가 여행 기록과 여행에 따른 여정을 기록할 수 있게 하는 서비스

📝 Summary

실제 많은 사람들은 여행을 다녀올 때 한 곳만을 다녀오지 않고 여러 개의 장소를 다녀오며 포스팅을 한다. 이런 점을 본따 사용자가 한 개의 여행을 기록하고 한 개의 여행 안에 여러 개의 여정(이동,숙박,체류)타입들을 기록할 수 있다.
단 건의 여행 조회(여행에 포함된 다 건의 여정도 조회) 및 다 건의 여행(여행에 포함된 여정의 이름도 조회)을 조회할 수 있으며 여행과 여정 각각을 등록,수정할 수 있다.

⭐️ Key Function

  • 여행
    • 여행에 속해있는 여행 이름,시작 시간,종료 시간,국내 외 여부를 저장할 수 있다.
    • 여행에 속해있는 여행 이름,시작 시간,종료 시간,국내 외 여부 전부를 수정할 수 있다.
    • 여행에 속해있는 여행 이름,시작 시간,종료 시간,국내 외 여부 중 일부를 수정할 수 있다.
    • 여행 단 건을 조회하면서 여행에 포함된 여정들도 같이 조회할 수 있다.
    • 여행 다 건을 조회하면서 여행들에 포함된 여정들의 이름을 같이 조회할 수 있다.
  • 여정
    • 여행 ID를 통해 해당하는 여행에 여정의 타입(이동,숙박,체류)등을 지정해 저장할 수 있다.

🛠 Tech Stack

Spring Boot, Github ,Git MySQL ,Docker

⚙️ Architecture

Domain-Driven Design Architecture

🧑🏻‍💻 Team

  • 백엔드 개발자 4명

🤚🏻 Part

  • 공통 예외 처리
  • 여행의 POST,PUT,PATCH API 개발
  • 공통 API RESPONSE 처리
  • DB ERD 설계

🤔 Learned

  • Exception Handler를 통한 공통 예외 처리를 직접 해봄으로써 예외 처리의 집중화 및 @Valid를 통한 유효성 체크에 대한 흐름을 알게 되었다.
  • ERRORCODE 및 VALIDATIONCODE를 ENUM 타입으로 관리하여 유지보수를 편하게 할 수 있다는 것을 알게 되었다.
  • API를 호출하였을때 공통 API RESPONSE를 적용하여 공통적으로 결과값을 받을 수 있도록 처리할 수 있게 되었다.
  • 직접 DB 설계를 해봄으로써 DB에 대해서 어떻게 설계를 해야되는지에 대해 이해하게 되었다.
  • Docker 이미지에 MySQL 서버를 올림으로써 Docker에 대한 사용법을 좀 더 이해하게 되었다.

🔌 프로젝트 실행방법

  • 이 프로젝트에서는 코드 다운으로만 실행이 불가하고 DB가 Docker에 이미지 파일로 올라가 있기에 Docker 실행 방법이 필요하다.
    프로젝트를 실행해보기 위해서는 아래의 설정과 파일들이 필요하다.
    Untitled

그래서 위의 그림과 같은 관계를 가지고 동작한다.

  1. SpringBoot 에서 3305Port로 DB관련 요청을 보낸다.
  2. Docker Engine이 3305Port 요청을 받는다.
  3. 설정에 따라 Docker Engine이 3305Port 요청을 MySQL의 포트인 3306Port로 전달해줌으로서 동작하게 된다.

DB 연결 방법

Docker 설치

도커를 실행시키기 위해서는 실행환경에 Docker가 설치되어있어야 한다.

Window의 경우 WSL이라는 Windows 운영체제에서 경량화된 가상화 기술을 사용하여 Linux 운영 체제를 구동할 수 있도록 해 주는 프로그램을 깐 후, DockerDesktop을 설치하면 된다.

아래 잘 정리된 설치 관련 블로그 글이다.

WSL 설치

WSL2 사용 설정(윈도우에서 Ubuntu 사용하는 방법)

Docker Desktop 설치

[Docker] 윈도우 도커 설치방법(window 11)

실행

Docker 설치를 마쳤으면 이제 Docker Container을 실행시킬 수 있다.

스크린샷 2023-10-28 151421

docker-compose.yml 파일에서 빨간상자로 표시된 실행버튼을 클릭하면 자동으로 MySQL 컨테이너를 생성하여 동작시킨다.

그렇게 되면 3305 포트로 연결되는 MySQL 서버가 동작하여 SpringBoot와 연결되어 동작하게 된다.

  • 필요한 파일 리스트
  1. MySQL의 DockerFile
  2. MySQL 초기설정을 위한 init.sql
  3. MySQL 컨테이너 실행을 위한 docker-compose.yml 파일

DockerFile

  • docker_database라는 폴더안에 MySQL 도커 이미지 설정에 대한 파일들을 담아 두었다.
    그 중 하나인 DockerFile 이다.
FROM mysql:latest

MAINTAINER team_five

COPY init.sql /docker-entrypoint-initdb.d

ENV MYSQL_ROOT_PASSWORD=root

VOLUME /mysql_data

EXPOSE 3306

init.sql

  • docker_database 폴더 안에 있는 MySQL 초기설정을 위한 init.sql 파일이다.
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
flush privileges;

create database if not exists trip_record;

use trip_record;

docker-compose.yml

  • MySQL 컨테이너 실행을 위한 docker-compose.yml 파일이다.
    앞서 작성한 이미지, 초기 설정 파일들을 기반으로 생성된 이미지를 컨테이너화 해서 동작시킨다.
version: '3'
services:
  mysql-server:
    container_name: trip-mysql-server
    build:
      context: ./docker_database
      dockerfile: Dockerfile
    ports:
      - "3305:3306"

해당 파일을 실행시킴으로서 독립적인 MySQL 서버가 생성되며 연결이 되어 프로젝트를 테스트해볼 수 있다.

📷 Screenshot

1. 여행 전체 조회

  • 요청

  • 응답



2. 여행 단건 조회

2-1. Pathvariable

  • 요청

  • 응답

2-2. QueryParam

  • 요청

  • 응답

3. 여행 등록

  • 요청

  • 응답

4. 여행 정보 일부 수정

  • 요청

  • 응답

5. 여행 정보 전체 수정

  • 요청

  • 응답

6. 여정 등록

  • 요청

  • 응답

7. 여정 정보 수정

7-1. 숙박정보

  • 요청

  • 응답

7-2. 이동정보

  • 요청

  • 응답

7-3. 방문정보

  • 요청

  • 응답

profile
끈기있게 성장하는 개발자

0개의 댓글