-
API 설계 원칙
서비스내에서 발생하는 어떠한 데이터 구조를 송/수신/저장에 적합한 포맷으로 변환하는 과정 적합한 포맷은 프로토콜/언어/플랫폼에 독립적이며 보편적이고 표준화된 포맷 (JSON, XML ... )
node.js 기반의 웹 서버는 .json 을 default 로 사용하므로 JSON Format 을 직렬화 포맷으로 사용한다. JSON 파일의 value type 을 실제 연산 타입에 적용 할 수 있도록 사용하여 의도를 분명히 한다.
Representational State Transfer, 서버가 보유한 '자원'을 이름으로 구별하여 해당 자원의 '상태'를 주고 받는 모든 것.
- HTTP URI 를 통해 자원(resource)을 명시
- HTTP Method 를 통해 자원에 대한 CRUD Operation 을 명시
- Create (POST)
- Read (GET)
- Update (UPDATE)
- Delete (DELETE)
- HEAD (HEAD)**
- HTTP URI Resource 표현에 대한 명세
- 동사 → 명사로, 대문자 → 소문자로
- 스토어/컬렉션(집합)명 은 복수명사
- HTTP Method 표현에 대한 명세
- URI (Route) 에 Method 를 명시해서는 안된다.
- 행위에 대한 동사표현이 들어가서는 안된다.
- 경로 부분의 동적인 부분은 유일한 값으로 반드시 대체한다.
- 기타 설계 규칙
- 슬래시 구분자('/') 는 계층 관계에만 사용한다.
- uri 의 마지막에는 슬래시 구분자를 사용하지 않는다.
- 단어 집합은 하이픈('-') 을 사용한다.
- 파일 확장자를 uri 에 포함하지 않는다.
-
API 스펙 설계
. ├── common │ ├── constants │ ├── decorator │ ├── exceptions │ ├── guards │ ├── interfaces │ ├── middlewares │ ├── pipes │ └── serializers ├── config │ ├── app │ ├── cache │ └── database │ ├── mongo │ ├── mysql // AWS RDS config, MySQL 5.7 │ └── mysql-dev // GCP Cloud Storage SQL config, MySQL 5.7 ├── database │ └── seeders ├── jobs ├── mails ├── models │ ├── auth │ │ ├── constants │ │ ├── dto │ │ ├── entities │ │ └── interfaces │ └── test └── providers ├── cache └── database ├── mongo ├── mysql └── mysql-dev
| 디렉토리명 | 내용 |
|---|---|
constants |
공용 사용 상수값 정의 |
decorator |
meta data 를 인자로 하고 함수를 반환하는 nest custom decorator 정의 |
exceptions |
서비스 내 특정 클래스에서 발생하는 예외에 대한 nest custom exceptions 정의 (내장 예외 레이어 제외) |
guards |
각 middleware 이후, interceptor or pipe 이전 실행되며 런타임안에서 요청의 적정 조건 만족여부 확인 후 controller 처리 할지를 판단하는 custom guard 정의 |
interfaces |
/common 디렉토리 내에서 사용되는 interfaces 정의, /src 제외 타 디렉토리 내에서 사용되는 interfaces 정의 |
middlewares |
nest() 메소드를 통해 HTTP request, response 에 접근 할 수 있는 custom middleware 정의 |
pipes |
Nest method 가 호출되기 직전에 삽입되며 예외 영역 내에서 실행되는 custom pipe 정의 |
serializers |
네트워크 응답과정에서 개채 반환 직전 데이터를 변환/삭제 하는 규칙을 제공하는 custom serializer 정의 |
| 디렉토리명 | 내용 |
|---|---|
app |
nest 프로젝트 내에서 사용되는 공용, 전역 환경 변수 정의 |
cache |
HTTP 요청 처리간에 발생하는 cache 처리 관련 환경 변수 정의 |
database |
데이터베이스 connection 과 관련된 환경 변수 정의 |
| 디렉토리명 | 내용 |
|---|---|
cache |
임시 데이터 저장소 cache connection provider 를 정의 |
database |
typeorm module connection provider 를 정의 (Database 연결 공급자) |
(https://docs.nestjs.com/techniques/queues)
| 디렉토리명 | 내용 |
|---|---|
consumers |
@nestjs/bull 라이브러리를 통해 생성된는 nest queue 대기 작업 처리 방식 정의 |
producers |
@nestjs/bull 라이브러리를 통해 생성된는 nest queue 대기 작업 생성 방식 정의) |
-
API Entity 설계
Yallo Market API server 의 ORM(Object-relational mapping) 은 TypeORM 을 사용한다. JavaScript, TypeScript 의 Class 를 Table 로 맵핑
- 각 Entity 는 기본열을 가진다.
@Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() firstName: string; }
- Entity 의 각 Column 은 타입과 크기를 가진다.
@Column("varchar", { length: 200 }) @Column({ type: "int", width: 200 })
- Entity 의 각 Column 은 열 옵션을 가진다. (https://typeorm.io/#/entities 참고 - DB type == mysql,maria)
@Column({ type: "varchar", length: 150, unique: true, // ... }) name: string;
- Entity Method 는 QueryBuilder 를 사용한다. (https://typeorm.io/#/select-query-builder 참고)
const firstUser = await connection .getRepository(User) .createQueryBuilder("user") .where("user.id = :id", { id: 1 }) // ... .getOne();
→ 즐겨찾기 한 가게 목록
→ 개별 사업체