diff --git "a/_posts/2022-08-25-TypeORM\354\234\274\353\241\234 Transaction \354\262\230\353\246\254\355\225\230\352\270\260.md" "b/_posts/2022-08-25-TypeORM\354\234\274\353\241\234 Transaction \354\262\230\353\246\254\355\225\230\352\270\260.md" index 1df6ba9..43b7c85 100644 --- "a/_posts/2022-08-25-TypeORM\354\234\274\353\241\234 Transaction \354\262\230\353\246\254\355\225\230\352\270\260.md" +++ "b/_posts/2022-08-25-TypeORM\354\234\274\353\241\234 Transaction \354\262\230\353\246\254\355\225\230\352\270\260.md" @@ -11,7 +11,7 @@ tags: [TypeORM, Transaction] > [typeorm-tracsactional](https://www.npmjs.com/package/typeorm-transactional) 0.1.1 {: .prompt-info } -# Transaction이란? +## Transaction이란? {: .mt-4 .mb-4 } 우선 `트랜잭션(Transaction)`이란 무엇일까요?
@@ -186,7 +186,6 @@ transaction을 처리하는 `Service` 코드입니다. 앞서 본 queryRunner를 } ``` -
> 참고
diff --git "a/_posts/2022-09-06-Mysql \352\263\265\352\260\204 \353\215\260\354\235\264\355\204\260 \354\240\225\353\246\254.md" "b/_posts/2022-09-06-Mysql \352\263\265\352\260\204 \353\215\260\354\235\264\355\204\260 \354\240\225\353\246\254.md" index fd804e5..9f58cd9 100644 --- "a/_posts/2022-09-06-Mysql \352\263\265\352\260\204 \353\215\260\354\235\264\355\204\260 \354\240\225\353\246\254.md" +++ "b/_posts/2022-09-06-Mysql \352\263\265\352\260\204 \353\215\260\354\235\264\355\204\260 \354\240\225\353\246\254.md" @@ -13,7 +13,7 @@ NestJS를 사용하는 프로젝트를 진행하다가 사용자의 경로 데 > [Mysql](https://dev.mysql.com/downloads/mysql/5.7.html) 5.7 {: .prompt-info } -# 공간 데이터베이스란? +## 공간 데이터베이스란? {: .mt-4 .mb-4 } **공간 데이터베이스**란 말 그대로 공간 정보를 저장할 수 있는 데이터베이스를 뜻합니다. @@ -21,7 +21,7 @@ NestJS를 사용하는 프로젝트를 진행하다가 사용자의 경로 데 공간 데이터베이스는 단순히 공간 데이터를 저장해줄 뿐 아니라 공간 데이터를 활용한 **공간 함수**을 함께 제공합니다. -# Mysql의 공간 데이터 타입 +## Mysql의 공간 데이터 타입 Mysql에서는 공간 데이터를 저장할 수 있도록 타입을 제공하고 있습니다. 공간 데이터 타입 @@ -37,7 +37,7 @@ Mysql에서는 공간 데이터를 저장할 수 있도록 타입을 제공하 | GeomCollection | 모든 공간 데이터들의 집합 | GEOMETRYCOLLECTION(POINT(10 10), LINESTRING(20 20, 30 30)) | -# Mysql의 공간 함수 +## Mysql의 공간 함수 {: .mt-7 .mb-4 } Mysql에서는 다양한 공간 함수를 제공하고 있습니다. 그 중에서 자주 사용되는 함수들은 아래의 표와 같습니다. @@ -61,12 +61,12 @@ Mysql에서는 다양한 공간 함수를 제공하고 있습니다. 그 중에 다양한 함수들이 많으니 공식 문서를 참고해서 원하는 기능의 함수를 잘 찾아서 사용하면 좋을 것 같습니다. Mysql 공간 함수 -# Example +## Example {: .mt-7 .mb-4 } > 지금부터는 NestJS에서 TypeORM을 활용하여 공간 데이터를 사용하고 저장하는 방법에 대해 알아보곘습니다. {: .prompt-tip } -## (1) Entity +### (1) Entity `TypeORM`과`wkx` 라이브러리를 사용하여 정의한 Route 엔티티입니다. ```typescript @@ -89,7 +89,7 @@ export class Route { npm을 통해 설치해주어야 사용이 가능합니다. npm-wkx -## (2) DTO +### (2) DTO 프론트에서 전달받는 위치 정보는 `latitude`와 `longitude`로 이루어진 배열 데이터라고 가정하겠습니다.
이는 `eachPoint` 타입을 정의해서 사용하였고 경로 데이터는 2개 이상의 Point가 필수적으로 필요하기 때문에 `@ArrayMinSize(2)`으로 설정해줍니다. @@ -108,7 +108,7 @@ export class CreateRouteDto { } ``` -## (3) Service +### (3) Service Point 타입과 LineString 타입 데이터를 저장할 때에는 위의 표에 있는 예시와 같이 입력해줘야 하기 때문에 그에 맞게 데이터 형식을 바꿔주는 작업이 필요합니다. 데이터 저장은 TypeORM의 `queryBuilder`를 사용하여 세부적인 쿼리문을 작성할 수 있으며, `ST_GeomFromText` 함수를 사용해서 문자열 데이터를 공간 데이터 타입으로 변환하여 저장할 수 있습니다. @@ -141,9 +141,10 @@ Point 타입과 LineString 타입 데이터를 저장할 때에는 위의 표에 } ``` -## (4) 결과 확인 -### request-body +### (4) 결과 확인 + ```javascript +// request-body { "routeData": [{ "latitude": 0, diff --git "a/_posts/2022-09-14-Redis \355\231\234\354\232\251\355\225\230\354\227\254 \353\236\255\355\202\271 \352\270\260\353\212\245 \352\265\254\355\230\204\355\225\230\352\270\260.md" "b/_posts/2022-09-14-Redis \355\231\234\354\232\251\355\225\230\354\227\254 \353\236\255\355\202\271 \352\270\260\353\212\245 \352\265\254\355\230\204\355\225\230\352\270\260.md" index b6175bb..1a75b23 100644 --- "a/_posts/2022-09-14-Redis \355\231\234\354\232\251\355\225\230\354\227\254 \353\236\255\355\202\271 \352\270\260\353\212\245 \352\265\254\355\230\204\355\225\230\352\270\260.md" +++ "b/_posts/2022-09-14-Redis \355\231\234\354\232\251\355\225\230\354\227\254 \353\236\255\355\202\271 \352\270\260\353\212\245 \352\265\254\355\230\204\355\225\230\352\270\260.md" @@ -10,7 +10,7 @@ tags: [Redis] > [Redis](https://redis.io/download/) 7.0 {: .prompt-info } -# 데이터베이스 쿼리가 아닌 Redis를 사용한 이유는? +## 데이터베이스 쿼리가 아닌 Redis를 사용한 이유는? {: .mt-4 .mb-4 } **속도 차이 !!!** @@ -18,7 +18,7 @@ tags: [Redis] 그래서 속도 개선을 위해 **in-memory DB**인 **Redis** 사용을 결정하였습니다. -# Memcached가 아닌 Redis를 사용한 이유 +## Memcached가 아닌 Redis를 사용한 이유 {: .mt-7 .mb-4 } **in-memory DB**는 **Redis**와 **Memcached** 두 가지를 많이 사용합니다. @@ -28,33 +28,33 @@ tags: [Redis] 즉, 랭킹 기능을 구현하는데 있어 `Redis`에서 제공하는 `sorted-set`을 사용하면 빠르고 용이하게 개발을 할 수 있을 것이라고 생각하여 `Redis`를 사용하였습니다. -# 랭킹 구현에 sorted set이 적합한 이유 +## 랭킹 구현에 sorted set이 적합한 이유 {: .mt-7 .mb-4 } 1. 집합이기 때문에 중복을 해결해 준다. (1등이 두 명이 될 수는 없다는 랭킹의 특징을 쉽게 나타낼 수 있다) 2. score를 하나하나 내가 비교할 필요가 없다. (score 값을 비교하여 정렬을 하기 때문에 내가 일일이 score 값을 비교할 필요가 없다) -# sorted set 명령 알아보기 +## sorted set 명령 알아보기 {: .mt-7 .mb-4 } -## (0) redis-cli 접속하기 +### (0) redis-cli 접속하기 ```console $ redis-cli ``` -## (1) member 추가하기 +### (1) member 추가하기 ```console $ ZADD ``` add_member -## (2) member의 score 값 조회하기 +### (2) member의 score 값 조회하기 ```console $ ZSCORE ``` get_score_1 -## (3) score 작은 순서로 순위 조회하기 +### (3) score 작은 순서로 순위 조회하기 1순위부터 보고 싶다면 0을 사용해야 합니다. ```console $ ZRANGE <시작> <끝> @@ -62,21 +62,21 @@ $ ZRANGE <시작> <끝> get_score_2 -## (4) score 큰 순서로 순위 조회하기 +### (4) score 큰 순서로 순위 조회하기 ```console $ ZRANGE <시작> <끝> REV ``` get_score_3>
 
-## (5) score가 작은 순서대로 정렬했을 때 member 순위 조회하기
+### (5) score가 작은 순서대로 정렬했을 때 member 순위 조회하기
 ```console
 $ ZRANK <key> <member>
 ```
 
 <img src= -## (6) score가 큰 순서대로 정렬했을 때 member 순위 조회하기 +### (6) score가 큰 순서대로 정렬했을 때 member 순위 조회하기 ```console $ ZREVRANK ``` @@ -84,12 +84,12 @@ $ ZREVRANK get_rank_2 -# Example +## Example {: .mt-7 .mb-4 } > 지금부터는 NestJS에서 Redis의 Sorted Set을 활용하여 랭킹 기능을 구현해 보겠습니다. {: .prompt-tip } -## (1) docker-compose.yml +### (1) docker-compose.yml NestJS와 Mysql을 이미 docker-compose로 묶어서 사용하고 있어 redis도 docker image를 사용하였습니다. 각각 변수들은 `.env`로 관리할 수 있습니다. @@ -104,12 +104,12 @@ redis: command: redis-server --requirepass ${REDIS_PASSWORD} ``` -## (2) 라이브러리 설치 +### (2) 라이브러리 설치 ```console $ npm install @liaoliaots/nestjs-redis ioredis ``` -## (3) app.module.ts +### (3) app.module.ts 라이브러리에서 제공하는 `RedisModule`을 사용하여 `app.module.ts`에 redis 연결을 위한 설정을 해줍니다. ```typescript import { RedisModule } from '@liaoliaots/nestjs-redis'; @@ -130,7 +130,7 @@ import { RedisModule } from '@liaoliaots/nestjs-redis'; export class AppModule {} ``` -## (4) service.ts +### (4) service.ts 호출할 때마다 해당 user의 score 값을 1씩 증가시키는 `setRank` 함수와 순위를 가져오는 `getRank` 함수를 작성하였습니다. (라이브러리에서 대부분의 함수를 redis-cli에서 사용하는 명령어 이름으로 작성해두었기 때문에 원하는 기능의 함수를 찾기 편했습니다 ㅎㅎ) ```typescript @@ -158,6 +158,7 @@ docker image를 실행시킬 때 redis에 비밀번호 설정을 해주었기 docker_redis_login +
> 참고
> ttps://redis.io/docs/data-types/sorted-sets/
diff --git "a/_posts/2022-10-05-Docker\354\231\200 Github Actions\353\241\234 CICD \355\214\214\354\235\264\355\224\204\353\235\274\354\235\270 \352\265\254\354\266\225\355\225\230\352\270\260.md" "b/_posts/2022-10-05-Docker\354\231\200 Github Actions\353\241\234 CICD \355\214\214\354\235\264\355\224\204\353\235\274\354\235\270 \352\265\254\354\266\225\355\225\230\352\270\260.md" index 3c3f0fc..d3d82a9 100644 --- "a/_posts/2022-10-05-Docker\354\231\200 Github Actions\353\241\234 CICD \355\214\214\354\235\264\355\224\204\353\235\274\354\235\270 \352\265\254\354\266\225\355\225\230\352\270\260.md" +++ "b/_posts/2022-10-05-Docker\354\231\200 Github Actions\353\241\234 CICD \355\214\214\354\235\264\355\224\204\353\235\274\354\235\270 \352\265\254\354\266\225\355\225\230\352\270\260.md" @@ -12,9 +12,9 @@ tags: [Docker, Github Actions, CI/CD, AWS] {: .prompt-info } -# 지속적 통합: CI(Continuous Integration) +## 지속적 통합: CI(Continuous Integration) -## (1) Dockerfile 작성하기 +### (1) Dockerfile 작성하기 Docker image 생성을 위해 Dockerfile을 작성해 줍니다. ```yml FROM node:16.15.1 @@ -28,7 +28,7 @@ EXPOSE 3000 CMD ["npm", "run", "start:dev"] ``` -## (2) docker-compose.yml +### (2) docker-compose.yml 데이터베이스는 mysql을 사용하였습니다. ```yml @@ -65,7 +65,7 @@ networks: server: ``` -## (3) docker-ci.yml +### (3) docker-ci.yml master 브랜치에 해당 이벤트가 발생하면 도커허브에 로그인하여 변경사항이 반영된 이미지를 생성해 올리도록 작업을 설정해 줍니다. 여기서 사용하는 변수들은 repository secret 변수에 등록해주어야 사용이 가능합니다. (CD 뒷 부분에 방법 참고!) ```yml @@ -101,23 +101,23 @@ jobs: ``` -# 지속적 배포: CD(Continuous Deployment) +## 지속적 배포: CD(Continuous Deployment) 배포는 AWS를 활용하였습니다. (프리 티어!) -## (1) AWS EC2 인스턴스 생성 +### (1) AWS EC2 인스턴스 생성 -### (1) AMI 선택 +#### (1) AMI 선택 AMI는 인스턴스를 시작하는 최초의 운영체제를 의미하는데, **ubuntu server 20.04 버전** 으로 설정했습니다. aws_ec2_ami -### (2) 키페어 생성 +#### (2) 키페어 생성 ``` .pem ``` 파일 형식으로 키 페어를 생성합니다. 네트워크나 다른 설정은 기본 값으로 두고 진행하였습니다. aws_key -### (3) 보안 그룹 구성 +#### (3) 보안 그룹 구성 인스턴스를 생성한 뒤에는 인스턴스 상세 화면에서 보안 그룹을 확인할 수 있습니다. 보안 그룹을 클릭하여 인바운드 규칙을 추가해 줍니다. @@ -127,7 +127,7 @@ AMI는 인스턴스를 시작하는 최초의 운영체제를 의미하는데, * security_group_2 -### (4) 고정 IP 설정 +#### (4) 고정 IP 설정 인스턴스를 중지했다가 다시 시작하면 IP가 계속 바뀌기 때문에 고정적인 IP 사용을 위해 탄력적 IP (Elastic) IP를 설정해 줍니다. elastic_ip @@ -138,14 +138,14 @@ IP 할당 후 생성된 IP로 들어가 앞서 생성한 인스턴스를 연결 _인스턴스를 더이상 사용하지 않아 중지할 때에는 IP도 함께 릴리즈해야 합니디!!_ -## (2) 인스턴스 접속하기 +### (2) 인스턴스 접속하기 EC2로 인스턴스에 ssh를 사용하여 접속해 봅시다! connect 생성한 인스턴스의 Connect 탭으로 들어가 SSH Client 부분에서 자신의 환경에 맞는 명령어를 확인할 수 있으니 그대로 진행하면 됩니다. -## (3) Docker 설치 +### (3) Docker 설치 접속한 서버에 docker를 설치해 줍니다. ```console @@ -166,9 +166,9 @@ $ sudo apt-get install docker-ce docker-ce-cli containerd.io 이후 docker 명령을 입력하면 docker 명령어들이 나오는데 그렇게 나오면 docker가 잘 설치된 것입니다. -## (4) Github actions 설정 +### (4) Github actions 설정 -### (1) build-and-deploy.yml 작성 +#### (1) build-and-deploy.yml 작성 ```yml name: build and deploy @@ -221,7 +221,7 @@ jobs: master 브랜치에 push 이벤트가 발생했을 때 해당 작업을 수행하도록 워크플로우를 작성해 줍니다. -### (2) ssh password 생성 +#### (2) ssh password 생성 ssh 배포에 [appleboy](https://github.com/appleboy/ssh-action) 를 활용하는데 private key나 password를 사용해 ssh 접속이 가능합니다. 저는 password를 사용해 접속하는 방법을 선택했기 때문에 비밀번호를 생성해준 뒤 repository의 secret 변수로 등록해 줍니다. @@ -244,7 +244,7 @@ $ sudo vi /etc/ssh/sshd_config $ service ssh restart ``` -### (3) secret 변수 설정 +#### (3) secret 변수 설정 yml에서 사용한 secret 변수들을 설정해 줍니다. repository의 **settings/security/secrets/actions** 탭에 들어가서 변수를 추가할 수 있습니다. @@ -256,7 +256,7 @@ ec2 인스턴스는 생성할 때 선택한 AMI에 따라 [username](https://doc * password: 위에서 생성해준 ssh의 password * port: ssh 접속 포트번호 (기본으로 ssh 접속을 위해 열려있는 포트 번호는 22다) -## (5. Docker 권한 문제) +### (5. Docker 권한 문제) 윗 단계까지 진행하고 push를 하면 ``` @@ -266,21 +266,23 @@ err: Got permission denied while trying to connect to the Docker daemon socket 과 같은 에러가 발생할 수 있습니다. 이는 docker group에 해당 유저가 없어서 생기는 에러인데 docker group에 추가만 해주면 바로 해결됩니다. -### (1) ssh로 접속해서 docker group이 없을 경우에는 생성해준다. +#### (1) ssh로 접속해서 docker group이 없을 경우에는 생성해준다. ```console $ sudo groupadd docker ``` -### (2) docker group 해당 유저 추가 +#### (2) docker group 해당 유저 추가 ```console $ sudo usermod -aG docker $USER ``` -### (3) 변경사항 적용 +#### (3) 변경사항 적용 ```console $ newgrp docker ``` +
+ >참고
>https://docs.docker.com/engine/install/ubuntu/
>https://github.com/appleboy/ssh-action
diff --git "a/_posts/2023-01-15-Springboot \355\224\204\353\241\234\354\240\235\355\212\270\354\227\220 Spring Rest Docs \353\217\204\354\236\205\355\225\230\352\270\260.md" "b/_posts/2023-01-15-Springboot \355\224\204\353\241\234\354\240\235\355\212\270\354\227\220 Spring Rest Docs \353\217\204\354\236\205\355\225\230\352\270\260.md" index 38dd670..b59a28f 100644 --- "a/_posts/2023-01-15-Springboot \355\224\204\353\241\234\354\240\235\355\212\270\354\227\220 Spring Rest Docs \353\217\204\354\236\205\355\225\230\352\270\260.md" +++ "b/_posts/2023-01-15-Springboot \355\224\204\353\241\234\354\240\235\355\212\270\354\227\220 Spring Rest Docs \353\217\204\354\236\205\355\225\230\352\270\260.md" @@ -12,17 +12,17 @@ tags: [Spring Rest Docs] > Gradle 7.6 {: .prompt-info } -# API 문서화 도구의 필요성 +## API 문서화 도구의 필요성 다른 개발 팀원분들과 원활히 협업하기 위해서 API 문서화는 필수죠?! API 문서화를 위해서는 도구를 사용하거나 개발자가 API에 대한 내용을 직접 작성할 수도 있습니다. 그러나 개발자가 직접 문서화하는 방법은 아무래도 사람이 수작업으로 하는 일이다 보니 수정 사항을 잊어버리고 반영하지 않는다거나 하는 상황이 발생할 수도 있습니다. 그렇기 때문에 API 문서화 도구 사용을 많이들 추천합니다. -# Swagger VS Spring REST Docs +## Swagger VS Spring REST Docs 많이 사용하는 API 문서화 도구에는 **Spring REST Docs**와 **Swagger**가 있습니다. -## (1) Swagger +### (1) Swagger - 장점 - Spring REST Docs에 비해 설정이 쉽다. - API 문서에서 테스트가 가능하다. @@ -32,7 +32,7 @@ API 문서화를 위해서는 도구를 사용하거나 개발자가 API에 대 - Production 코드에 Swagger 관련 코드가 함께 들어간다. - 테스트 기반이 아니기 때문에 문서의 안정성을 보장해주지 않는다. -## (2) Spring REST Docs +### (2) Spring REST Docs **Spring REST Docs**는 **테스트 코드 기반**으로 RESTful 문서 생성을 도와주는 도구입니다. - 장점 @@ -43,21 +43,21 @@ API 문서화를 위해서는 도구를 사용하거나 개발자가 API에 대 - Swagger보다 설정이 까다롭고 공식 문서 외의 레퍼런스가 많지 않다. - 테스트 코드 아래에 이어 붙이는 형식으로 지원하기 때문에 테스트 코드의 양이 많아진다. -# Spring REST Docs를 선택한 이유 -## (1) 테스트 코드 작성의 강제성(?) +## Spring REST Docs를 선택한 이유 +### (1) 테스트 코드 작성의 강제성(?) Spring REST Docs는 테스트 코드를 통과한 API만 문서에 반영해 주는데요..! 진행 중인 프로젝트 기한이 8주로 정해져있기 때문에 8주 내에 테스트 코드까지 완벽하게 완성시킬 수 있을까에 대한 걱정이 있었습니다. 하지만 이렇게 강제적으로라도 테스트 코드를 작성하는 것이 어플리케이션의 안정성 및 실력 강화 측면에서도 도움이 될 것이라고 생각하였고 함께하는 백엔드 팀원분의 의견도 일치하여 Swagger 대신 Spring REST Docs를 선택하게 되었습니다. -## (2) Swagger 사용 시 Production 코드에 Swagger 코드가 섞인다. +### (2) Swagger 사용 시 Production 코드에 Swagger 코드가 섞인다. 이전 프로젝트에서 Swagger를 사용하면서 가장 불편하다고 느꼈던 부분입니다. 쉽게 반영할 수 있고 원하는 내용을 문서화하기에는 편리했지만 그만큼 직접 Production 코드 위에 어노테이션을 통해 입력해 줘야 하는 부분이 많아 개인적으로 코드가 지저분해진다는 느낌을 받았습니다. 이러한 이유로 이번 프로젝트에는 Spring REST Docs를 사용하기로 했습니다. -# Springboot에서 Spring Rest Docs 사용하기 -## (1) build.gradle +## Springboot에서 Spring Rest Docs 사용하기 +### (1) build.gradle ```java plugins { @@ -132,7 +132,7 @@ adoc 파일에서 사용할 snippets 속성이 자동으로 `build/generated-sni * (13) copyDocument 후 build 지정 -## (2) RestDocsConfiguration +### (2) RestDocsConfiguration snippets을 좀더 보기좋게 생성하고 싶다면 `prettyPrint()`를 `preprocessors`에 걸어주면 되는데 이를 위해서는 `RestDocumentationResultHandler`의 `write` 메소드에 지정 후 `Bean`으로 등록해주면 됩니다. @@ -167,7 +167,7 @@ public class RestDocsConfiguration { } ``` -## (3) AbstractRestDocsTests +### (3) AbstractRestDocsTests RestDocs에 대한 설정을 모든 테스트 클래스의 setUp으로 동일하게 작성해 줄 필요는 없으니 abstract 클래스로 만들어 각 테스트 클래스들이 상속받아 사용하도록 만들어줍니다. ```java @@ -210,7 +210,7 @@ public abstract class AbstractRestDocsTests { } ``` -## (4) Test할 Controller 생성하기 +### (4) Test할 Controller 생성하기 이제 REST Docs 사용을 위한 설정은 끝났으니 잘 작동하는지 controller와 test를 작성해서 직접 알아봅시다. 정말 간단하게 String 값을 return해주는 Get 요청 API를 하나 만들었습니다. @@ -229,7 +229,7 @@ public class RestDocsTestController { } ``` -## (5) API 테스트 코드 작성하기 +### (5) API 테스트 코드 작성하기 앞에서 작성한 API에 대해 테스트 코드를 작성해 봅시다. 원래 REST Docs 적용을 위해서는 andDo()를 사용하여 field에 대한 내용을 채워줘야하지만 상속받은 **AbstractRestDocsTests**에서 `BeforeEach`로 `.alwaysDo(restDocs)` 설정을 해주었기 때문에 `RestDocumentationResultHandler`가 알아서 실제 응답에 따라 API를 생성해 줍니다. @@ -253,7 +253,7 @@ class RestDocsTestControllerTest extends AbstractRestDocsTests { } ``` -## (6) adoc 문서 작성하기 +### (6) adoc 문서 작성하기 이제 adoc 문서만 작성하면 완성입니다! 앞에서 계속 봐온 `Asciidoctor`란 AsciiDoc을 HTML, DocBook 등으로 변환하기 위한 빠른 텍스트 프로세서(.adoc)로, 마크다운과 비슷한 문법을 가지고 있어 마크다운을 조금이라도 사용해본 사람이라면 금방 사용할 수 있습니다. @@ -265,7 +265,7 @@ class RestDocsTestControllerTest extends AbstractRestDocsTests { asciidoc 문법 참고 -### (1) index.adoc +#### (1) index.adoc 전체 코드를 연결해줄 홈 화면이라고 생각하면 됩니다. `include`를 통해 다른 파일을 연결할 수 있습니다. ``` @@ -279,7 +279,7 @@ class RestDocsTestControllerTest extends AbstractRestDocsTests { include::test.adoc[] ``` -### (2) test.adoc +#### (2) test.adoc RestDocsTestController에 대한 부분을 작성해 주었습니다. `operation`을 사용해 snippet의 디렉토리를 지정하고 뒤에 원하는 snippet 종류를 넣어주면 됩니다. ``` @@ -298,6 +298,7 @@ operation::rest-docs-test-controller-test/rest-docs-test[snippets="http-request, rest_docs_html +
> 참고
> https://spring.io/projects/spring-restdocs