| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- js
- rn
- react natvie
- rniap
- 정처기 자격
- sharedvalue
- nextJS
- 불변식
- 이펙티브 타입스크립트
- 애그리게이트
- HTML
- ui thread
- in app purchase
- 디프만 #디프만17기 #depromeet
- PR
- 정처기 준비물
- 빌딩 블록
- DDD
- Expo
- 데이터 로드 #텍스트 분할
- 타입스크립트
- React Native
- 정보처리기사
- Aggregate
- 속도개선
- 비동기
- IAP
- typeScript
- BOUNDED CONTEXT
- TS
- Today
- Total
nika-blog
FEConf-2022 본문
<목차>
회사에서 지원을 받아서 Frontend Conference를 다녀왔다.
새로운 지식과, 열정을 느낄 수 있는 시간이었다.

디자인 시스템, 형태를 넘어서
이소영flex
"기능이 형태에 결합되지 않는 디자인 시스템은 어떻게 만들어야 할까?"
flex의 세 번째 디자인 시스템 "linear"이야기를 통해 이 물음에 답을 찾아가는 과정을 공유합니다."
<요약>
주의할 점
디자인 시스템은 병목 또는 제약으로 작용하면 안된다.
관리 주체가 명확해야 한다.
설계 아이디어
하위 아이템을 커스텀 가능한 아이템과 기본 아이템 중 택 1 을 선택하여 개발하도록 설계하는 건 어떨까?
기본 기능은 스크롤 영역, 접근성, 키보드 탐색 등 최소한으로 보장하여야 한다.
문제 해결
컴포넌트들을 최대한 조합할 수 있는 형태로 제공하되, 반복 작업이 많은 부분은 디자인시스템에서가 아닌, 새로운 라이브러리에서 구성으로 제공하는 방법도 있다.
<생각>
디자인 시스템만 만들고 있기에는 개발리소스가 너무 부족하다. 공통 컴포넌트를 만들때, 설계 아이디어라도 참고해 보자...
확장성
디자인 시스템이 병목이 되지 않기 위해 갖추어야 함
- 형태가 강하게 결합되면 안됨
- 확장성을 갖추지 못했을 때의 문제점
- 컴포넌트 형태인 style : custom 필요한 경우가 있음
- 각 요구사항 마다 컴포넌트 생성 : 파편화 → 복잡성 추가
- prop 추가 : 디자인시스템 책임 무거워짐, 컴포넌트 기능 다양해짐 → 복잡성 추가
- 컴포넌트 형태인 style : custom 필요한 경우가 있음
디자인 시스템
- 정의
ex. select-component- 형태 = 스타일 : color, layout 등…
- 기능 : 아이템 선택 등
- 접근성 : popup 요소에 대한 힌트
- 커스텀 : needs 에 따라 형태나 기능을 쉽게 custom 가능
- 커스텀과 제약(형태, 기능)은 반비례 형태 가짐
linear : flex 디자인 시스템
- 기존 버전 아쉬운점
- 관리 주체 x : interface 일관성 x
- ant design 시스템의 아쉬운점 그대로 가짐
- 형태 커스텀 불가능
- 키보드 지원 불가
3가지 principles
- 기능은 형태와 독립적
- checkbox, radio : 기본형태가 필요한 경우와 custom 이 필요한 경우에 따라 다른 item 컴포넌트 사용가능
- trigger : children으로 trigger 컴포넌트를 선언하는 것만으로 select 등의 content component 와 상태 공유 가능하도록 개발
- 기본 동작 보장
- 신중하게 결정, 디자인 시스템이 제약이 되지 않도록
- ex. scroll 영역, 접근성 : 키보드 탐색
- 완성형 x, 조합형
- 최소한의 제약
- 최대한의 자유도, 디자이너들이 디자인할 때 제약을 갖지 않도록
- 컴포넌트에서 자유로운 커스텀 영역을 제공 :
- 문제점
- 조합에 대한 비효율 : 모두 liner 디자인 시스템에서 수용하면 유연성, 확장성 잃을 수 있음
- 해결방법 : linear extension 생성 : 반복잡업의 비효율 줄임, 구체적인 dataType 가질 수 있음
일백개 패키지 모노레포 - 우아하게 운영하기
오창영토스
토스 전 계열사에서 사용하고 있는 거대한 사내 라이브러리 모노레포의 운영 경험에 대해 공유합니다.
모노레포 : 잘 정의된 관계를 가진, 여러개의 독립적인 프로젝트들이 있는 하나의 레포
<요약>
모노레포 장점 + 모노레포 사용할 때 주의할 점
<생각>
인상깊었던 것은 코드 품질 관리 설명중에서.. jsdoc 으로 주석을 작성하면 자동 배포되어 문서화 된다는 것이다. 어떻게 세팅하는지 확인해봐야겠다.
멀티레포의 문제점
- 상황 : projectA projectB 가 따로 있음
- 구성원 권한부여 번거로움
- 재사용 코드 중복
- ci/cd lint test ts 등 재설정
- 새 프로젝트 생성 비용 큼
- 프로젝트간 코드 공유 어려움
- 같은 이슈 수정 위해서 각각 레포에 커밋 필요
- 히스토리 관리 어려움
- 제각각인 툴링으로 개발자 경험이 일관적이지 않음 →
jaranda: app.jaranda.kr 모노레포로 생성하고 lint, prettier 세팅 단일화함으로써 해결
모노레포 장점
- 새 프로젝트 생성 비용 x
- 프로젝트간 코드 공유 쉬움
- atomic commits
- 히스토리 관리 쉬움
- 공통된 툴링 → 일관적인 개발자 경험 제공
- Monorepo features
- 속도
- local caching
- local task ochestration
- ochestration : 자동화된 설정
- 하나의 프로젝트만 수정해도 나머지 프로젝트에 반영할 수 있는 기능
- 관리
- source code sharing
- 의존성 관계 설정
- 속도
toss FE chapter library
- library only monorepo
- 배포 : npm privacy
- 의존성 관리
- node_modules 의 문제점
- phantom dependency : 명시되지 않은 라이브러리 불러올 수 있음 →
해당 라이브러리를 사용하면 의존성이 혼란스러워지고 run-time error 의 원인이 될 수 있음
- phantom dependency : 명시되지 않은 라이브러리 불러올 수 있음 →
- yarn 사용
- .pnp.cjs 를 통한 엄격한 의존성 관리
- zero install
- 빠른 의존성 검색
- peer dependency 주의할 점
- 상속 dependency : 중복해서 제공하지 않고 가장 상위의 번들링에만 포함
- 문제점 : 전파된다 → p(b 포함)를 사용하지 않더라도 b를 사용하기 위해 p package 명시 필요 → 의존성 복잡도 증가
- 잠재적 런타임 에러가 될 수 있음
- 꼭 싱글턴으로 존재해야 하는 패키지일 때만 peer dependency로 명시
- 버전 관리
- semver : 버전넘버가 어떻게 할당되는지 명시적인 규칙과 요구사항
- 형태 : major.minor.patches
- 토스 : lerna version 사용하여 관리
- semver : 버전넘버가 어떻게 할당되는지 명시적인 규칙과 요구사항
- node_modules 의 문제점
- 코드 품질 관리
- RFC = request for comments
- 본격적인 코드 작성 전 설계에 대한 리뷰와 피드백 가능
- PR
- library code owner 코드 검증 & 승인 → 코드 품질 향상
- pure dependency error & dead code export 없는지 & 배포가 잘 되는지 등을 ci 로 체크
- 문서화
- 코드 주석 jsdoc 로 작성 → 문서화 시스템 통해서 toss FE chapter docs 로 자동 배포, 추가
- service monorepo
- 배포 : 내부 인프라
- toss 공개 모노레포 링크
https://github.com/toss/slash
UX 개발자, 대형 서비스 빠르게 프로토타입하기
박신연구글 검색
다소 생소할 수 있는 UX 개발자와 그 역할 중 프로토타입 제작에 대해 이야기합니다.
최근에 구글 검색, 쇼핑에서 주로 사용하는 프로토타입 유형들을 알아보고 그중 대형 서비스의 특성상 발견하게 된 특별한 프로토타입 유형을 자세히 소개 합니다.
<요약>
프로덕션 환경의 프로토타입을 빠르게 만들고 공유하는 방법으로 google extension 을 사용하는 것은 어떨까?
<생각>
오.. 현업에서 쓸.. 일이 있을수도? 생각하지 못한 방법이라서 흥미롭다.
- 주제 : 대형 서비스(한 서비스에 각각의 영역 담당하는 개발팀이 있는 경우)에서 빠르게 프로토타이핑하고 테스트해야 하는 경우 UX 개발자의 방법 공유
- UX 개발자 : 디자인과 사용성에 집중하는 개발자 (디자이너편)
- 관심 : 디자인 시스템, 프로토 타이핑, user test, 내부 도구 만들기
prototype
- 전체적인 기능을 간단한 형태로 구현한 시제품
- 개발자는 왜 프로토타이핑을 할까?
- 다른 부서에게 빠르게 공유 → 효과적인 의사소통
- 개발자가 서비스에 미칠 수 있는 영향 극대화
prototype 종류
- pretotype
- pre (프로토타입 만들기 전) + 제품이나 서비스인 척 하는 것
- design prototype
- 디자인 파일을 브라우저에서 확인
- tool : figma 등
- 개발자 prototype
- 실제 프로덕트의 데이터를 이용하는 모션 포함, 새로운 상호작용(interaction)을 제안
- ux 개발 프로토 타입 종류(개인적)
- mock-up environment
- 목적 → 환경의 자유도 결정
- 무엇을 테스트
- 어떤 사용자 대상
- 몇 명 사용자
- 어떤 방식
- ex : mouse hover → 이미지가 커져야 한다 : 어느 정도 예민해야 할까?
- 특정 부분이나 기능만 구현, 나머지 부분 이미지 대체, 제한적 user research 에 사용
- 목적 → 환경의 자유도 결정
- components environment
- 데이터의 반영 필요한 경우
- 한계점 : 디자인 시스템 정의 요구, 재사용 x, 시간이 오래 걸림, 어디까지 만들어야 할까..
- ex. storybook 사용
- product environment : chrome extension 사용 (발표자가 소개하고 싶은 것)
- mock-up environment
product environment
- 환경 구성 방법
chrome extension 제작 → 배포 → 사용자(설치 후 크롬 브라우저에서 특정 사이트 접속) -> 스크립트와 스타일 실행 → 실시간으로 새롭게 생성된 사이트 환경 확인 → 사용자 : 익스텐션의 설정 변경 → 확인 가능 - 장점 : 실제의 환경을 이용한 프로토타이핑
- 환경 구성 x
- chrome extension 자동 배포
- 코드 레벨 설명
- manifest.json : extension 생성할 때 사용
content_scripts : 특정 url(환경 구축하고 싶은 url) 과 매칭되면, 실행해야 하는 코드 생성
ex : css로 실제 product 에서 id, class 찾아서 변경, js 도 반영가능
코드 공유 : - 관련 개발 문서 : https://developer.chrome.com/docs/extensions/
위 링크 참고해서 product environment를 google extension 으로 생성 가능하다
- manifest.json : extension 생성할 때 사용
- 단점
- 실제 환경이 변화했을 때, selector 가 사라졌을 수 있음
- 외부 사용자에게 test 할 때, chrome extension을 설치하도록 유도 필요
- mobile 에서 확인 불가(pc 에서 mobile 테스트 필요)
내 import 문이 그렇게 이상했나요?
박서진토스
프론트엔드 개발자에게 있어 import 문은 더 이상 낯선 개념이 아닙니다. 그런데 잘 살펴보면 그렇게 작성된 import 문은 JavaScript 표준과는 거리가 있을 가능성이 높습니다.
표준 모듈 시스템인 ECMAScript Modules에 대해 소개하면서, 왜 ESM으로 가야 하는지, 어떻게 갈 수 있는지 소개합니다.
<요약>
ESM 과 CommonJs 의 라이브러리 사용 방법 혼용으로 다양한 에러의 원인이 된다.
현재는 ESM 지원 문제가 있어, 옮기기는 힘들지만 언젠가는 옮겨가야 함으로 꾸준히 관심을 가지고 대비하자.
미리 대비하는 방법 : 일단 확장자를 붙여 import 해볼까?
<생각>
오.. ts import 는 가짜였구나.. esm 으로 갈때, 고생할듯 ㅠㅠ
- 이상한 import 문으로 발생하는 error
- error message : unexpected token import
- require() of ES Module
- error 원인
- 동기에서 비동기 사용은 매우 어려움 반대로 비동기에서 동기 사용은 가능
- commonJS 에서 import 가능, ESM 에서 require 사용 어려움
- 해결 방법 : commonJS → ESM 도입(이 방법밖에..)
commonJS
- 과거 : 모듈 시스템 없는 JS
- script 태그 직접 import → commonJS 모듈 시스템 생성 (require) → 파일 단위 개발 가능
- commonJS 문제점
- node.js 에서만 사용 가능 (브라우저 x)
- 정적 분석의 어려움
- require 이 keywords 가 아닌 함수이기 때문에.. 변수 저장 연산자 내 사용 등이 가능.
- 비동기 모듈 정의 불가능
- global require 함수 재정의 가능 : jest, ts-node, yarn 라이브러리 등에서 변경 : esm 에서 동작하지 않음 → 향후 각 라이브러리에서 esm 대응 필요
ESM
- import export 문법
- 쉬운 정적 분석 : 조건문을 통한 import 불가
- import export는 keyword 이기 때문에 재정의 불가
- 비동기 동작 가능
- 언어표준 지정 : 브라우저, node, deno 환경에서 모두 사용 가능
- package를 ESM으로 옮기기
- 난관
- 우리가 사용하는 가짜 esm : 실제 동작이랑 다를 수 있음
함정 : ts, babel 사용 → import 가 commonJS 의 require 로 변환됨. - 성숙하지 않은 생태계 : 많은 라이브러리들이 아직 common-js 이용
- ts 에서 esm 지원을 아직 하지 않음 → 정식 버전에서 이제 시작
- 문제점 있음 : ts 파일만 있어도.. js 파일로 import 해 ㅎㅎ..
- 라이브러리를 쓸 때, / 포함하여 일부만 Import 하면 문제가 된다
- 원인 : esm 에서는 확장자를 명시해야 해야해서..
- ts 에서 esm 지원을 아직 하지 않음 → 정식 버전에서 이제 시작
- 우리가 사용하는 가짜 esm : 실제 동작이랑 다를 수 있음
- Node.js 에서의 ESM 규칙
- package.json
- type: module → js 파일 esm 방식으로 동작
- 확장자 제공 : esm 안에서 common-js 사용가능
- .cjs → commonJs 동작
- .mjs → esm 동작
- package.json
- type: commonJs(default) → js 파일 commonJs 방식으로 동작
- package.json
- 난관
- 올바른 import 문을 쓰는 방법
- 진짜 import 은 확장자 포함 필요: .js 등
- require 은 확장자를 자동으로 찾아주지만.. esm의 import 는 아님 → 확장자가 없으면 번들링 늦어지고, node.js 성능이 나빠짐
- 어떤 서비스를 옮길 수 있을까 → jaranda 서비스는 아직 불가능
- ts 안쓸 때
- 사용하는 라이브러리가 esm 환경 지원
- next-js x, react 0
- jest, yarn Pnp, ts-node 등 commonJS 환경에 깊이 의존하는 라이브러리를 사용하지 않을 때
- 향후 esm 으로 점점 변화하지 않을까
- 내 서비스를 옮기는 방법
- type: module 을 package.json 에 축
- import 파일 확장자 모두 찾아서 추가해 주기^^
- require 문 모두 import export 로 변환
- require 문 남겨야 하면.. {createRequire} from ‘module’ 해서 사용해도 되고..