$ docker-compose -f docker-compose.dev.yml up --build
docker 이미지를 컴파일한 다음 시작하도록 —build 플래그를 전달한다.
디버깅 모드로도 실행되고 8000 번 포트로 접근할 수 도 있다.
1
$ curl --request GET --url http://localhost:8000/notes
Connect a debugger
크롬 브라우저와 함께 제공되는 디버거를 사용할 수 있다. 크롬을 열고 주소창에 about:inspect 를 입력한다.
depends_on
어떤 컨테이너는 다른 컨테이너의 의존해서 실행 순서가 나중이어야 하는 경우가 있다. mysql을 사용하면서 특정 테이블이 생성되기 전에 server에서 접근하면 에러가 발생하는데 이런경우 mysql 컨테이너가 테이블을 만드는 시점보다 server 가 실행되는 시점이 더 빠르기 때문이다. 의존성을 추가하고 싶다면 depends_on 을 사용하여 의존성을 명시해준다.
BuildKit을 활성화 해서 이미지를 효과적으로 빌드 할것을 추천한다. Docker Desktop을 사용한다면 자동으로 설정 되어 있다.
Overview
이미지에는 애플리케이션을 실행하는 데 필요한 모든것(코드, 바이너리, 런타임, 종속성 및 기타 필요한 파일 시스템 개체)이 포함된다.
Create a Dockerfile for Node.js
Dockerfile 은 Docker image를 모으는 지침을 포함하는 텍스트 파일이다. docker build 와 같은 명령어를 사용하면 Dockerfile에서 읽어서 실행한다.
프로젝트 root 경로에 Dockerfile을 만든다.
#syntax 를 적용한다. build 하기 전에 항상 최신 버전을 사용하는 등의 작업을 수행하게 할 수 있다. docker/dockerfile:1 은 항상 최신버전을 가르킨다.
1
# syntax=docker/dockerfile:1
base image 파일을 설정한다.
1
FROM node:12.18.1
상속 가능하다. 즉, 직접 만든 것도 사용 가능 하지만 다른 이미지를 사용할 수 도 있다. 따라서 어플리케이션에 필요한 기능이 모두 담긴 이미지를 base image로 설정할 수 도 있다. 상속과 마찬가지로 FROM 을 사용하면 해당 이미지에 모든 기능을 사용하는 다른 이미지를 만들 수 있다.
환경을 설정한다. 주로 production 이다 development 가 될 수 있다.
1
ENV NODE_ENV=production
다른 명령을 쉽게 실행 시키기 위해서 working dir을 설정한다. 기본 패스로 사용해서 다른 명령어를 입력할때 모든 패스를 사용하지 않아도 된다.
1
WORKDIR /app
node 프로젝트에서는 의존성을 설치하기 위해 package.json을 사용하는데 이미지 파일에도 package.json을 옮겨야 한다. COPY 명령을 사용하고 인자로 src 와 dest 를 받는다. src 는 복사하고 싶은 파일을 의미하고, dest는 복사하고 싶은 곳을 의미한다.
1
COPY ["package.json", "package-lock.json*", "./"]
의존성을 설치하는 명령을 실행한다.
1
RUN npm install --production
이제 모든 파일을 복사한다. 이미지 파일로 복사한다.
1
COPY . .
컨텐스트 로드 시간을 줄이기 위해서 .dockerignore 파일을 생성한다.
1
node_modules
build image
docker build 명령을 실행시켜서 build 할 수 있다. --tag 옵션을 주면 이미지에 이름을 줄 수 있다.
서버에서 검증을 빨리 하는것이 좋은데 네트워크를 소비하지 않도록 클라이언트에서 검증을 해도 좋다. 하지만 서버에서 검증하는 절차는 필수적이다.
유효성 검사를 위해서 expres-validator 를 이용할 수 있다.
Sanitization 이란 ? 유효성 검사 후에 해야 하는데 예를 들어 2 글자 이상의 벨리데이션이 있었다면, 공백만 3글자로 입력해도 통과 됨. 이런것도 다 잡아줘야 함 → 이경우에는 맨 처음 trim()을 사용해서 해결 가능. express-validator 다양한 Sanitization 을 관련 API를 제공한다. ⇒ 데이터를 일관성있게 적용될 수 있도록
validation 관련한 함수는 middleware로 따로 관리한다 controller는 비즈니스 관련 핵심 로직만 관리 할 수 있도록 한다.
Contract Testing: Client-Server 통신시 test, 나중에 공부해보자.
프론트
react-query: server 에 상태를 캐쉬해서 network 비용을 줄일 수 있게 해준다. redux 를 사용하면 client 에 상태는 잘 관리할 수 있지만 server의 상태를 관리하려면 캐쉬등 여러가지 해주어야 할 작업이 있다. 이 책임을 reqct-query 에게 줌으로써 개발자는 다른 것에 집중해서 개발할수 있다.
데이터를 처음 가져올때는 state를 통해 loading, success, error 와 같은 상태를 사용할 수 있고, 두번째로 가져올 때부터는 server 상태와 동기화 되서 다를때만 가져오고 나마저는 캐쉬된 상태를 사용할수 있게 함으로써 사용자 경험을 높인다.
전역 state는 어떻게? → ContextAPI를 사용하여 전역 상태를 관리 할 수도 있다. 요즘은 redux 에 비중을 줄이고 context 와 react-query에 조합을 많이 사용하기도 한다.
리액트 네이티브
react-native-safe-area-context : safe area 나머지 부분에 여백에 관한 설정을 할수 있는 라이브러리
안드로이드에 경우 자동으로 서드파티 라이브러를 불러와서 사용할 수 있지만 ios에 경우에는 cocoapods 의 도움을 받아야 네이티브 모듈의 적용할 수 있다. ios 폴더 이동후 pod install 을 실행한다.
react-native-safe-area-context 의 useSafeAreaInsets() hook을 이용하면 반환 값으로 각 safeArea 구성의 필요한 각 모서리에 공백을 top, bottom, left, right로 받아올 수 있다.
statusBar 의 barStyle props를 전달할 수 있다. dark-content(어두운 내용), light_content(밝은 내용), default(시스템 기본 설정) → 참고로 안드로이드 ios 공통으로 사용할 수 있다.
리액트 네이티브에서 스타일링할 때 크기는 모두 dp로 설정한다. (Density-independent Pixel) → 1인치당 픽셀 밀도에 따라 크기가 일관된 UI를 보여줄 수 있는 단위이다.
dp = px * 160 / ppi
px = dp * ppi / 160
시뮬레이터 디바이스를 변경하는 방법 → xcrun simctl list devices 를 통해 실행 가능한 디바이스 목록을 확인할 수 있고, yarn react-native run-ios- simulator="iPhone 5s 와 같은 방법으로 동작 시킬 수 있다. 안드로이드의 경우에는 Android Virtula Device Manager를 열어서 Create Virtual Device 버튼을 눌러 새 디바이스를 추가하면 된다.
이미지를 리사이즈 해서 실제 이미지와 크기가 달라질때, resizeMode를 설정할 수 있다.
cover: 기본값, 가로 세로 비율을 유지한채로 리사이징, 뷰가 더 작으면 이미지가 잘린다.
contain: 가로 세로 비율을 유지한 체로 리사이징 하며 무조건 영역에 모두 들어오도록 한다.
stretch: 뷰의 크기대로 이미지를 리사이징 한다. 비율이 달라진다.
repeat: 바둑판식으로 이미지를 반복한다.
center: 이미지를 뷰 중앙에 둔다. contain과 마찬가지 이고, 뷰가 이미지보다 크면 이미지의 크기가 커지지 않고 원본 사이즈를 유지한다.