Skip to content

💻 기술스택

김민형 edited this page Dec 10, 2022 · 2 revisions

⚒ 기술 스택

Common

Nginx

  • 리버스 프록시 설정을 통해 사용자가 내부 서버에 접근하지 못하도록 막아서 보안을 향상 시킬 수 있다고 생각했습니다.
  • 내부적으로 서버를 확장시킬 때 트래픽 분산에 용이하다고 판단했습니다.

PM2

  • 싱글 스레드로 동작하는 Node.js 기반 프론트엔드 서버와 백엔드 서버를 쉽게 클러스터링할 수 있다는 장점이 있습니다.
  • 클러스터 모드와 설정을 통해서 서비스를 PM2만으로 무중단 배포할 수 있어서 선택하게 되었습니다.

GitHub Action

  • 매주 데모 시연과 사용자 피드백을 받기 위해서 빈번한 배포가 일어날 것으로 예상했습니다. 이 과정에서 수동 배포는 많은 리소스가 필요하기 때문에 이 과정을 자동화할 방법을 찾게 되었습니다.
  • GitHub에 친화적이라 추가적인 설정 작업 없이 GitHub 내부에서 CI/CD를 수행할 수 있다고 판단했습니다.

Frontend

Next.js

  • 블로그 서비스이다보니 유저가 작성한 글들이 검색 엔진에 최적화되어야 한다고 생각했고, SEO를 위한 SSR를 쉽게 할 수 있는 Next.js를 선택하게 되었습니다.
  • 리액트 프레임워크이므로 러닝커브가 높지 않다고 생각했습니다.
  • 프레임워크기 때문에 코드 스타일을 맞추는데 드는 시간을 절약할 수 있고, 코드의 유지보수가 편합니다.

Recoil

  • 리액트에서 Hook을 사용하는 것과 비슷하기 때문에 러닝커브가 낮습니다.
  • Context API를 사용할 경우, 상태가 변화하면서 불필요한 렌더링이 일어나는 것을 관리하기가 까다롭다고 판단했습니다.

Styled-components

  • 컴포넌트 단위로 스타일링할 수 있어 스타일끼리 충돌이 일어날 우려가 적습니다.
  • Next.js에 의해 미리 렌더링된 HTML 파일에 스타일을 적용하는 과정이 Emotion보다 까다롭지만, 직접 진행하면서 학습해보기 좋다고 생각했습니다.

Backend

Express

  • NestJS와 같은 프레임워크를 사용하는데 러닝 커브가 높다고 생각했습니다.
  • Express에서 초기 구조만 잘 설계해놓으면 저희 서비스를 구현하는데 큰 문제가 없다고 생각했습니다.

MySQL

  • 저희 서비스에서는 사용자가 여러 책을 가지고, 책 속에 여러 글이 들어가는 구조를 가지고 있기 때문에 테이블 간의 관계를 만들 수 있는 SQL을 사용하는 것이 적절하다고 판단했습니다.
  • 이 뿐만 아니라 다른 사용자가 작성한 글을 스크랩하는 기능을 제공하기 때문에 조인 테이블을 통해서 스크랩 글을 관리하는 것이 효율적으로 데이터를 다루는 것이라고 생각했습니다.

Prisma

  • ORM을 사용하게 되면 테이블 간의 관계를 객체로 매핑해놓고, 이를 여러 비지니스 코드에서 재사용할 수 있다고 생각했습니다.
  • Prisma의 문서화가 잘 되어있고, 관련된 커뮤니티가 활성화 되어있기 때문에 이용하는데 큰 어려움이 없을 것이라고 생각했습니다.



NEXT.js 사용여부?

  • Pros

    • 프레임워크기 떄문에 코드 통일성이 생긴다
      • 스타일링, 컴포넌트 틀 자체를 잡아주는 것 뿐 간소화는 아닐 것 같음
    • SEO가 잘 된다!!
    • SSR의 기능
      • 마크업된 html을 뿌려줌 → 초기 렌더링 기달리는 CSR보다 나을 것 같음
    • 새로운 기술 스택을 탐방해보고 싶음
  • 어떻게 하면 이 기술스택을 사용한 것의 장점을 보여줄 수 있을지?

    • 왜 썼는지와 어떻게 동작했는지를 설명할 수 있음
    • openGraph를 활용해서 우리 사이트의 글이 검색되는 모습을 보여줄 수 있을 것 같음
    • CSR과 SSR의 장점을 같이 할 수 있음
    • 우리가 반드시 수치적으로 증명할 필요는 없지 않을까 다만 관련된 레포를 링크할 수 있을 것 같음
  • ❌Cons

    • 러닝 커브가 있을 수 있다
      • 근데 리액트 기반 프레임워크다 보니 그렇게 크지는 않을 것 같다
      • 만약에 혹시 러닝 커브가 좀 크다면 프로젝트의 이유에 대해서 생각해봐야 할 것 같음
      • 프로젝트의 이유는 역량을 보여줘야 하는 것!!
      • 우리가 8주가 익숙해했던 기능이나 스택들에 좀 더 신경쓰고 다듬어서 기본기를 충실하게 잘하고 있는 것을 보여주는 것이 필요하지 않을까
      • 리액트 기반이다 보니까 큰 문제는 없을 것 같음

상태관리 어떻게 할지?

CSS 방식

SCSS

CSS in JS

React-query..???

솔직히 봐도 이해 안 됨….

멘토님께 여쭤보기…ㅠ

걱정 포인트 하나는 SSR과의 궁합이 높아서 성능 향상에 크리티컬한지 여부

Nest.js …BYE

  • 장점

    • 문서화가 아주 잘 되어있음
    • Nest의 탄생 자체가 구조화가 안 되어있는 것에 대한 불만에서 나온 거라서 Layer 구조가 명확하게 짜져 있음
    • 프레임워크로서의 장점
  • 단점

    • 모듈의 의존성을 주입해서 써야 하는데 안전하지만 귀찮기는 함
    • 처음에는 좀 헷갈릴 수 있음 annotation
    • 플젝 내부에서 백엔드가 가지는 비중도 좀 낮다고 생각
    • 현재 공부해야 할 리소스가 많다보니까 추가적으로 더 배우는데 시간이 날까…?의 고민

DB

SQL + NoSQL

  • 책에 글이 어떻게 담길지에 대해서 논의가 필요하지 않을까?
  • 프로젝트에서 논의된 내용을 기준으로는 SQL이 적합할 것 같음
  • 상위 개념이 너무 많음
    • 블럭 → 글 → 책 이 관계가 너무 깊음
    • 이 관계가 단일하다면 NoSQL일 수 있는데 요 글을 누군가 가져갈 수 있다가 키포인트인 것 같음
    • 관계가 많은 상황에서는 좋지 않은 것 같음
    • 누군가 글을 가져갔을 때 복사를 해서 저장을 하면 관계가 생기지는 않지만 글이 업데이트 됐을 때 그 글을 가져간 책들을 다 업데이트해줘야하는 것이다보니 SQL이 적합할 것 같음
    • 유니크한 한 데이터가 수정되면 걔를 계속 불러오는 개념이니까
    • 해결해야 할 하나의 문제 → 블럭을 어떻게
    • 큰 틀로 관계형 DB를 가져가기는 해야 할 것 같음
💡 에디터 관련해서 라이브러리 사용을 할 거긴해서 SQL 방식 자체는 확정이고 그 안에서 데이터 타입만 고려해주는 걸로 ERD 작성할 때

ORM : TypeORM vs Prisma

  • TypeORM

    • 성능적으로 더 뛰어나다 (JOIN)
      • 진짜 성능 개선을 위한 것이라면 Native-Query를 날려야 하는 것으로 알고 있음
  • Prisma

    • 쓰기 편하고 배우기 편하다
    • 리뷰어님의 추천이 떠오른다…..
Clone this wiki locally