티스토리 뷰

728x90
반응형

안녕하세요 재귀함수를 실제 사례에서 사용되어지는 예제를 가지고 이야기해보도록 하겠습니다.

 

함수 안에서 자신의 함수를 호출할 때 재귀함수라고 부릅니다.

 

그렇다면 QnA 예시를 통해 재귀함수에 대해서 살펴 봅시다.

 

QnA 구조

id  group depth  writer  title desc created_at  updated_at

이렇게 QnA 구조를 설정했을 때  group과 depth 필드는 다음과 같습니다.

group 필드는 질문 하나와 그 질문에 달린 답변들이 하나의 group이고

depth는 질문이 depth 0을 기준으로 그 아래 달린 답변들 순서대로 depth 1씩 증가합니다.

QnA 구조의 gourp과 depth의 예시

 

재귀함수를 사용하여 QnA 데이터 return하기

 QnA구조에서 group 별로 depth가 0을 기준으로 하여 depth 0 객체 안에 depth가 1인 children을 넣어주고 depth가 1인 object 안에 다시 depth가 2인 chilren을 넣어주는 식으로 작성해보겠습니다.

 

1. depth가 0인 데이터들을 다 찾는다.

2. rootQnA값들을 각각 함수를 사용하여 chilren 값들을 넣어준다.

	
    //1. depth가 0인 QnA들을 다 찾는다.
    const rootQnA = await this.prisma.$queryRaw<qna[]>`
	  SELECT * FROM qna WHERE qna.depth = 0
    `

    //2. rootQnA값들을 각각 함수를 사용하여 chilren 값들을 넣어준다.
    const parent: ResponseSearchQnAData[] = []
	  for (let i = 0; i < rootQnA.length; i++) {
	  	const chilren = await this.searchChildQna(1, rootQnA[i])
	  	parent.push(chilren)
	  }

 

rootQnA의 chilren값들을 찾는 함수는 다음과 같습니다.

  1. 각 group의 maxDepthNum을 찾는다.

  2. 부모값의 depth+1이 chilren이므로 같은 그룹의 chilren 값을 찾는다.
  3. chilrend 값을 찾은 후 부모 값에 child key값에 chilren 값을 넣어준다.
  4. children의 depth +1 만큼 재귀함수를 maxDepthNum까지 사용한다.
  5. maxDepthNum까지 함수를 돌렸으면 값을 return한다.

async searchChildQna(depthVar: number, parent: qna & any): Promise<ResponseSearchQnAData> {
	
    //1. 각 group의 maxDepthNum을 찾는다.
	const {_max: { depth: maxDepthNum }} 
      = await this.prisma.qna.aggregate({
	  _max: {
	  	depth: true,
	  },
	  where: {
	  	bgroup: parent.group,
	  },
	})

	let child: dl_qna | null
    
    //2. 부모값의 depth+1이 chilren이므로 같은 그룹의 chilrend 값을 찾는다.
    //3. chilrend 값을 찾은 후 부모 값에 child key값에 chilren 값을 넣어준다.
    //4. children의 depth +1 만큼 재귀함수를 depth가 maxDepthNum까지 사용한다.
    //5. maxDepthNum까지 함수를 돌렸으면 값을 return한다.
    
	if (depthVar <= depthMaxNum) {
	  const child = await this.prisma.qna.findFirst({
	  	where: {
	  	  depth: depthVar,
	  	  bgroup: parent.group,
	  	},
	  })
        
	  if (child) {
	    parent.child = child
	    await this.searchChildQna(child.depth + 1, child)
	  }
	  return parent
	}
	return parent
	}
}

 

 

결론

이와 같이 자신의 함수를 계속 사용하여 반복되는 작업을 하는 재귀함수에 대해 살펴보았습니다.

재귀함수의 중요포인트는 자신의 값을 인자로 받아서 원하는 결과 값을 얻을 때 까지 작업을 반복하는 특성이 있습니다.

부족하지만 재귀함수에 대해서 배우고 사용한 것에 대해 나누어보았습니다.

728x90
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함