-
Notifications
You must be signed in to change notification settings - Fork 6
[SWEP-60] 날짜별 태그 검색 API, 태그로 이미지 검색 API 기능 구현과 여러 설정 #85
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
Conversation
[SWEP-6] Jira Autumation Test
* Update 기능-구현.md * Update 버그-해결.md * Update 사용자-정의.md
* [SWEP-14] 초기설정 * [SWEP-14] Readme 파일 작성 (코드 컨벤션 제외) * [SWEP-14] Readme 파일 수정 (이미지 삽입 및 내용 수정)
* [SWEP-22] DB url 및 패스워드 변경 * [SWEP-22] PR 테스트 및 CI/CD 파이프라인 작성 * [SWEP-22] CI/CD 파이프라인 수정 (EC2 서버에 yarn 설치) * [SWEP-22] EC2 서버에 관리자 권한으로 yarn 설치 * [SWEP-22] 항상 마이그레이션을 실행하도록 수정 * [SWEP-22] start 스크립트 수정 * [SWEP-22] systemd 서비스 파일에서 작업 디렉토리 명시적 지정 * [SWEP-22] prisma migrate 조건 다시 적용 * [SWEP-22] RDS 설정 및 Prisma 동기화 파이프라인 추가 * [SWEP-22] RDS 환경 변수 설정 수정 * [SWEP-22] RDS 환경 변수 설정 에러 수정 * [SWEP-22] RDS 환경 변수 설정 에러 수정 * [SWEP-22] RDS 환경 변수 설정 에러 수정 * [SWEP-22] RDS 환경 변수 디버깅 * [SWEP-22] EC2 서버 .env에 RDS 환경 변수 설정 * [SWEP-22] RDS prisma migrate 테스트 * [SWEP-22] RDS prisma migrate 테스트 * [SWEP-22] RDS prisma migrate 테스트 완료 후 다시 조건 적용 * [SWEP-22] RDS prisma migrate 테스트 * [SWEP-22] RDS prisma migrate 테스트 * [SWEP-22] RDS prisma migrate 테스트 * [SWEP-22] ssh/config 수정 (SSH 네트워크 연결 끊김 방지) * [SWEP-22] 로컬과 원격 DB (rds) 연결 * [SWEP-22] 로컬과 원격 DB (rds) 연결 * [SWEP-22] RDS migrate dev 성공 * [SWEP-22] CI/CD 파이프라인 구축 완료 * [SWEP-22] main만 PR test 하도록 수정 * [SWEP-22] develop 브랜치로의 PR만 test 하도록 수정 * [SWEP-22] db.config.ts 수정 * [SWEP-22] readme 기술 스택 추가
* [SWEP-28] GTS(Google Typescript Style) 연결결 * [SWEP-26] 리드미 파일 추가 * [SWEP-28] GTS 번역본 등록 * [SWEP-28] lint 실행 에러 해결결 * [SWEP-28] lint 에러 재해결 * [SWEP-28] yarn.cmd 수정정 * [SWEP-28] lint, fix 시 parser 에러 해결 * [SWEP-28] 컴파일 결과물 파일 미생성
* fix: 빌드 시 스웨거 문서 미복사 문제 해결 (#27) * [SWEP-28] GTS(Google Typescript Style) 연결결 * [SWEP-26] 리드미 파일 추가 * [SWEP-28] GTS 번역본 등록 * [SWEP-28] lint 실행 에러 해결결 * [SWEP-28] lint 에러 재해결 * [SWEP-28] yarn.cmd 수정정 * [SWEP-28] lint, fix 시 parser 에러 해결 * [SWEP-28] 컴파일 결과물 파일 미생성 * [SWEP-35] Swagger 도메인 연결 (/api-docs) * [SWEP-35] Swagger 연결 에러 해결결 * fix: 불필요 라이브러리 해제 * [SWEP-35] Swagger host 변경 * [SWEP-35] build 에러 (swagger 미복사 문제) * [SWEP-35] 워크플로 브랜치 변경 (test 시 develop으로 변경을 원위치) * fix: 오타 해결 * [SWEP-35] tsconfig.js에 빌드 파일 제외
chore: prisma 스키마 생성 및 RDS 마이그레이션 적용
* [SWEP-43] AWS S3 클라이언트 설정 및 파일 관리 함수 구현 * [SWEP-42] req.file MulterS3File 타입 지정, 구조분해 및 Shorthand Property 적용 * [SWEP-42] express-async-handler 삭제
fix: Session 테이블 수정 및 마이그레이션 파일 추가
[SWEP-51] Session 테이블 수정 및 마이그레이션 추가
[SWEP-37] 위치 기반 챌린지 API
jonaeunnn
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍👍
jjiinaaa
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
구조 분해 할당할 수 있는 부분 몇 군데 보이고, shorthand property할 수 있는 부분도 몇 군데 보이는거 같아요! 코드 간결성에 좋습니다.
태그 부분은 저랑 겹치는데, 추후에 최적화 시에 합치면 될 거 같고요. 저는 간단하게 작업했는데 링크는 세세하게 작업하셨네요. 좋습니다~
참고로, tsoa가 무엇이냐면 타입스트립트로 하는 저희 노드 프로젝트를 스웨거에서 인식이 더 잘 될 수 있고 간편하게 문법만 바꾸면 주석 처리 안해도 등록되게 하는 라이브러리입니다. 제가 2월에 최적화할 때 하려고 미리 설치해놨는데 링크가 초기 작업을 해주셨네요! 2월에 컨트롤러 파일을 이렇게 바꿀 거라서 한 번씩 봐주는 것도 좋을 거 같습니다 ~
src/app.ts
Outdated
| import session from 'express-session'; | ||
| import {PrismaSessionStore} from '@quixo3/prisma-session-store'; | ||
| import {prisma} from './db.config.js'; | ||
| import swaggerDocument from '../swagger/swagger.json' assert {type: 'json'}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분이 문제이군요. 남겨두겠습니다 ~
src/app.ts
Outdated
|
|
||
| app.use('/memo', memoFolderRouter); | ||
|
|
||
| RegisterRoutes(app); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거는 뭔가요?
| @@ -0,0 +1,15 @@ | |||
| export class DateToTags { | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저는 tag 부분의 dto를 간단하게 썼는데 class 사용해서 만드셨네요. 혹시 이유가 있을까요?
src/repositories/image.repository.ts
Outdated
| export const selectImagesFromTag = async ( | ||
| tag: string, | ||
| userId: bigint, | ||
| ): Promise<Pick<Image, 'id' | 'mediaId'>[]> => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 타입은 뭔가요??
| "moduleResolution": "Node16", | ||
| "module": "Node16", | ||
| "noEmit": true | ||
| "moduleResolution": "Nodenext", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네, 인지했습니다.
Socializedistp
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
확인했습니다!
asjasj3964
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tsoa 설정 잘 봤습니다! 고생하셨습니다
codie0226
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생 많으셨습니다! 확인 완료했습니다!
날짜기반 태그검색, 태그기반 이미지검색 응답 통일, 스웨거 수정, 깃 워크플로우 수정
|
응답통일과 여러 설정관련하여 추가한것이 많아져서 해당 내용들은 현재의 PR 말고 #114 여기에 내용을 추가하였으니 한번 확인 해보시면 좋을것 같습니다. |
Sweepic Server PR List
close #81
⚒️develop의 최신 커밋을 pull 받았나요?
🔍️ 이 PR을 통해 해결하려는 문제가 무엇인가요?
✨ 이 PR에서 핵심적으로 변경된 사항은 무엇일까요? (핵심 작업 내용)
날짜별 태그 모아보기 기능 내용
tsoaTag.controller.ts

(tsoa로 붙인이유는 추후 태그관련 API를 tsoa로 통합할 예정인데 그전에 파일 구분을 위함임)
특정 날짜에 찍은 사진에 대한 태그들을 모아 보려면 query parameter로 year, month, date의 값을 입력하도록 코드 작성
만약 어떤 월에 찍은 사진에 대한 태그들을 모아 보려면 query parameter로 year, month 만 주면 내부로직(service layer)이 인식하도록 함
userId는 path parameter로 따로 받게 하였으나 로그인 인증기능 완료시 해당 userId는 뺄 예정
tsoaTag.service.ts

날짜관련 해서 date가 있으면 날짜기반, date가 없으면 어떤 월의 태그들을 볼 수 있게 나누었음
date를 받았는지 안받았는지에 대한 여부는 DateToTags라는 클래스로 만든 DTO내부에 boolean 필드로 구분짓게 하였음
tsoaTag.dto.ts

클래스로 DTO를 만든 이유는 타입 지정과 객체 생성이 가능하며
DTO를 통해 생성자 함수에서 특정 로직(유효성검사 등)을 실행하여
잘못된 요청이 들어올 때 하위 layer로 가지않고 바로 에러를 던지도록 할 수 있음
(추후 응답형식도 클래스로 만들면 확장성 측면에서 좋아보임)
tsoaTag.repository.ts

DB와 상호작용하는 DAO
사진 생성일인 createAt과 설정한 endDate 사이에 있는 사진들의 태그를 조회하도록 함
조회순은 가나다순
태그로 이미지 검색 기능 내용
image.controller.ts(tsoa를 앞에 붙여서 지나의 image.controller.ts랑 구분해야 할듯 함)

query parameter로 tag 내용을 입력 받도록 하였음
userId를 path variable로 받는 부분도 위의 tag controller에서와 같은 이유로 없앨 예정
image.service.ts(tsoaImage.service.ts)

mediaId는 8자리로 이루어진 사진의 고유 ID를 의미함
resultBigintToString은 데이터베이스로 부터 bigint로 전달받은 내용을 json이 이해가능한 string 타입으로 변환을 위해 사용됨
image.dto.ts(tsoaImage.dto.ts)

클래스로 RequestTagSearch DTO를 만들었으며
string인 userId를 bigint로 변환하여 내부에서는 bigint로 연산하게 하고
내보낼 때는 string으로 변환하여 json으로 내보냄
image.repository.ts(tsoaImage.repository.ts)

특정 태그가 붙은 이미지들을 조회 하도록 함
tsoaRoutes.ts
해당 파일은 Controller에서 tsoa를 이용해 decorator를 사용하여 구현하면
yarn tsoa routes -c ./config/tsoa.json 명령어를 이용해
각 컨트롤러 파일별로 라우터 tsoaRoutes.ts 에 만들어준다.
위 명령어는 ./config/tsoa.json에 설정된 내용을 통해 라우터 파일을 자동으로 생성해주는 명령어이다.

해당 라우트 사용방법은
app.ts 에서 tsoaRoutes.ts로 부터 RegisterRoutes를 임포트해 아래와 같이 등록만 해주면 된다.
tsoa.json 설정 내용과 생성된 swagger 문서, package.json 수정 내용은 아래 핵심 변경사항 외에 추가 설명 부분에 설명함
🤚 동작 확인
yarn compile

특정 날짜에 찍은 사진들의 태그 모아보기

특정 달에 찍은 사진들의 태그 모아보기

태그로 이미지 검색

여기서 response값중 id는 데이터베이스에서 image에 대한 id값으로 mediaId 와는 다른의미임
id는 굳이 응답으로 내보내지 않고 mediaId만 내보내게 수정할 예정
🔖 핵심 변경 사항 외에 추가적으로 변경된 부분이 있나요?
tsoa.json(tsoa 설정 파일)

위 파일은 ./config/tsoa.json 의 경로를 가짐
여기서 controllerPathGlobs에 적힌 파일의 controller가 tsoa로 decorator로 적혀있다면
tsoa spec 또는 tsoa routes 명령어가 실행 되었을 때 API 문서를 자동 생성해주거나 라우터 파일을 자동 생성해줌
swagger.json(swagger json 문서)
위 파일은 ./swagger/swagger.json의 경로를 가짐
tsoa spec 명령어로 자동생성된 swagger.json 문서이며
app.ts에서

다음처럼 주석처리한 부분처럼 사용할 수 있음
/docs에 대해서 기존의 app.use를 주석처리하고 위의 내용을 사용하면 아래와 같이 swagger-ui 가 나옴


tsconfig.json

기존의 module로 설정된 Node16은 json파일을 임포트하기 위해 여러 복잡한 작업을 거쳐야 함.(따라 해봤지만 잘 안됨...)
swagger.json을 임포트하는 게 필요했기에 module을 Nodenext로 바꾸었음
🙏 Reviewer 분들이 이런 부분을 신경써서 봐 주시면 좋겠어요
🩺 이 PR에서 테스트 혹은 검증이 필요한 부분이 있을까요?
📌 PR 진행 시 이러한 점들을 참고해 주세요
📝 Assignee를 위한 CheckList