Skip to content

Conversation

@GodUser1005
Copy link
Collaborator

@GodUser1005 GodUser1005 commented Jan 24, 2025

Sweepic Server PR List

close #81

⚒️develop의 최신 커밋을 pull 받았나요?

  • 최신 커밋 업데이트

🔍️ 이 PR을 통해 해결하려는 문제가 무엇인가요?

어떤 기능을 구현한건지, 이슈 대응이라면 어떤 이슈인지 PR이 열리게 된 계기와 목적을 Reviewer 들이 쉽게 이해할 수 있도록 적어 주세요
일감 백로그 링크나 다이어그램, 피그마를 첨부해도 좋아요

  • 날짜별 태그 모아보기
  • 태그로 이미지 검색
  • tsoa 설정, swagger 정적파일 자동생성, tsoa 라우터 자동생성

✨ 이 PR에서 핵심적으로 변경된 사항은 무엇일까요? (핵심 작업 내용)

문제를 해결하면서 주요하게 변경된 사항들을 적어 주세요

  • 날짜별 태그 모아보기 기능 내용

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

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

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

    • tsoaTag.repository.ts
      image
      DB와 상호작용하는 DAO
      사진 생성일인 createAt과 설정한 endDate 사이에 있는 사진들의 태그를 조회하도록 함
      조회순은 가나다순

  • 태그로 이미지 검색 기능 내용

    • image.controller.ts(tsoa를 앞에 붙여서 지나의 image.controller.ts랑 구분해야 할듯 함)
      image
      query parameter로 tag 내용을 입력 받도록 하였음
      userId를 path variable로 받는 부분도 위의 tag controller에서와 같은 이유로 없앨 예정

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

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

    • image.repository.ts(tsoaImage.repository.ts)
      image
      특정 태그가 붙은 이미지들을 조회 하도록 함

  • tsoaRoutes.ts
    해당 파일은 Controller에서 tsoa를 이용해 decorator를 사용하여 구현하면
    yarn tsoa routes -c ./config/tsoa.json 명령어를 이용해
    각 컨트롤러 파일별로 라우터 tsoaRoutes.ts 에 만들어준다.

    위 명령어는 ./config/tsoa.json에 설정된 내용을 통해 라우터 파일을 자동으로 생성해주는 명령어이다.
    해당 라우트 사용방법은
    app.ts 에서 tsoaRoutes.ts로 부터 RegisterRoutes를 임포트해 아래와 같이 등록만 해주면 된다.
    image

tsoa.json 설정 내용과 생성된 swagger 문서, package.json 수정 내용은 아래 핵심 변경사항 외에 추가 설명 부분에 설명함

🤚 동작 확인

기능을 실행했을 때 정상 동작하는지 여부를 확인하고 스크린 샷을 올려주세요

  • yarn compile
    image

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

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

  • 태그로 이미지 검색
    image
    여기서 response값중 id는 데이터베이스에서 image에 대한 id값으로 mediaId 와는 다른의미임
    id는 굳이 응답으로 내보내지 않고 mediaId만 내보내게 수정할 예정

    image '안녕' 이라는 내용을 가진 태그는 없음

🔖 핵심 변경 사항 외에 추가적으로 변경된 부분이 있나요?

없으면 "없음" 이라고 기재해 주세요

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

  • swagger.json(swagger json 문서)
    위 파일은 ./swagger/swagger.json의 경로를 가짐
    tsoa spec 명령어로 자동생성된 swagger.json 문서이며

    app.ts에서
    image
    다음처럼 주석처리한 부분처럼 사용할 수 있음

    /docs에 대해서 기존의 app.use를 주석처리하고 위의 내용을 사용하면 아래와 같이 swagger-ui 가 나옴
    image
    image

  • tsconfig.json
    기존의 module로 설정된 Node16은 json파일을 임포트하기 위해 여러 복잡한 작업을 거쳐야 함.(따라 해봤지만 잘 안됨...)
    swagger.json을 임포트하는 게 필요했기에 module을 Nodenext로 바꾸었음
    image

🙏 Reviewer 분들이 이런 부분을 신경써서 봐 주시면 좋겠어요

개발 과정에서 다른 분들의 의견은 어떠한지 궁금했거나 크로스 체크가 필요하다고 느껴진 코드가 있다면 남겨주세요

  • 천천히 보시고 궁금한 내용있으시면 리뷰남겨주세요
  • 저도 타입스크립트 처음이라 혹시 타입 관련해서 수정했으면 하는 내용도 있으면 리뷰남겨주세요

🩺 이 PR에서 테스트 혹은 검증이 필요한 부분이 있을까요?

테스트가 필요한 항목이나 테스트 코드가 추가되었다면 함께 적어주세요

📌 PR 진행 시 이러한 점들을 참고해 주세요

  • Reviewer 분들은 코드 리뷰 시 좋은 코드의 방향을 제시하되, 코드 수정을 강제하지 말아 주세요.
  • Reviewer 분들은 좋은 코드를 발견한 경우, 칭찬과 격려를 아끼지 말아 주세요.
  • Review는 특수한 케이스가 아니면 Reviewer로 지정된 시점 기준으로 2일 이내에 진행해 주세요.
  • Comment 작성 시 Prefix로 P1, P2, P3 를 적어 주시면 Assignee가 보다 명확하게 Comment에 대해 대응할 수 있어요
    • P1 : 꼭 반영해 주세요 (Request Changes) - 이슈가 발생하거나 취약점이 발견되는 케이스 등
    • P2 : 반영을 적극적으로 고려해 주시면 좋을 것 같아요 (Comment)
    • P3 : 이런 방법도 있을 것 같아요~ 등의 사소한 의견입니다 (Chore)


📝 Assignee를 위한 CheckList

  • To-Do Item

jjiinaaa and others added 30 commits December 24, 2024 00:00
[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
Copy link
Collaborator

@jonaeunnn jonaeunnn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍👍

Copy link
Contributor

@jjiinaaa jjiinaaa left a 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'};
Copy link
Contributor

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);
Copy link
Contributor

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 {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 tag 부분의 dto를 간단하게 썼는데 class 사용해서 만드셨네요. 혹시 이유가 있을까요?

export const selectImagesFromTag = async (
tag: string,
userId: bigint,
): Promise<Pick<Image, 'id' | 'mediaId'>[]> => {
Copy link
Contributor

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",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네, 인지했습니다.

Copy link
Collaborator

@Socializedistp Socializedistp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다!

Copy link
Collaborator

@asjasj3964 asjasj3964 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tsoa 설정 잘 봤습니다! 고생하셨습니다

Copy link
Collaborator

@codie0226 codie0226 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생 많으셨습니다! 확인 완료했습니다!

@GodUser1005
Copy link
Collaborator Author

응답통일과 여러 설정관련하여 추가한것이 많아져서 해당 내용들은 현재의 PR 말고 #114 여기에 내용을 추가하였으니 한번 확인 해보시면 좋을것 같습니다.
이부분에 스웨거 문서 생성에 대한 커스텀한 명령어의 내용도 포함이 되어있습니다

@GodUser1005 GodUser1005 merged commit 4d62580 into develop Jan 27, 2025
1 check passed
@GodUser1005 GodUser1005 deleted the feature/SWEP-60 branch January 27, 2025 19:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📝 DOCS 문서 및 주석 작업 ✨ FEAT 기능 구현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[SWEP-60] 날짜별 태그 모아보기, 태그 검색 API 구현, 스웨거 설정, tsoa 설정

7 participants