본문 바로가기

분류 전체보기

(67)
ErrorBoundary로 Toast, ErrorFallback 등 공통적인 에러를 처리해보자 서언 현재 꼭꼭 서비스를 운영하고 있습니다. 안정적인 서비스 운영, 보다 나은 유저 경험을 제공하기 위해 (1) 섬세하고, (2) 빈틈 없는 에러 처리가 필수라는 생각이 들었습니다. (1) 섬세하다는 것은 상황에 맞는 에러를 적절히 보여 준다는 것을 의미하고, (2) 빈틈 없다는 것은 모든 API 요청에 에러 케이스를 고려한다는 것을 의미합니다. 그러면 고민이 심화됩니다. (1) 에러를 어떤 기준으로 분류하여 처리할 수 있을까? (2) 모든 요청에 에러를 붙인다면, 반복을 줄일 수 없을까? 이를 고민하여 나름대로 에러를 분류해보았고, ErrorBoundary(에러 경계) 라는 도구를 활용해 선언적이고 추상화된 에러 처리를 시도해보았습니다. 본 글은 에러 처리 전략, ErrorBoundary를 다룹니다. ..
Context API를 활용하여 선언적으로 Toast 띄우기 서언 Context API는 쓰는 사람에 따라서 다양한 방식으로 사용됩니다. 그 이유는 Context API에서 전역적인 상태를 선언할 수 있고, 동시에 컴포넌트도 반환 해줄 수 있기 때문입니다. Context API 사용 예시를 찾아보면, 대부분 상태를 전역적으로 제공하는 역할을 하고, children을 그대로 반환해주는 형태를 많이 볼 수 있습니다. 하지만 컴포넌트를 반환할 수 있다는 특징을 활용하면 Toast, Modal, Loading 같은 UI를 선언적으로 사용할 수 있지 않을까 고민하였습니다. 이번 글은 [꼭꼭 팀]이 Context API를 사용하여 상태를 가진 UI를(Toast) 선언적으로 보여주는 방법에 대해 설명드리고자 합니다. 먼저 명령적인 Toast 사용을 알아보고, 하나씩 개선해나가..
선언병합을 활용하여 CSS in JS의 theme 타입 추론하기 이번 글은 TypeScript와 styled-components나 emotion을 함께 사용할 때, theme의 타입을 추론하는 방법을 다룹니다. 그 방법은 간단하지만, 숨겨진 원리가 있습니다. 방법을 먼저 설명한 후, 원리를 설명하도록 하겠습니다. theme 타입 추론하기 emotion, styled-components를 사용하면 아래와 같이 theme을 선언하고, ThemeProvider에 theme을 props로 넣어줍니다. // index.tsx const theme = { primary_500: '#FF5622', primary_400: '#FF7020', primary_300: '#FF9620', primary_200: '#FFB25B', primary_100: '#FFC17B', }; roo..
컴파일과 폴리필의 차이점 분석 (babel, polyfill) 서언 웹 생태계에서 JavaScript는 브라우저와 뗄 수 없는 관계입니다. JavaScript는 매번 새로운 버전을 출시합니다. 그러면 브라우저는 최신 문법을 이해할 수 없게 됩니다. 만일 브라우저가 빠르게 대응한다고 하더라도, 사용자가 최신 브라우저를 사용할 것이라는 보장이 없습니다. 그러므로 브라우저가 최신 문법을 이해하도록 만들기 위해서 개발자가 노력을 가해야 합니다. 이때 사용할 수 있는 카드가 Compile 입니다. Compile의 중요성은 널리 알려진 것 같습니다. 하지만 Compile만으로 해결할 수 없습니다. Compile 만큼 중요한 것이 Polyfill 입니다. 이 글은 Compile과 Polyfill의 차이점과 그 역할에 초점을 맞춥니다. 컴파일이란? ES6+ 자바스크립트 코드를 E..
AWS EC2와 가비아 도메인 연결하기 [2/2] (with React) React로 만든 웹 사이트를 AWS EC2로 배포하고, 가비아에서 구매한 도메인과 연결하는 방법을 다룹니다. 목차 1. port 없애기 (3000 -> 80) 2. AWS Route53 호스팅 3. 가비아에서 Name Server 연결  1. port 없애기 (3000 -> 80) 현재 인스턴스로 build 했다면 publicIp:3000 이 배포 url일 것입니다. 하지만, Route 대상으로 :3000 같은 port 번호를 쓸 수 없습니다. 그러므로, react app start 를 할 때 80번 또는 443번 port로 build 되게끔 해야 합니다. 80번은 http 기본 port이고 443번은 https 기본 port입니다. 즉, 어떤 http domain에 :80을 붙여서 접근하든, 떼서 ..
AWS EC2 인스턴스로 웹 서버(react) 배포하기 [1/2] react-app(web server)을 배포하기 위하여 vercel이나 netlify와 같은 무료 호스팅 툴을 이용하여 웹 사이트를 배포할 수도 있지만, 트래픽 제한이 있기 때문에 언젠가 AWS 클라우드를 빌려 배포해야할 순간이 올 것입니다. 클라우드 / http 에 대한 정보는 기술하지 않고, 배포 방법에 집중하여 기술하겠습니다. AWS에 문외한인 프론트엔드 개발자를 위해 씁니다. 전체적인 순서는 다음과 같습니다. (1편 - 웹 사이트 배포) 1. AWS 가입 2. 인스턴스 생성 3. 인스턴스에 접근하여 AWS 컴퓨터 로컬 환경 조작 4. build 후 웹 사이트 띄우기 (2편 - Custom 도메인과 연결 - with 가비아) 1. port 없애기 (3000 -> 80) 2. 가비아에서 Name S..
[Git] cherry-pick을 이용하여 commit history 깔끔하게 정리하기 한 레포지터리에서 프론트엔드, 백엔드 폴더를 분리하여 공동 작업을 하고 있었다. 같은 기능을 동시에 개발하고 있어서, 백엔드 코드를 rebase 받아서 local에서 구동해보려고 했다. 그 과정에서 프/백 commit이 합쳐진 상태로 PR을 올리게 되었다. 즉, 1. 내가 작업하지 않은 커밋 또한 PR에 올라갔고, 2. 내가 백엔드 코드를 rebase한 시점 이후에 백엔드 코드가 수정되었을 경우, conflict가 예상되었다. 그러므로, 백엔드 commit history를 제거한 후, PR을 올리고자 했다. 그림으로 표현하면 다음과 같다. 아래처럼, 백엔드 코드가 사이에 끼어있어서, reset 할 수도 없는 상황이다. 위 상황을 아래와 같이 개선하고자 한다. 해결 방법 1. base target bran..
[주간회고] 우아한테크코스 Level2 6주차 - 절망의 계곡 극복하기 내가 정의한 절망의 계곡은, A라는 개념을 모르는데, A를 공부해도, A를 알 수 없는 상태를 말했다. A가 검색해도 나오지 않는다거나, 여러 개념이 얽혀있어서 읽어도 이해할 수 없었다. 크루들과 대화하면서 이를 극복할 수 있었다. 내가 정확히 무엇을 모르는지 메타인지 할 수 있었다. A를 이해하려면 사실 B, C, D를 이해해야 하는데, A만 주구장창 파고든다고 A를 이해할 수 없었던 것이다. B, C, D를 이해했다고 착각했던 것이다. 이에 대하여 다음에 길게 글을 쓰겠다. Plus 월화수목 11시까지, 목요일 10시반까지 공부했다. 가방을 우테코에 두고다녔다. 집갈때에는 공부에 대한 짐을 벗어던질 수 있어, 마음이 편안함 다음날 일찍 가게 됨. 씻고 바로 자게 됨. 근로 회의를 4번이나 했다. 목적..
[주간회고] 우아한테크코스 Level2 5주차 - 절망의 계곡 Plus TypeScript 레벨 업 중.. 느껴진다! 이제 어느정도 잘 쓸 수 있는 것 같다. 크루들 너무 재밌다. 막 친해지는 단계라서 이야기하는 시간이 많아지고 있다 ㅋ.ㅋ 포코와 준과 conversation 140개를 나누었다. 포코가 코드 전반적으로 모두 봐주었다. lint, ts, 클린코드 등 너무 좋은 코멘트를 많이 받았다. 벽이 높아서 절망하기도 했지만... 많이 도움되고 성장할 수 있었다. 이번주는 집와서도 공부했다. 그래서 우테코에서의 시간을 조금 피곤하게 보내지 았나 싶다. 좋은지는 모르겠다. 그냥 아침에 할까 Storybook에 적응했다. 재미도 있고, 매우 유용하다고 느낀다. Minus 절망의 계곡에 빠진 것 같다. 좋은 코드가 무엇인지 어렴풋이 알겠지만, 그것을 구현하는 것은 너..
크루들과 나눈 우아한 대화 #1 (React rendering, commit phase, memo) 크루들과 나눈 우아한 대화 #1 아놀드, 병민, 앨버와 아주 재밌는 대화를 나누었고, 많이 배웠다. 대화의 시작은 이러했다. "Props로 item 정보가 담긴 객체와 아이템을 삭제하는 함수 (deleteItem)을 넘겨준다고 했을 때, useCallback과 memo로 초기화 하는 것이 의미가 있을까?" return ( itemList.map(item => ) ) 이 상황에서 하나의 item이 업데이트 되면, 모든 Item이 리렌더링 될 것이다. 내가 가진 의문은, 연관없는 Item 컴포넌트가 다시 그려질지언정, Item이 같은 것을 그리고 있다면 diff 알고리즘이 바뀌었다고 인식하지 않기 때문에, 리렌더링 하지 않을까? 하는 것이었다. 내가 잘못 알거나 / 얕게 알고있었던 것은 - 렌더링이란 (함수..