Skip to content

Latest commit

 

History

History
49 lines (28 loc) · 3.84 KB

231004.md

File metadata and controls

49 lines (28 loc) · 3.84 KB

노션

https://www.notion.so/blog/data-model-behind-notion

노션에서 각 컨텐츠는 블록 단위로 구성된다. 텍스트 블록, 이미지 블록... 이런 식으로.

블록은 다음 속성을 가진다.

  • id (uuid로 생성)
  • properties
    • title : 블록에 들어가는 내용
    • 그 외 특정 블록의 프로퍼티 (가령 체크박스의 경우 checked)

기본적으로 content에 블록 id를 list 형태로 관리한다. 그리고 각 블록은 포인터로 다른 블록을 가리킬 수 있다. 즉 하나의 문서는 트리 구조의 블록을 가진다.

Deploy 방식에 따른 효율성 비교

현재 워크플로우에서는 github action의 가상 인스턴스에서 CI를 수행하여, 빌드하고 -> 도커 이미지로 말고 -> 도커 허브에 푸시하고 -> 관련 결과를 슬랙에 전송하는 과정을 거친다.

그리고 CD에서는 ec2 인스턴스에 ssh로 접속하여 도커허브에서 이미지를 받아오고 구동시키는 과정을 거친다.

현재는 빌드만 별도로 테스트할 수 있는 방법이 없어서 on:pull_request로 트리거되는 빌드 워크플로우를 추가해줬다.

하지만 이렇게 하면 빌드가 통과하더라도 다시 on:push 때 다시 빌드가 수행되므로 효율적이지 못하다. 그렇다고 이미지로 말아서 푸시하는 과정을 빌드 과정에 넣어버리면, on:push로 트리거될 때 on:pull_request가 수행 중이라면 CD가 실패하거나, 최신 버전이 아닌 이미지를 받아올 가능성이 존재한다.

일단은 on:push에서도 다시 빌드를 하도록 했지만, 만약 워크플로우 간 종속성을 만들 수 있으면 현재 최신 커밋에 대하여 워크플로우가 트리거되었을 때, 이 워크플로우가 종료된 후에 CD가 진행되도록 디펜던시를 정해줄 수 있으면 꽤 좋을 것이다.

S3 + AWS CodeDeploy vs Docker + SSH 직접 배포

CD에는 다양한 방법이 있다. 현재는 관행적으로 후자를 채택하고 있지만, 조만간 무중단 배포를 위해서 blue-green 방식에 적합한 파이프라인을 알아볼 필요가 있다.

CI/CD는 그 방식이 매우 다양하다. docker로 말지 jar로 그냥 올릴지 선택할 수도 있고 아무튼 많다. 보통 두 가지 방식으로 나뉘는 것 같다.

  1. jar 파일을 S3로 업로드하고, ec2에서 받아서 배포하는 방식
  2. jar 파일을 도커 이미지로 말아서 도커허브로 푸시하고, ec2에서 이미지를 받아서 구동시키는 방식

1번 방식은 CI/CD가 배포되기 전에 사용하던 방식과 유사하다. 기존에는 ec2 인스턴스에 ssh로 접속하여 jar 파일을 직접 올려주고, 기존에 구동되던 jar을 종료하고, 새로 다운로드한 jar를 실행시켜줘야 했다. 서버는 1-2분정도 다운타임이 발생할 수밖에 없었다. 때문에 백오피스 서비스의 경우 직원들이 퇴근한 6시 이후에 배포를 진행하는 번거로움이 존재했다.

ec2로 jar를 직접 업로드 후 실행

아무튼 이 방식을 그대로 CI/CD에 적용할 수도 있다. 그냥 기존 방식을 그대로 자동화하는 것이다. 로컬에서하는 것처럼 가상 인스턴스에서 jar을 뽑아내고 ec2로 업로드한 다음에 ssh로 접속해서 기존 jar를 끄고 새로운 jar을 실행시킨다.

jar를 s3 버킷에 업로드하고, ec2는 s3로부터 jar를 다운받아서 실행

여기서 더 발전시킨다면? ec2로 업로드하지 않고, s3로 jar을 업로드한 다음, ec2에서는 s3 버킷으로부터 jar을 받아와서 실행시킬 수 있다. 그렇다면 ec2로 직접 업로드하는 것보다 s3를 거칠 때 장점으로는 무엇이 있을까?

사실 s3를 사용할 때의 장점과 거의 동일하다. 물론 s3를 사용하면서 과금이 발생할 수 있다는 문제가 있지만... 아무튼.