20210925 (42Sof 특정 게시글 조회)

1. 전체 학습시간

오후 09:00 ~ 오후 11:00

2. 학습 목표

42StackOverFlow 기능 구현 및 특정 게시글 페이지가 어떤 데이터가 필요하고 어떻게 구현할지 생각하기

3. 학습 방법

하인호랑 디스코드로 대화

4. 다음 학습 목표

질문 페이징 기능 추가

5. 상세 학습 내용

REST API 문서 수정 및 질문 게시글 조회할 때 필요한 데이터를 가져오는 방법에 대해 고민

특정 질문 게시글 조회하기


서버에서 가져와야 할 데이터들

  • 질문 게시글 (Question Table)
  • 질문 게시글에 달린 해시테그 (리스트) (Answer Table)
  • 질문 게시글에 달린 댓글 (리스트) (Comment Table)
  • 질문 게시글을 답변하는 답변 게시글 (리스트) (Answer Table)
  • 질문 게시글을 작성한 사람의 이메일 (User Table)
  • 답변 게시글에 달린 댓글 (Comment Table)
  • 답변 게시글을 작성한 사람의 이메일 (User Table)

DB에서 가져오는 방법

JOIN 사용

JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현

조인 방법 예시

Mysql

 SELECT *
 FROM  Markdown.questions Q 
 
 INNER JOIN  Markdown.users U 
 ON U.id = Q.userId
 
 INNER JOIN Markdown.questions_hash_tag_hashtag QH 
 ON QH.questionsId = Q.id 
 
 INNER JOIN Markdown.hashtag H 
 ON H.id = QH.hashtagId 
 
 WHERE Q.id = 1

TypeOrm JOIN 방법

const getQuestionDetailPage = async (questionId) => {
	const queryRunner = await getQueryRunner();
	const queryBuilder = queryRunner.manager
		.getRepository(Question)
		.createQueryBuilder('question')
		.where('question.id = :questionId', { questionId })
		.innerJoinAndSelect('question.user', 'user')
		.innerJoinAndSelect('question.hashTag', 'hashTag')
		.leftJoinAndSelect('question.comment', 'comment')
	const questionInfo = await queryBuilder
		.disableEscaping()
		.getMany();

	const queryBuilder2 = queryRunner.manager
		.getRepository(Answer)
		.createQueryBuilder('answer')
		.where('answer.questionId = :questionId', { questionId })
		.innerJoinAndSelect('answer.user', 'user')
		.leftJoinAndSelect('answer.comment', 'comment')
	const answerInfo = await queryBuilder2
		.disableEscaping()
		.getMany();

	return {
		questionInfo: questionInfo,
		answerInfo: answerInfo
	}
}

좋은 웹페이지 즐겨찾기