HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🧚
[1기]최종 프로젝트 데브코스
/
🗺️
[팀17] 영업이익 17조 💰
/
💌
프로젝트 수행결과 작성
/
프로젝트 수행 결과

프로젝트 수행 결과

notion image
결과 예시
notion image
notion image
notion image
notion image
notion image

프론트

열어주세요 ??

전체 프로젝트 구조

notion image
  • components - base(재사용 가능, 도메인 특성이 담기지 않은) - domain(도메인의 특성이 담긴, ex_네비게이션, base를 확장해서 도메인 특성을 담은 경우)
  • contexts - user, navigation, post, weather
  • hooks
  • pages
  • routes - PrivateRoute, PreventedRoute
  • styles - theme, reset, font
  • utils - api 통신 관련, 상수, 함수
  • styled component 작성 규칙
    • style.js 파일로 분리하기
    • Card 폴더 - index.tsx
      • - style.js

상태 관리(context api)

  • 서비스 규모가 크지 않기 때문에 recoil, redux등의 외부 라이브러리의 사용은 자제하기로 하였다.
  • 따라서 react 라이브러리에 내장되어있는 context Api를 사용하기로 합의를 하였다.
  • 또한 전역적으로 꼭 관리가 필요한 상태 혹은 props drilling이 일어나는 경우에서만 context Api를 사용하였다.
  • 따라서 본 서비스에서는 User에 대한 정보만 context에 보관하였다.
notion image

공통 요소 관리

  • axios interceptors의 사용
    • 네트워크 통신을 통해 오는 값의 타입을 알 수 없다.
    • 하지만 모든 api에 대해서는 예외처리를 해주어야 하며, 우리는 우리의 코드가 예측가능하기를 원했다.
    • 따라서 에러 상태에 대한 정의를 interceptor에서 해주었다.
    • 따라서 우리는 우리가 정의한 타입에 맞게 모든 오류를 일차적으로 분류를 할 수 있었다.
    • 다음으로 실제 api를 사용하는 곳에서는 각 페이지별 상황에 맞게 에러 핸들링을 해주었다.
    • <사용하는곳>
    • notion image
    • interceptor에서의 타입
    • notion image
    • 우리는 모든 api에서 인증이 필요하였다. 따라서 모든 header에 Authorization을 넣어주어야 했다.
    • 따라서 이를 막기 위해 interceptor와 instance를 통해 코드의 중복을 최소화하고자 하였다
    • notion image
notion image
 
마지막으로 우리는 네트워크 통신을 통해 받은 데이터(response)에 대한 타입을 지정해주어야 했다.
  • 이를 위해 여러 방법이 있지만 우리는 api를 정의하는 부분에서 Generic으로 지정해주었다.
  • 이렇게 하지 않는다면 사용할 때 마다 as를 통해 타입을 지정해주거나 any타입으로 데이터가 받아지기 떄문에 좋지 않은 방법이라고 생각하였다.
    • 이에 따라 모든 경우에 타입의 추론이 잘 되었고 중복코드 또한 많이 줄었다고 생각한다.
notion image
 
notion image
 
  • ThemeProvider로 공통 스타일 정의
    • 프로젝트의 전체적인 스타일을 맞추기 위하여 글자 색상, 글자 크기, 요소 사이의 간격 등을 ThemeProvider에 미리 정의하여 추후에 변경사항 발생시 유지 보수가 쉽도록 하였습니다.

빌드

  • 서비스를 개발하면서 빌드에 신경을 쓰지 말고 개발에 집중하기로 하였다.
  • 그러기 위해는 빌드프로세스에 대한 자동화가 필요했다.
  • Jenkins, circleCi 등 다양한 도구가 존재하였지만, 우리는 github Actions를 사용하고자 하였다. 그 이유로는
    • 형상관리도구로 git과 github을 활용하였다.
      • 따라서 다른 도구들은 별도의 계정이 필요하지만 github Actions을 활용한다면 별도의 계정이 필요하지 않았다.
    • 우리는 main 브랜치에 push가 올라갈 때만 build 자동화를 하면 된다.
      • 즉 모든 프로세스에서 ci/cd가 필요한것이 아니었기 때문에 workflow를 통해 간단하게 사용할 수 있는 github Actions를 사용하기로 하였다.
  • test와 main develop의 분리
    • 개발을 하면서 반드시 지속적인 테스트가 필요하다.
    • 하지만 실제로 사람들이 사용하는 서비스에서 직접적인 테스트 코드를 올린다는것은 치명적인 에러를 유발시킬 뿐만 아니라 사용자의 경험 또한 떨어트린다고 생각하였다.
    • 따라서 코드에 대한 기기별 대응을 직접 확인하고 싶다면, test branch에 push를 하도록 하였다.
    • 즉, 우리는 test endpoint와 develop endpoint 두개를 통해 지속적인 기기별 테스트를 진행하며 테스트가 다 완료되고 난 후 main branch에 push를 하였다.
    • main endpoint - https://d3hatotnvqhqmx.cloudfront.net/
    • test endpoint - https://d2jeyu0p1z8lkj.cloudfront.net/login
 
notion image
 
 

문서화

  • 깃헙 위키
    • 깃헙 위키에 프로젝트를 진행하면서 했던 고민과 마주했던 문제 기록
      • notion image

서비스 화면별 주요기능(내일 저녁에 캡쳐해서 화면 이미지 붙일 예정)

  • 라우터 설정(유저의 로그인 상태에 따라 페이지 접근 가능 여부를 관리)
    • 로그인 유저(회원) 접근 가능 페이지
      • 홈
      • 게시물 열람
      • 게시물 엿보기
      • 게시물 작성
      • 마이페이지
    • 로그인 하지 않은 유저(비회원) 접근 가능 페이지
      • 로그인
      • 유저 인증
  • 로그인
    • 유저의 개인정보 관리에 드는 비용을 줄이기 위하여 로그인은 카카오 로그인 api활용
  • 홈
    • 지도 api는 react-map-gl을 이용하여 구현
    • geolocate를 사용하여 유저의 현재 위치에 맞는 지도가 뜨도록 구현
    • 서버에서 유저가 열람 권한이 있는 게시물을 받아와서 게시물에 저장된 위치 정보에 따라 지도 위에 마커가 표시되도록 구현
    • 게시물의 열람 가능여부에 따라 마커의 색상을 다르게 구현
    • 유저가 처음 홈 화면에 접속 시 오늘 열람 가능한 게시물이 있다면 알림을 띄워 해당 게시물로 이동할지 여부를 확인함, 유저의 승인시 해당 게시물의 엿보기 페이지로 이동하도록 구현
  • 엿보기
    • 유저가 마커를 클릭하면 해당 게시물의 간략한 정보를 보여주도록 구현
    • 게시물의 열람 가능 여부, 권한에 따라 버튼 변경
  • 게시물 생성
    • react-map-gl, geolocate를 사용하여 유저가 원하는 위치에 게시물을 생성하도록 구현
    • 로컬스토리지를 활용하여 유저가 게시물 생성중에 이탈하더라도 작성중인 데이터가 날라가지 않도록 구현
    • 유저를 검색해서 해당 게시물에 열람 권한을 부여하도록 구현
  • 게시물 열람
    • 작성자가 지정한 날짜가 되면 게시물을 볼 수 있도록 구현
    • 최초 개봉자의 경우 로띠를 활용한 효과 구현
  • 마이페이지
    • 내 게시물과 공유받은 게시물을 나눠서 볼 수 있도록 구현
    • 게시물을 열린 것과 닫힌 것을 나눠서 볼 수 있도록 구현
 

백엔드

숨기기
  • ERD
    • ERD 사진
      notion image
      Post(필름)은 크게 미리보기, 자세한내용 두가지로 나누어져서 다뤄진다. 즉 미리보기 단위, 자세한내용단위로 조회를 하는 경우가 대부분이라고 판단하였다.
      따라서 Posts 테이블에서 미리보기 정보와 자세한내용 정보를 연결된 테이블 형태로 나누게 되었다.
      posts에 미리보기 정보가 저장되어 있으며 post_details 에 자세한 내용 이 저장되어 있다.
      post_details 는 posts 의 pk를 fk이자 pk로 갖고있게 된다. (일대일 관계)
      테이블을 정규화, 역정규화 하는 과정도 중요하지만 이렇게 테이블을 나눠서 관리할때의 장점이 분명 존재할 것이라고 판단하였다.
      posts의 상태 (열림,닫힘,열릴수 있음 등)을 ENUM타입으로 정의하고 테이블에 String형식으로 저장되게 만드려고 하였으나
      state라는 테이블을 두어 기능확장에 유리할 수 있도록 하였다.
  • API RestDocs
    • RestDocs 캡쳐 화면
  • 멀티 모듈 및 디렉토리 구조
    • film-api
      • 사용자 서버 어플리케이션 모듈
    • film-common
      • 전반 프로젝트 모듈들에서 공통적으로 사용되는 모듈(예외처리)
    • film-domain
      • 도메인 모듈(Domain, Repository)
    • film-external
      • 외부 통신 담당 모듈(AWS S3)
      이미지 숨기기
      notion image
      멀티 모듈을 사용하는 이유가 들어가면 좋을듯
  • 동작 환경 분리
    • 개발을 하면서 개발의 편의를 위해 동작 환경을 구분지어 yml 파일을 통해 관리를 했다.
    • 각 환경별 동작이 달라져야하기 때문에 쉽게 적용되도록 했다.
    • 각자 개발 컴퓨터를 이용한 환경은 local profile 로 명명했다.
    • 개발 서버(테스트 서버)에 올라가는 버전은 dev profile 로 명명했다.
    • 배포 서버(정식 서버)에 올라가는 버전은 prod profile 로 명명했다.
  • CI/CD
    • 처음엔 Jenkins 를 사용하려 했지만 배포 환경의 제약사항(EC2 메모리 1GB)으로 인해 다른 도구를 골라야했다.
    • 형상관리 툴로 Github를 이용했기 때문에 접근성도 좋고 간편한 Github Action을 사용했다.
    • 이미지 숨기기
      notion image
      notion image
  • 주요 기능
    • 로그인 기능
      • Kakao Oauth2 기술 활용
        • Jwt 토큰으로 Access 토큰 생성
      • Interceptor 활용
        • controller 단에서 @UserId annotation을 사용하면 토큰에 있는 userId 정보를 가져오기 위해 HandlerMethodArgumentResolver를 구현하여 사용
      • Jwt 토큰을 인증하기 위한 커스텀 필터 생성
    • 게시물(필름) 기능
      • 시간 정보 활용
        • spring scheduler를 이용하여 열람 가능시간에 맞게 게시물 확인 가능 상태로 변경
      • 이미지 저장 기능
        • AWS S3에 이미지를 저장
    • 마이페이지 기능
    • 예외 처리
      • @RestControllerAdvice를 활용하여 global하게 예외를 처리함
      • jwt 인증 관련 필터에서 발생하는 예외는 AuthenticationEntryPoint를 커스텀하여 처리함
  • 협력도구
    • github project
      • 이미지 숨기기
        notion image
        각자 맡은 업무의 내용과 진행상태를 한눈에 파악할 수 있도록 Github Projects 기능을 사용했다.
    • 노션
      • 이미지 숨기기
        notion image
        notion image
        노션의 캘린더 기능을 이용해 백엔드 파트의 개발 스케줄을 관리했다.
        회의록 작성, 설계문서 작성, 개발하며 사용했던 기술들 등의 문서들을 정리했다.