Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

setup-Swagger #125

Open
wants to merge 8 commits into
base: dev
Choose a base branch
from
Open

setup-Swagger #125

wants to merge 8 commits into from

Conversation

useruseruse
Copy link
Contributor

@useruseruse useruseruse commented Jul 31, 2024

  • 서버 시작하고 localhost:8000/docs 로 들어가면 엔드포인트 및 쿼리 파람 보실 수 있습니다.
  • 기본적으로는 .dto, .controller.ts 로 끝나는 것들만 인식하고, FileNameSuffix 옵션 이용해 특정 접미사를 스웨거에서 컨트롤러나 dto 로 인식하도록 추가할 수도 있습니다

플러그인을 활성화하면 플러그인이 등록된 파일 접미사로 컨트롤러나 DTO, 엔티티를 식별하여 Abstract Syntax Tree를 기반으로 적절한 데코레이터를 추가합니다. 플러그인은 다음과 같은 문서화 정보들을 자동으로 추가합니다.

참고

image

TODO

  • RQ 로 마이그레이션 하는 페이지의 api 들부터 controller return 타입 점진적으로 달 예정입니다.

@useruseruse useruseruse self-assigned this Jul 31, 2024
@useruseruse useruseruse changed the title setup setup-Swagger Jul 31, 2024
@LarryKwon
Copy link
Contributor

이거 근데 방금 봤는데, response 타입이 달려있어도 안 뜨는거 같은데, 혹시 Promise로 감싸져있으면 안 잡히는건가?
image
image

@useruseruse
Copy link
Contributor Author

useruseruse commented Jul 31, 2024

Aㅏ 제가 방금 확인해봤는데 typescript interface 나 type 로 정의된 DTO 타입들은 런타임에 존재하지 않아서 인식이 안되고, class 로 바꾸면 인식이 되네요.
interface DTO 를 쓰는 파람들도 다 인식이 안되고요.
ts plugin 에서 그런 것들을 수행해주는 줄 알았는데.. 아닌가봐요

관련이슈들
1
2
3

대애충 해결방법은 아래 정도 인거 같은데 좀 더 찾아봐야 할 거 같아요ㅜ

  1. class 로 일일이 다 바꾸거나
  2. typescript interface 에서 class 로 바꿔주는 외부 라이브러리?를 쓰거나

@LarryKwon
Copy link
Contributor

클래스로 바꾸는 건 못할 거 같은데... 지금 동엽님이 한 작업이 클래스를 인터페이스로 바꾼 작업을 다 한 거라..
타입 체크할 때는 가벼운 인터페이스 쓰기도 하고,prisma에서 선택해온 결과(select)가 타입 alias로 되어있어서 그거랑 유연하게 맞추려고 인터페이스로한 것도 있어서...

@LarryKwon LarryKwon marked this pull request as draft August 1, 2024 12:37
@LarryKwon
Copy link
Contributor

LarryKwon commented Aug 1, 2024

https://chatgpt.com/share/d49c51c4-abad-485d-a8b1-4065a2a4c983

이거 참고

@useruseruse
Copy link
Contributor Author

오 제공해주신 gpt 문서 읽어봤는데 ts-morph라는 라이브러리가 compile time 에 Typescript AST 분석해서 interface DTO들에 적절한 데코레이터 달아주는 내용 같네요.
근데 스웨거에서 인식을 못하는 게 런타임에 interface 로 정의된 DTO들이 사라져서 그런거고 @ApiResponse 데코레이터들도 class 에만 달 수 있는 걸로 알고 있어요

@useruseruse
Copy link
Contributor Author

대신에 tsoa 라는 라이브러리를 쓰면 typescript api interface 도 스웨거에서 볼 수 있는 것 같은데, get, query 같은 nest 데코레이터들을 싹다 tsoa 에서 import 하게 바꿔야 하는 것 같아서 좋은 방법은 아닌 것 같다는 생각이 드네요.
2
1
image

@useruseruse
Copy link
Contributor Author

useruseruse commented Aug 1, 2024

스웨거를 안달고 type 말아서 패키지로 배포한다고 해도 controller method return 타입을 달아주는 건 필요해보이는 것 같아서,
프론트에서 마이그레이션 하는 페이지부터 return type 달아주고, swagger 는 일단 더 알아보는 것 어떨까요?

@LarryKwon
Copy link
Contributor

API Response에 타입 다 달아놨습니다. @useruseruse

다음은 작업 시에 참고할 점입니다.

  • API Response들 보면 대부분 Promise로 감싸져있을텐데, AST 분석할 때 Promise 안에 있는지 없는지 체크
  • 타입이 정의되기보다는 바로 object 형식으로 만들어서 달아놓은 것들이 몇 개 있는데, (eg. { prop1: ~~, prop2: ~~, } 이런 식) 분석이 잘 안 되면 타입 만들어달라고 해주세요.
  • api 중에서 일부는 repository에서 온 응답값 그대로 쓰는 것도 있고, I~~로 시작하는 애들처럼 만들어쓰는 애들이 섞여있어요.
  • 시험 삼아, 제 개인 npm registry 일단 Publish 해봤는데, 슬랙 채널 쓰레드 보고 계정 변경 부탁
  • 일단은 대충해보려고 common에 package.json 만들어서 패키지화했는데, 거기에 배포 굳이 안 해도 될 애들도 들어있어서... 구분 필요하거나 모르겠는거 있으면 얘기해주세요. (일단 거기에 Entity, interface 다 들어있기는 해요.)
  • post 요청 같은거 할 때 쓰는 request body를 class로 관리하고 있는데, 이 때 class-validator라는 패키지를 써서 각 Property 값을 체크해요. 이 패키지에 대한 의존성이 있도록 설정하고, 패키지 말아서 배포해야할 거 같아요.
  • AST 분석하는 파일은 일단 임시로 common 안에 만들어놓기는 했는데 한 번 확인해주고, 위치는 마음대로 옮겨도 될 거 같아요. 제 생각에는 각 api별 parameter, response 명시해놓은 TS 파일도, 타입 배포하는 거랑 같은 패키지로 말아서 올리는게 나을 거 같아서 일단 거기 놔두긴 함. 보고 의견 주세요

@useruseruse useruseruse removed the request for review from jooyeongmee August 3, 2024 13:32
@useruseruse
Copy link
Contributor Author

@LarryKwon common/api-docs/type.ts 폴더가 아웃풋이고
ts-node src/common/api-docs/docs-generator.ts 요렇게 실행하면 types.ts 폴더 만들 수 있습니다.
다른 feature controller 중에 메쏘드이름이 겹치는게 있어서, (getLectures) 프론트엔드에서 검색하기 편하도록 하려면

  1. controller method 네임을 다같이 변경하거나 아니면 namespace 만들때 HttpMethod + 컨트롤러 메쏘드 명 이런식으로 변경하면 될 거 같습니다.
  2. 타입이 없는 경우에는 일단 never 타입으로 했습니다.
    리뷰 부탁드려요오

@useruseruse useruseruse removed the request for review from yumincho September 15, 2024 17:16
@useruseruse useruseruse marked this pull request as ready for review September 15, 2024 17:16
@LarryKwon LarryKwon closed this Sep 16, 2024
@LarryKwon LarryKwon reopened this Sep 16, 2024
@useruseruse useruseruse reopened this Sep 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants