
결과 예시





프론트
열어주세요 ??
전체 프로젝트 구조

- 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에 보관하였다.

공통 요소 관리
- axios interceptors의 사용
- 네트워크 통신을 통해 오는 값의 타입을 알 수 없다.
- 하지만 모든 api에 대해서는 예외처리를 해주어야 하며, 우리는 우리의 코드가 예측가능하기를 원했다.
- 따라서 에러 상태에 대한 정의를 interceptor에서 해주었다.
- 따라서 우리는 우리가 정의한 타입에 맞게 모든 오류를 일차적으로 분류를 할 수 있었다.
- 다음으로 실제 api를 사용하는 곳에서는 각 페이지별 상황에 맞게 에러 핸들링을 해주었다.
- <사용하는곳>
- interceptor에서의 타입
- 우리는 모든 api에서 인증이 필요하였다. 따라서 모든 header에 Authorization을 넣어주어야 했다.
- 따라서 이를 막기 위해 interceptor와 instance를 통해 코드의 중복을 최소화하고자 하였다




마지막으로 우리는 네트워크 통신을 통해 받은 데이터(response)에 대한 타입을 지정해주어야 했다.
- 이를 위해 여러 방법이 있지만 우리는 api를 정의하는 부분에서 Generic으로 지정해주었다.
- 이렇게 하지 않는다면 사용할 때 마다 as를 통해 타입을 지정해주거나 any타입으로 데이터가 받아지기 떄문에 좋지 않은 방법이라고 생각하였다.
이에 따라 모든 경우에 타입의 추론이 잘 되었고 중복코드 또한 많이 줄었다고 생각한다.


- 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

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

서비스 화면별 주요기능(내일 저녁에 캡쳐해서 화면 이미지 붙일 예정)
- 라우터 설정(유저의 로그인 상태에 따라 페이지 접근 가능 여부를 관리)
- 로그인 유저(회원) 접근 가능 페이지
- 홈
- 게시물 열람
- 게시물 엿보기
- 게시물 작성
- 마이페이지
- 로그인 하지 않은 유저(비회원) 접근 가능 페이지
- 로그인
- 유저 인증
- 로그인
- 유저의 개인정보 관리에 드는 비용을 줄이기 위하여 로그인은 카카오 로그인 api활용
- 홈
- 지도 api는 react-map-gl을 이용하여 구현
- geolocate를 사용하여 유저의 현재 위치에 맞는 지도가 뜨도록 구현
- 서버에서 유저가 열람 권한이 있는 게시물을 받아와서 게시물에 저장된 위치 정보에 따라 지도 위에 마커가 표시되도록 구현
- 게시물의 열람 가능여부에 따라 마커의 색상을 다르게 구현
- 유저가 처음 홈 화면에 접속 시 오늘 열람 가능한 게시물이 있다면 알림을 띄워 해당 게시물로 이동할지 여부를 확인함, 유저의 승인시 해당 게시물의 엿보기 페이지로 이동하도록 구현
- 엿보기
- 유저가 마커를 클릭하면 해당 게시물의 간략한 정보를 보여주도록 구현
- 게시물의 열람 가능 여부, 권한에 따라 버튼 변경
- 게시물 생성
- react-map-gl, geolocate를 사용하여 유저가 원하는 위치에 게시물을 생성하도록 구현
- 로컬스토리지를 활용하여 유저가 게시물 생성중에 이탈하더라도 작성중인 데이터가 날라가지 않도록 구현
- 유저를 검색해서 해당 게시물에 열람 권한을 부여하도록 구현
- 게시물 열람
- 작성자가 지정한 날짜가 되면 게시물을 볼 수 있도록 구현
- 최초 개봉자의 경우 로띠를 활용한 효과 구현
- 마이페이지
- 내 게시물과 공유받은 게시물을 나눠서 볼 수 있도록 구현
- 게시물을 열린 것과 닫힌 것을 나눠서 볼 수 있도록 구현
백엔드
숨기기
- ERD
ERD 사진
.png?table=block&id=587a7038-4992-4381-a322-dd9f6e5f42fe&cache=v2)
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)
이미지 숨기기

멀티 모듈을 사용하는 이유가 들어가면 좋을듯
- 동작 환경 분리
- 개발을 하면서 개발의 편의를 위해 동작 환경을 구분지어 yml 파일을 통해 관리를 했다.
- 각 환경별 동작이 달라져야하기 때문에 쉽게 적용되도록 했다.
- 각자 개발 컴퓨터를 이용한 환경은 local profile 로 명명했다.
- 개발 서버(테스트 서버)에 올라가는 버전은 dev profile 로 명명했다.
- 배포 서버(정식 서버)에 올라가는 버전은 prod profile 로 명명했다.
- CI/CD
- 처음엔 Jenkins 를 사용하려 했지만 배포 환경의 제약사항(EC2 메모리 1GB)으로 인해 다른 도구를 골라야했다.
- 형상관리 툴로 Github를 이용했기 때문에 접근성도 좋고 간편한 Github Action을 사용했다.
이미지 숨기기


- 주요 기능
- Kakao Oauth2 기술 활용
- Jwt 토큰으로 Access 토큰 생성
- Interceptor 활용
- controller 단에서
@UserId
annotation을 사용하면 토큰에 있는 userId 정보를 가져오기 위해HandlerMethodArgumentResolver
를 구현하여 사용 - Jwt 토큰을 인증하기 위한 커스텀 필터 생성
- 게시물(필름) 기능
- 시간 정보 활용
- spring scheduler를 이용하여 열람 가능시간에 맞게 게시물 확인 가능 상태로 변경
- 이미지 저장 기능
- AWS S3에 이미지를 저장
- 마이페이지 기능
@RestControllerAdvice
를 활용하여 global하게 예외를 처리함- jwt 인증 관련 필터에서 발생하는 예외는
AuthenticationEntryPoint
를 커스텀하여 처리함
로그인 기능
예외 처리
- 협력도구
- github project
- 노션
이미지 숨기기

각자 맡은 업무의 내용과 진행상태를 한눈에 파악할 수 있도록 Github Projects 기능을 사용했다.
이미지 숨기기


노션의 캘린더 기능을 이용해 백엔드 파트의 개발 스케줄을 관리했다.
회의록 작성, 설계문서 작성, 개발하며 사용했던 기술들 등의 문서들을 정리했다.