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

[Feat]: Article 조회(단건, 페이징) API 설계 #11

Merged
merged 18 commits into from
Jan 21, 2024
Merged

Conversation

jihwan2da
Copy link
Member

@jihwan2da jihwan2da commented Jan 20, 2024

Issue

resolve #7

작업사항

  • querydsl 설정
  • 게시글 상세 페이징 조회 쿼리 작성
  • OpenFeign 설정
  • User Internal 조회 Client 구현
  • 게시글 상세 조회 Usecase, Controller 구현
  • 디렉토리 구조 및 파일 네이밍 리팩토링
    • application 모듈( ~Request, ~ Response 통일)
    • persistence 모듈 (조회 모델: ~Data 통일)
  • 좋아요 로직 수정( aritlce likecount 반영 안되거 고침)

TODO

  • 게시글 단건 조회 API 구현

@jihwan2da jihwan2da self-assigned this Jan 20, 2024
Comment on lines +10 to +11
val countryName: String?,
val countryImage: String?,
Copy link
Member Author

Choose a reason for hiding this comment

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

기존 회원들 중에 국가 설정을 못한 회원들이 있기 때문에 nullable 타입으로 설정하였습니다.

Comment on lines +18 to +44
override fun getArticleDetailPage(request: ArticleDetailPageGetRequest): PageResponse<ArticleDetailResponse> {
val articleDetailUnitPage = articleQueryPersistencePort.findArticleDetailUnitPageByCategoryId(
categoryId = request.categoryId,
userId = request.userId,
size = request.size,
page = request.page,
order = request.order
)

val userPreviewUnits = userQueryPort.getUserPreviewUnits(
userIds = articleDetailUnitPage.contents.map { it.userId }.toSet()
)

return PageResponse(
totalCount = articleDetailUnitPage.totalCount,
currentCount = articleDetailUnitPage.currentCount,
totalPage = articleDetailUnitPage.totalPage,
currentPage = articleDetailUnitPage.currentPage,
contents = articleDetailUnitPage.contents
.map {
ArticleDetailResponse(
article = it,
writer = userPreviewUnits[it.userId]!!
)
}
)
}
Copy link
Member Author

Choose a reason for hiding this comment

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

현재 게시글 Detail 페이징 조회에 대한 처리 구조는 아래와 같습니다.

  1. Article에 대한 Community Rdb에서 한방 쿼리로 조회
  2. 기존 모놀로틱 서버(Gloddy 서버)에서 게시글 작성자 id에 대한 일괄 조회
  3. 두개 데이터를 알맞는 Response로 변환

위의 처리 구조는 임시로 개발한 형태입니다. 이후 dynamodb로 조회에 대한 데이터를 중첩데이터로 저장할 예정입니다. 이유는 다음과 같습니다.
1. 위의 구조는 기존서버와 커뮤니티 서버와의 시스템 간 강한결합 문제가 존재합니다.
Gloddy 서버에 대한 오류 및 성능 저하로 인해 커뮤니티 서버의 게시글 조회에 영향이 갑니다.
커뮤니티 서버가 Gloddy 서버 성능에 영향을 줍니다.

따라서 위의 강한 결합 및 조회 성능을 높이기 위해 미래에 아래와 같은 구조로 변경할 것입니다.

  1. Gloddy 서버에 존재하는 user 정보를 분산 환경(dynamodb)로 저장(배치를 활용할 예정)
  2. 게시글 저장 시 중첩데이트(aritlce, writer)를 dynamodb에 key value 형태로 저장
  3. 유저 정보에 대한 정합성 처리(update가 일어나면)는 dynamodb의 글로벌 보조 인덱스(인덱스를 userId로 설계)를 활용하여 처리할 예정

Comment on lines +43 to +47
.leftJoin(articleLikeJpaEntity)
.on(
articleJpaEntity.id.eq(articleLikeJpaEntity.article.id)
.and(articleLikeJpaEntity.userId.eq(userId))
)
Copy link
Member Author

Choose a reason for hiding this comment

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

AritlceLikeEntity의 articleId와 userId의 복합 유니크 한 성격을 이용하여 leftJoin 및 on(articleId, userId)을 활용하여 좋아요 여부를 판별하도록 하였습니다.(null일 경우 -> 좋아요 여부 false, null이 아닐 경우 좋아요 여부 true)

@jihwan2da jihwan2da merged commit 7c7a483 into dev Jan 21, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Article Read API 설계
1 participant