경매야 플랫폼이란 공인중개사, 일반유저 또는 회사에서 부동산 물건을 등록 받아, 경매 또는 매매 방식으로 중개를 해주는 BtoC 서비스를 제공해준다. 경매 방식은 경매 물건과 서명된 입찰 내용 블록체인에 등록하고, 개찰 후 낙찰 결과를 산정하여 유저에게 신뢰있는 경매 서비스를 제공한다.
경매야 온라인 경매 안내
해당 프로젝트에서는 FE 시스템 설계, 개발 및 리드를 담당했다.
개발 기간은 약 2달 반(2021-01-01 ~ 2021.03.15)이 소요 되었다.
2021.03.15부터 현재까지 계속 운영 및 유지보수를 진행 중이다.
회사 보안을 위해 간단하게 기술 하겠다.
BE Server에서는 Rest API, GraphQL의 형태로 데이터를 제공해 주었다. 주로 read 기능은 GraphQL를 사용했고, create, update, delete와 같은 기능은 API 형태로 제공 받았다.
Authenticationd은 로그인시 제공 받은 JWT 토큰을 Redis session storeage에 담아 두고 인증이 필요한 통신에 첨가했다. 이로 인해서 FE Client에서 필요한 통신은 모두 FE Server를 거쳐 가게 설계 했다.
FE Server는 기본적으로 SSR을 위한 Next.js를 사용 했다. Next.js에서는 Express나 Nest 같은 BE 프래임워크를 사용 해서 Custom Server 기능을 지원 해준다. 나는 익숙하고 커뮤니티가 활발한 Express를 선택해 사용 했다. Custom Server를 사용 하지 않아도 FE Server를 구현 할 수 있지만, 조금 더 구조화 시키기 위해 사용 하지 않았다.
참고 : https://nextjs.org/docs/advanced-features/custom-server
server의 폴더 구조는 크게 middleware, plugin, router.api, router.page로 구분해서 사용 했다.(BE와는 다르게 FE는 변경 사항이 많고 end-point가 많아 라우터 설계가 어려웠지만 아래와 같이 작성 하니 변동 성에 강했다.)
server
├─ middleware
│ └─ example
├─ plugin
│ └─ example
│ └─ index.ts
├─ routers
│ ├─ api
│ │ ├─ api.router.ts
│ │ └─ user
│ │ ├─ account
│ │ │ ├─ account.router.ts
│ │ │ └─ controller
│ │ │ ├─ getLogout.ts
│ │ ├─ index.ts
│ │ │ └─ postSignin.ts
│ │ └─ user.router.ts
│ ├─ index.ts
│ └─ pages
│ └─ user
│ ├─ account
│ │ ├─ account.router.ts
│ │ └─ controller
│ │ ├─ index.ts
│ │ └─ signin.ts
│ └─ user.router.ts
└─ server.ts
이전 프로젝트인 경매야 사전 가입 서비스에서는 컴포넌트 관리를 component라는 단 하나의 폴더안에 쑤셔 박아 사용 했었다. 다행이도 사전 가입 서비스는 작은 규모의 프로젝트 였기 때문에 감당이 가능 했지만, 이번 프로젝트에서는 큰 규모의 서비스이기에 대안이 필요 했다. 여러 아키텍쳐를 검색 중 컴포넌트의 재 사용성을 강조하는 아토믹 디자인을 채택 했다. 아래와 같은 구조로 구성 했다. (pages, templetes, organisms, molecules, atoms)
src
├─ pages
│ ├─ 404.tsx
│ ├─ user
│ │ └─ account
│ │ └─ signup.tsx
│ ├─ _app.tsx
│ ├─ _document.tsx
│ └─ _error.tsx
├─ styles
│ ├─ globals.scss
│ ├─ index.scss
│ ├─ SpoqaHanSans-kr.scss
│ └─ _variables.scss
├─ templates
│ ├─ styles
│ │ └─ user
│ │ └─ account
│ │ └─ signup.scss
│ ├─ user
│ │ ├─ account
│ │ └─ signup.tsx
│ └─ _error.tsx
├─ ui
│ ├─ atoms
│ │ └─ input
│ │ ├─ InputCheckbox.tsx
│ │ └─ styles
│ │ └─ InputCheckbox.scss
│ ├─ molecules
│ │ └─ card
│ │ ├─ AuctionMiscarriageCard.tsx
│ │ └─ styles
│ │ └─ AuctionMiscarriageCard.scss
│ └─ organisms
│ ├─ carousel
│ ├─ AuctionItemsCarousel.tsx
│ └─ styles
│ └─ AuctionItemsCarousel.scss
└─ utils
├─ lib
└─ redux
├─ actions
├─ reducers
└─ store.ts
경매야에는 파일을 정적이 아닌 동적으로 관리해야 하는 포인트가 있다. 예를 들면 배너 이미지, 물건 관련 이미지 또는 파일들이 있다. 개발 초기 설계 단계에서 "파일 관리 서버가 필요하다." 라는 의견을 내었지만 한정 되어 있는 개발 기간과 인력으로 포기 후 파일 시스템 구조로 개발 하게 되었다. (아래와 같은 구조이다.)
이와 같은 구조는 개발과 론칭 이후에 치명적인 이슈를 남기게 되었는데....😥 파일이 프로젝트 내에서 관리가 되어 깃허브에 같이 푸쉬 된다는 점, 배너를 바꾸기 위해서는 서버를 재 배포를 해야 하는 상황이 생긴다는 점이 있었다. 이러한 문제점을 해결 하기 위해서 AWS S3를 사용 하게 되었는데 이에 관련한 이야기는 여기에서 확인 할 수 있다.
file
├─ auction
├─ thumbnail
│ └─ image.jpg
└─ images
└─ image1.jpg
└─ image2.jpg
서비스 론칭이 1주 전쯤에 발생 했던 오류였다. 분명 이전에는 괜찮았는데 로컬에서는 빌드가 정상적으로 되었지만 AWS EC2에서는 알 수 없는 이유로 빌드가 되지 않았다. 결국 론칭 날까지 해결을 못했고 개발 모드로 실행 시킬 수 밖에 없었다. 사건은 론칭 1주 후인 부동산 페어에서 터졌다. 개발자 모드로 돌리는 서버는 일 평균 200 ~300 명 정도의 접속도 감당하지 못했다. 이런 일이 있고 나서 성능이 높은 EC2로 바꿔, 빌드 배포를 했을 때는 거짓말 처럼 잘 되었다. 아직 까지 그 이유는 모르겠다....😂
서비스 개발과 론칭 이후 까지 변경 요청이 가장 많이 들어온 페이지는 아마 메인 페이지 였을 거다. 초기 개발 단계에는 기획 단계에 나온 디자인으로 나름의 최적화를 해서 개발을 했는데, 이는 중간에 디자인 변경 요청이 들어온 후 오히려 발목을 잡게 되었다. 이후 메인페이지는 디자인이 조금씩 여러번 바뀌었는데, 이러한 변경 요청은 개발 기간을 늘어지게 하는 요인 중 하나였다. 물론, 개발자는 경영진과 유저의 친화적으로 개발해야 한다고 생각을 해기 때문에 이해 할 수 있었다. 이러한 고질 적인 문제를 해결하기 위해서는 초기 개발 단계에 최적화를 하지 않고 코드를 작성 하는게 아닐까 생각 했다. (미래는 고려 하지만 과하게 생각하지는 말자!! 😮)
경매야 : https://www.auctionok.co.kr
처음으로 큰 규모의 프로젝트를 초기 설계 단계부터 론칭을 거처 유지 보수까지 할 수 있는 기회가 되었다. FE 개발의 큰 싸이클을 경험 했는데 역시 쉽지 않았다. 문제점도 많았고 위기도 많았지만 팀원들과 같이 해결하면 정말 값진 경험이었던 것 같다.