[패스트캠퍼스 X 야놀자: 백엔드 개발 부트캠프] 미니 프로젝트 후기

정의정·2023년 12월 18일
0

FC

목록 보기
6/6
post-thumbnail

나는 2023. 07. 10 ~ 2024. 01. 30 기간동안 내일배움카드로 수강하는 국비지원교육 중 K-digital training(패스트캠퍼스 X 야놀자: 백엔드 개발 부트캠프 4기)에 참여하고 있다.

💡 미니 프로젝트

지난 11. 20 ~ 12. 15 미니 프로젝트를 진행했다.
이번 미니 프로젝트를 어떻게 진행했고, 어떤 어려움이 있었는지 후기를 남겨보려고 한다.

🌟 미니 프로젝트

이번 토이 프로젝트는 숙박 정보 조회/검색 및 숙박 예약 시스템를 개발하는 프로젝트였다. FE 5명과 BE 3명이서 진행했다.

요구사항 분석🧐

  • 회원 가입 기능
  • 회원 로그인 기능
  • 전체 상품 목록 조회
  • 개별 상품 조회
  • 상품 옵션 선택
  • 장바구니 담기
  • 장바구니 보기
  • 주문하기
  • 결제하기
  • 주문 결과 확인
  • 주문 내역 확인

기능 명세서 작성✏️

RFP를 참고하여 논의를 통해 기능 명세서를 작성했다.

API 설계와 역할 분담👥

API 설계

역할 분담

DB 설계 (ERD)💾

패키지 구조 설계📁

DDD(Domain Drivn Design)과 MVC구조를 살려 패키지를 설계했다.

shimpyo_be
├── domain
│   ├── cart
│   │   ├── controller
│   │   ├── dto
│   │   │   ├── request
│   │   │   └── response
│   │   ├── entity
│   │   ├── exception
│   │   ├── repository
│   │   ├── service
│   │   └── util
│   ├── favorite
│   │   ├── controller
│   │   ├── dto
│   │   ├── entity
│   │   ├── exception
│   │   ├── repository
│   │   └── service
│   ├── member
│   │   ├── controller
│   │   ├── dto
│   │   │   ├── request
│   │   │   └── response
│   │   ├── entity
│   │   ├── exception
│   │   ├── repository
│   │   └── service
│   ├── product
│   │   ├── controller
│   │   ├── dto
│   │   │   ├── request
│   │   │   └── response
│   │   ├── entity
│   │   ├── exception
│   │   ├── repository
│   │   ├── service
│   │   └── util
│   │       └── model
│   ├── reservation
│   │   ├── constant
│   │   ├── controller
│   │   ├── dto
│   │   │   ├── request
│   │   │   └── response
│   │   ├── entity
│   │   ├── exception
│   │   ├── facade
│   │   ├── repository
│   │   ├── service
│   │   └── util
│   │       └── mapper
│   ├── reservationproduct
│   │   ├── constant
│   │   ├── controller
│   │   ├── dto
│   │   │   ├── request
│   │   │   └── response
│   │   ├── entity
│   │   ├── exception
│   │   ├── repository
│   │   └── service
│   ├── room
│   │   ├── constant
│   │   ├── controller
│   │   ├── dto
│   │   │   └── response
│   │   ├── entity
│   │   ├── exception
│   │   ├── repository
│   │   ├── service
│   │   └── util
│   └── star
│       ├── constant
│       ├── controller
│       ├── dto
│       │   ├── request
│       │   └── response
│       ├── entity
│       ├── exception
│       ├── repository
│       └── service
└── global
         ├── common
         ├── config
         │   └── jwt
         ├── exception
         └── util

CI/CD🛠️

CI

CD

아키텍처📰

API 문서(Spring REST Docs)📜

API는 Spring REST Docs를 도입하여 문서화 했다.

회원 API Docs
숙소 API Docs
객실 API Docs
장바구니 API Docs
예약 API Docs
숙소 예약 API Docs
별점 API Docs
즐겨찾기 API Docs

잘한 점👍

프로젝트를 진행하며 잘했고, 앞으로도 적용할 부분을 정리해봤다.

  1. Git Flow 브랜치 전략을 사용하여, 효과적으로 브랜치를 운용할 수 있었다.
  2. GitHub Action을 통한 CI 도입으로, develop 브랜치를 안정적으로 유지할 수 있었다.
  3. Spring REST Docs를 도입하여, API를 문서화했다. 테스트 코드 기반이기 때문에 실제 API 설계에 맞게 구현되었는지, 잘 작동하는지 확인할 수 있어 좋았던 것 같다.
  4. 회의 시간과 회의 안건, 개발 일정을 미리 계획하여, 효과적으로 회의를 진행할 수 있었다.
    오전 10시, 오후 5시에 매일 Daliy Scrum을 진행하여 현재 프로젝트 진행 상황을 파악하고 효과적으로 일 단위 task를 수행할 수 있었다. 이후 더 회의가 필요한 경우에만 추가적인 회의를 진행했다. 이를 통해 개발할 시간을 좀 더 확보할 수 있었다.
  5. 적극적인 코드 리뷰를 통해 더 나은 코드 작성법에 대해 생각할 수 있었고, 팀원 간 코드를 분석하고 배울 수 있었습니다.
  6. GitHub와 Discord를 웹훅을 통해 연결하여 PR, ISSUE 등 알림 기능을 구현하여 빠른 피드백이 가능했습니다.

주요 에러 해결📌

< Spring REST Docs snippet 에러 >

Spring REST Docs 으로 API를 문서화 하기 위해 asciidoc을 사용했다.

그런데 테스트 코드를 작성하고 빌드를 수행하면 만들어지는 html을 확인해보니, snippets 파일을 찾지 못 하는 버그가 발견되었다.

1127, 2023 7:22:00 오후 uri:classloader:/gems/asciidoctor-2.0.10/lib/asciidoctor/reader.rb preprocess_include_directive
SEVERE: member-api.adoc: line 15: include file not found: C:/Users/jeong/Desktop/FC/Shimpyo_BE/{snippets}/auth-rest-controller-docs-test/sign-up/http-request.adoc
include file not found: C:/Users/jeong/Desktop/FC/Shimpyo_BE/{snippets}/auth-rest-controller-docs-test/sign-up/http-request.adoc :: member-api.adoc :: C:/Users/jeong/Desktop/FC/Shimpyo_BE/C:/Users/jeong/Desktop/FC/Shimpyo_BE/src/docs/asciidoc/member/member-api.adoc:15 (uri:classloader:/gems/asciidoctor-2.0.10/lib/asciidoctor/reader.rb:preprocess_include_directive)

< 에러 해결 >

snippets 경로를 index.adoc 파일이 아니라 member-api.adoc 파일에서 지정해보니, 정상적으로 작동하는 것을 확인할 수 있었다.

ifndef::snippets[]
:snippets: build/generated-snippets
endif::[]

= Member REST API Docs
:doctype: book
:icons: font
:source-highlighter: highlightjs
:toc: left
:toclevels: 2

~~ 생략 ~~

< Open API Service Key 에러 >

Open API 에서 숙박 상품 조회를 하기 위해 요청을 보냈는데, 다음과 같은 응답을 받았다.

<OpenAPI_ServiceResponse>
  <cmmMsgHeader>
    <errMsg>SEVICE ERROR</errMsg>
    <returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg>
    <returnReasonCode>30</returnReasonCode>
  </cmmMsgHeader>
</OpenAPI_ServiceResponse>

Service Key가 등록되지 않았다는 에러 응답이었다.

디코딩 서비스 키를 사용해보기도 하고 인코딩 서비스키를 사용해보기도 했으나 여전히 같은 응답이 돌아왔다.

< 에러 해결 >

Service 키를 먼저 인코딩 한 후 Uri 빌드 시 true 옵션을 부여하여 해결했다.

// ~~ 생략 ~~
private String makeBaseSearchUrl() {
    String STAY_SEARCH_URI = "/searchStay1";
    return BASE_URL + STAY_SEARCH_URI +
        "?serviceKey=" + URLEncoder.encode(SERVICE_KEY, StandardCharsets.UTF_8) +
        DEFAULT_QUERY_PARAMS;
}
// ~~생략~~
private JSONObject getAccommodation(int pageSize, int pageNum) throws JSONException {
    URI uri = UriComponentsBuilder.fromHttpUrl(makeBaseSearchUrl())
        .queryParam("pageNo", pageNum)
        .queryParam("numOfRows", pageSize)
        .build(true).toUri();
    ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET,
        httpEntity, String.class);
    log.info("숙박 정보 조회");
    return new JSONObject(response.getBody())
        .getJSONObject("response")
        .getJSONObject("body");
}
// ~~ 생략 ~~

< 상수화 Wrapper Type 에러 >

상수 조건 값을 Wrapper Type으로 선언해 빌드시 롬복 자체 식별이 안되는 에러가 발생했다.

< 에러 해결 >

유효성 검증 값의 경우 원시 타입으로 선언되어 있어 원시 타입으로 변경하여 해결했다.

🎀 느낀 점

본 프로젝트에서 BE 팀장으로서 참여하였는데, 전체적인 프로젝트 총괄을 맡으면서 각 팀간 소통과 회의 진행에 있어서 어려움을 느꼈습니다.
FE와의 협업을 위한 기본적인 지식을 겸비해야겠다는 생각이 들었습니다.

이번 협업 경험을 통해 다른 분야와의 소통 방식에 대해 고민하고, 원활한 소통을 위해 서로의 이해와 배려가 중요하다는 것을 다시 한 번 느낄 수 있었습니다.

profile
배움 기록

0개의 댓글