Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
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
Archives
Today
Total
관리 메뉴

빠르게 학습하고 빠르게 적용하자

SQL 채점 서비스의 문제 추천 성장기 본문

카테고리 없음

SQL 채점 서비스의 문제 추천 성장기

osoohynn 2026. 3. 19. 09:01

SQL 채점 서비스 기획 배경

저는 마이스터고 학생으로, 백엔드 개발자를 목표로 공부하고 있습니다. 평소 SQL에 관심이 많아 꾸준히 학습해왔지만, 생각보다 SQL 실력을 체계적으로 향상시키는 것이 쉽지 않다는 것을 느꼈습니다.

또한 주변 동기나 후배들을 보면 API 개발에 집중하면서 ORM을 주로 사용하다 보니, 기본적인 JOIN 쿼리조차 직접 작성해본 경험이 부족한 경우가 많았습니다.

이러한 모습을 보며 “SQL을 직접 연습할 수 있는 환경이 조금 더 쉽게 제공된다면 좋지 않을까?”라는 생각이 들었습니다. 그래서 별도의 환경 설정 없이 바로 SQL을 실행하고 채점까지 받을 수 있는 학습 서비스를 만들게 되었습니다.

서비스가 궁금하다면? https://querify.dev

다른 블로그가 궁금하다면? https://osoohynn.tistory.com/14

 

SQL 실력을 향상시키려면

SQL 실력을 향상시키려면 어떻게 해야할까요?

알고리즘 공부를 예로 들어보겠습니다. 알고리즘 실력을 키우기 위해서는 자신의 실력보다 약간 어려운 문제를 반복적으로 푸는 과정이 중요합니다. 이는 알고리즘뿐 아니라 대부분의 학습 영역에서 공통적으로 적용되는 방식입니다.

관련 참고 자료

 

유튜브 스앤프 - 일반인이 '재능충' 소리 듣는 법

https://www.youtube.com/watch?v=IPmOuKt4SR4

 

책 대니얼 코일 - 탤런트 코드

https://product.kyobobook.co.kr/detail/S000000408049

 

탤런트 코드 | 대니얼 코일 - 교보문고

탤런트 코드 | 타고난 유전자, 꾸준한 노력, 좋은 환경만으로 설명되지 않던 ‘재능 폭발’의 비밀을 밝히는 3가지 코드 ★ 2021 특별합본판 : 매뉴얼북 『재능을 폭발시키는 52가지 학습의 기술』

product.kyobobook.co.kr

 

이 자료들에서도 강조하는 개념이 바로 심층 연습(Deliberate Practice) 입니다. 단순히 문제를 많이 푸는 것이 아니라, 자신의 수준에 맞는 문제를 지속적으로 해결하는 과정이 실력 향상에 큰 도움을 줍니다.

그렇다면 알고리즘으로 예시를 들어볼까요? 자신의 실력보다 약간 어려운 문제를 많이 풀면 풀수록 실력이 늡니다. 꼭 알고리즘이 아니라 어떤 분야든 그렇다고 생각합니다.

 

문제 추천 시스템을 고민하게 된 이유

제가 알고리즘 문제를 풀면서 항상 느꼈던 고민이 하나 있습니다.

“지금 내 실력에 맞는 문제를 어떻게 찾지?”

너무 쉬운 문제는 실력 향상에 도움이 되지 않고, 너무 어려운 문제는 해결까지 시간이 오래 걸려 학습 흐름이 끊어집니다.

SQL 학습에서도 비슷한 문제가 발생할 것이라 생각했습니다. 사용자가 자신에게 적절한 난이도의 문제를 찾는 데 시간을 쓰기보다는, 문제 풀이 자체에 집중할 수 있는 환경이 필요했습니다.

 

그래서 사용자의 수준에 맞는 문제를 추천해주는 시스템을 서비스에 도입해보자는 아이디어가 떠올랐습니다. 궁극적인 목표는 단순히 문제를 푸는 것이 아니라, 사용자가 꾸준히 SQL을 연습하며 실력을 향상시키는 것입니다.이를 위해 사용자가 고민 없이 다음 문제를 풀 수 있도록 하여 문제 풀이 흐름을 끊지 않는 학습 경험을 제공하고자 했습니다.

우선 문제 추천 전에 유저 데이터를 분석했습니다. 우선 제가 예상했던 것처럼 유저 몇명의 행동 추적을 진행한 결과 문제를 연속적으로 풀지 않는 비율이 31%였고, 난이도가 비슷비슷한 문제만 계속 풀었습니다.

그럼 문제 추천 기능을 만들어서 이 가설을 검증해보려고 합니다! 너무 재밌을 것 같지 않나요?

 

구현 과정

단순히 난이도순으로 다음 문제를 보여주는 건 너무 단순하고, 유저마다 실력도 다르고 문제를 얼마나 쉽게 풀었는지도 다릅니다. 그래서 유저의 실력을 판단하는 요소로 지금까지 어떤 문제들을 풀었는가(제출 전체 조회)와 이번 문제를 얼마나 수월하게 풀었는가(풀이에 걸린 시간과 틀린 횟수) 둘을 블렌딩해서 지금 이 유저에게 가장 적절한 난이도를 추정하고, 거기에 가까운 문제를 찾습니다.

그리고 처음에는 문제를 맞춘 경우만 추천 문제를 보여주려 했으나 문제를 포기했을 경우에도 보여주면 새로 도전할 동기가 생길 것 같다고 생각했습니다. 따라서 문제를 맞혔을 때는 비슷하거나 더 어려운 난이도의 문제들을, 못 풀고 나가려 할 때는 비슷하거나 더 쉬운 문제들을 추천해주고자 하였습니다.

 

유저 실력 추정

전체 히스토리에서 가중 평균 난이도를 계산합니다. 우선 기존 문제의 난이도는 1~5였는데요, 이는 실제 실력은 분별하기에는 너무 좁은 범위였기에 추천 시스템이 잘 동작하지 않을 경우를 우려했습니다. 따라서 기존에 들어있던 문제의 난이도를 Claude 에게 분석하여 1~20으로 재정비하였습니다.

핵심은 분모의 1 + ln(wrongCount + 1)입니다. 틀린 횟수의 영향이 선형이 아니라 로그 스케일로 체감되기 때문에, 극단적인 케이스에서도 안정적으로 동작합니다.

난이도 5 문제 기준

  틀린 횟수 기여도
한 번에 정답 0회 5.0
어느 정도 시행착오 3회 3.6
많이 틀림 10회 2.7

또한 전체 제출이 아닌 최근 100건으로 제한한 이유는 응답 속도 확보와 함께, 최근 풀이 맥락이 실력을 더 잘 반영하기 때문입니다.

 

타겟 난이도 계산

현재 문제 난이도 D, 이번 문제 틀린 횟수 W를 기준으로 조정값 Δ를 계산합니다.

 

정답 시 (SOLVED)

W Δ 의미
0 +2 완벽하게 풀었으니 두 단계 위로
1~2 +2 완벽하진 않지만 잘 풀었기에 두 단계 위로
3~5 +1 살짝 힘들었으니 한 단계만
6+ +0 많이 버벅였으니 같은 레벨

 

포기 시 (LEAVING)

전체 실력과 블렌딩해서 최종 타겟 난이도를 구합니다.

0.3 × (skill - D) 항이 현재 문제가 유저 실력 대비 너무 쉽거나 어려웠을 때를 보정합니다. 예를 들어 실력이 10인데 난이도 3짜리를 풀었다면 타겟이 위로 당겨집니다.

 

후보 문제 점수화

이미 맞춘 문제를 제외한 모든 문제에 대해 점수를 매깁니다.

  • 난이도 적합도: 타겟과 가까울수록 높은 점수. 지수 1.5를 적용하여 거리가 멀어질수록 급격히 감소
  • 인기도 보정: 다른 사용자가 많이 푼 문제에 약간의 가산점 (로그 스케일, 상한 20점)
  • 재시도 패널티: 이전에 시도했다 실패한 문제는 후순위로 밀림 (완전 제외는 하지 않음)

상위 3문제를 단순 점수순으로 반환하지 않고, 타겟 난이도 근처 문제 2개 + 타겟보다 1~3단계 높은 도전 문제 1개로 구성합니다. 같은 난이도 내에서 동점인 후보들은 랜덤으로 선택하여 매번 다른 문제가 추천되도록 합니다. 도전 문제를 포함한 이유는 자신의 수준보다 약간 어려운 문제를 풀어야 실력이 향상된다는 심층 연습 원리에 기반합니다.

 

트리거 시점

GET /problems/{problemId}/recommendations?trigger=SOLVED
GET /problems/{problemId}/recommendations?trigger=LEAVING
  • SOLVED에는 채점 결과 정답을 받은 직후. 비슷하거나 더 어려운 문제를 추천
  • LEAVING에는 유저가 문제 페이지를 벗어나려 할 때. 비슷하거나 더 쉬운 문제를 추천

LEAVING은 문제를 구경만 하고 나가는 경우를 제외하기 위해, 1분 이상 체류한 경우에만 호출합니다.

복잡한 ML 없이 세 가지 직관적인 신호(전체 실력, 현재 퍼포먼스, 문제 인기도)를 수식으로 조합했습니다. 실력 추정에 로그 스케일 페널티를 쓴 게 핵심인데, 틀린 횟수의 영향이 선형이 아니라 체감되도록 설계해서 극단적인 케이스(100번 틀리고 맞춤)에도 안정적입니다.

 

 

며칠 후 구축해둔 로그 인프라를 통해 확인해보니 이탈율이 31% -> 21%로 감소하였습니다~!!

 

느낀 점 및 회고

문제 추천 같은 경우에는 제 스스로 정말 좋다라고 느끼는 공식을 적용해서 만들었습니다. 이후에는 유저를 더 수집해보고 A/B테스트 환경을 구축하고 어떤 공식과 어떤 문제들이 실력향상에 유의미한 영향을 주는지 통계를 낼 것입니다. 이 통계는 유저에게 전달해주어도 동기부여 요소로서 흥미로운 포인트가 될 것 같네요!!

꾸준히 운영하고 데이터를 수집하여 성과가 나오거나 재미있는 사실을 발견한다면 블로그 업데이트 하겠습니다. :) 저는 얼른 홍보 자료도 제작을 해서 SQL에 관심있는 더 많은 분들이 서비스를 통해 성장할 수 있었으면 좋겠습니다!