가이드

워드프레스 데이터베이스 wp_commentmeta 테이블 정리로 사이트 속도 향상

  • 16 읽는 데 몇 분 소요
  • Hostragons 팀
워드프레스 데이터베이스 wp_commentmeta 테이블 정리로 사이트 속도 향상

워드프레스 데이터베이스 wp_commentmeta 테이블 정리로 사이트 속도 향상은 댓글에 대한 불필요한 메타 데이터를 제거하여 데이터베이스 쿼리를 경량화하는 작업입니다. 특히 스팸 댓글의 잔재, 삭제된 댓글로부터 남은 데이터, 플러그인 잔여물 및 빈 메타 값들이 시간이 지남에 따라 wp_commentmeta 테이블을 부풀게 만듭니다. 이 테이블을 백업하고, 올바른 SQL 쿼리를 사용하여 최적화함으로써 관리 패널의 반응 속도, 댓글 페이지, 백업 시간 및 전반적인 데이터베이스 성능을 향상시킬 수 있습니다.

워드프레스 사이트에서 속도 문제는 종종 테마, 이미지 크기 또는 캐시 부족으로 설명됩니다. 그러나 수년간 운영된 블로그에서 20,000개의 댓글이 삭제되었더라도, 이 댓글과 관련된 일부 메타 데이터가 데이터베이스에 남아 있을 수 있습니다. Akismet, 보안 플러그인, 댓글 평가 도구, 안티 스팸 서비스 및 오래된 댓글 구독 플러그인은 wp_commentmeta 테이블에 추가 필드를 작성합니다. 이러한 필드가 통제되지 않고 증가할 경우, 매 백업, 이동 작업 및 일부 쿼리에서 불필요한 부하를 초래할 수 있습니다. 이 가이드에서는 기술적 위험을 줄이면서 어떤 데이터가 삭제될 수 있는지, 어떤 쿼리를 사용할 것인지, 그리고 작업 후 사이트를 어떻게 테스트할 것인지 단계별로 다룰 것입니다.

wp_commentmeta 테이블이란? 왜 부풀어 오르는가?

wp_commentmeta는 워드프레스 데이터베이스에서 댓글에 추가 정보를 연결하기 위해 사용되는 테이블입니다. 기본적인 댓글 정보는 wp_comments 테이블에 저장되지만, wp_commentmeta는 댓글과 관련된 추가 데이터를 meta_key와 meta_value 구조로 저장합니다. 예를 들어, 안티 스팸 플러그인은 댓글의 스팸 점수를, 평가 플러그인은 사용자 점수를, 회원 가입 플러그인은 댓글 작성자의 추가 상태 정보를 이 테이블에 저장할 수 있습니다.

테이블이 부풀어 오르는 가장 흔한 원인은 댓글이 삭제되었음에도 불구하고 관련된 메타 데이터가 남아있기 때문입니다. 워드프레스 코어는 대부분의 경우 관련된 레코드를 정리하지만, 오류가 있는 플러그인, 미완료된 삭제 작업, 오래된 버전, 수동 데이터베이스 개입 또는 실패한 데이터 가져오기는 여전히 잔여 데이터를 남길 수 있습니다. 이러한 데이터는 일반적으로 '오르펀 코멘트 메타' 즉, 소속이 없는 댓글 메타 데이터로 불립니다.

실용적인 예를 들어보겠습니다: 8년 된 콘텐츠 사이트에서 총 65,000개의 댓글이 생성되었고, 그 중 52,000개가 스팸으로 삭제되었다고 가정합시다. 각 스팸 댓글에 대해 3개의 메타 데이터가 작성되었다면 테이블에 156,000개의 레코드가 추가되었을 수 있습니다. 삭제 작업이 제대로 이루어지지 않으면 이러한 레코드의 상당 부분이 wp_commentmeta 내에 계속 남아있게 됩니다. 레코드 당 데이터 크기는 작아 보일 수 있지만, 인덱스, 백업 파일, 쿼리 계획 및 디스크 I/O 비용은 증가합니다.

정리가 필요한 시점: 징후 및 체크포인트

모든 워드프레스 사이트가 wp_commentmeta 테이블을 자주 정리할 필요는 없습니다. 새로 설치한 사이트, 댓글 기능이 꺼져 있거나 댓글이 적은 사이트에서는 이 테이블의 영향이 제한적입니다. 그러나 다음의 징후 중 몇 가지를 발견하면 정리가 성능 향상에 큰 도움이 될 수 있습니다.

  • 데이터베이스 백업이 예상보다 매우 크고 wp_commentmeta가 상위 5개 테이블에 포함되어 있다면.
  • 워드프레스 관리 패널에서 댓글, 스팸 댓글 또는 플러그인 화면이 느리게 열린다면.
  • 사이트 이동, 클론 또는 백업 복구 작업이 오래 걸린다면.
  • phpMyAdmin 또는 호스팅 패널에서 wp_commentmeta의 레코드 수가 수십만 또는 수백만에 달한다면.
  • Akismet, 오래된 댓글 구독, 평가, 보안 또는 안티 스팸 플러그인이 과거에 많이 사용되었다면.
  • 데이터베이스 최적화 도구가 소속 없는 메타 레코드를 보고하고 있다면.

이 시점에서 중요한 원칙은 무작정 테이블을 비우는 것이 아니라, 실제로 불필요한 레코드를 식별하고 안전하게 삭제하는 것입니다. wp_commentmeta 내의 모든 레코드가 쓰레기가 아닙니다. 일부 활성 플러그인은 댓글 표시 로직을 이러한 데이터에 기반하여 실행할 수 있습니다.

정리 전 보안: 반드시 백업을 받으세요

데이터베이스에서 DELETE 또는 OPTIMIZE와 같은 명령을 실행하기 전에 전체 백업을 받는 것이 필수적입니다. 가장 안전한 방법은 파일과 데이터베이스를 동시에 백업하는 것입니다. 이렇게 하면 잘못된 쿼리, 플러그인 호환성 문제 또는 예상치 못한 데이터 손실 상황에서 신속하게 복구할 수 있습니다.

실제 사이트에서 작업을 수행하는 경우 먼저 트래픽이 적은 시간을 선택하세요. 큰 테이블에서 삭제 작업을 수행할 때 데이터베이스가 잠기거나 일시적으로 느려질 수 있습니다. 기업 또는 트래픽이 많은 사이트에서는 작업을 먼저 스테이징 환경에서 테스트하는 것이 가장 건강한 접근법입니다. Hostragons에서 호스팅되는 사이트에서는 성능 및 백업 요구를 위해 워드프레스 호스팅 패키지와 사이트 이동 계획에 대한 호스팅 이전 가이드 내용을 검토할 수 있습니다.

백업 시 확인사항

  • 데이터베이스 백업이 다운로드 가능하고 복구 가능하다는 것을 확인하세요.
  • 백업이 wp_commentmeta뿐만 아니라 모든 워드프레스 테이블을 포함하고 있는지 확인하세요.
  • 백업 파일을 작업 중인 서버와 다른 위치에 복사하세요.
  • 중요한 사이트에서는 백업을 테스트 환경에 가져와서 작동하는지 확인하세요.
  • 캐시, 보안 및 유지 관리 플러그인이 작업 중에 충돌하지 않도록 확인하세요.

wp_commentmeta 정리를 위한 준비 분석

첫 번째 단계는 테이블의 상태를 측정하는 것입니다. phpMyAdmin, Adminer, MySQL 클라이언트 또는 호스팅 패널의 데이터베이스 도구를 통해 쿼리를 실행할 수 있습니다. 테이블의 접두사는 wp_를 제외할 수 있으며, 예를 들어 사이트 보안을 위해 hrg_와 같은 사용자 정의 접두사가 사용되었을 수 있습니다. 따라서 쿼리를 실행하기 전에 테이블 이름을 자신의 설치에 맞게 조정하세요.

레코드 수 확인하기

먼저 테이블의 대략적인 크기를 확인합니다: SELECT COUNT(*) FROM wp_commentmeta;

이 쿼리는 총 메타 레코드 수를 제공합니다. 5,000개의 레코드가 있는 테이블에서 정리 효과는 제한적일 수 있으며, 250,000 또는 1,000,000 레코드에서는 정기적인 유지 관리가 뚜렷한 차이를 만들 수 있습니다.

가장 많은 공간을 차지하는 메타 키 찾기

어떤 플러그인이나 레코드 유형이 테이블을 부풀게 하는지 보기 위해 다음 쿼리를 사용할 수 있습니다: SELECT meta_key, COUNT(*) AS 개수 FROM wp_commentmeta GROUP BY meta_key ORDER BY 개수 DESC LIMIT 20;

이 출력은 예를 들어 akismet_result, akismet_history, rating_score, subscribe_reloaded 또는 오래된 플러그인에 속하는 키가 과도하게 반복되고 있음을 보여줄 수 있습니다. 활성 플러그인에서 사용하는 meta_key 값을 삭제하기 전에 반드시 플러그인 문서를 확인하세요.

소속 없는 메타 레코드 탐지하기

삭제된 댓글에 연결된 레코드를 찾기 위한 기본 검사는 다음과 같습니다: SELECT COUNT(*) FROM wp_commentmeta cm LEFT JOIN wp_comments c ON cm.comment_id = c.comment_ID WHERE c.comment_ID IS NULL;

결과가 0보다 크면 댓글 테이블에 대응되는 메타 레코드가 존재한다는 의미입니다. 이러한 레코드는 대부분의 시나리오에서 안전하게 정리할 수 있습니다; 왜냐하면 그에 연결된 댓글이 더 이상 존재하지 않기 때문입니다.

안전한 정리 방법 비교

안전한 정리 방법 비교
방법누구에게 적합한가?장점위험
데이터베이스 플러그인으로 정리기술 지식이 제한된 사용자인터페이스가 쉬우며 일부 작업은 한 번의 클릭으로 수행 가능플러그인이 모든 특별한 상황을 정확하게 해석하지 못할 수 있음
phpMyAdmin을 통한 SQL중급 사용자통제되고 빠르며 결과가 측정 가능잘못된 쿼리는 데이터 손실을 일으킬 수 있음
WP-CLI 및 스테이징 환경개발자 및 에이전시자동화 및 테스트 가능성이 높음서버 접근과 명령어 줄 지식이 필요함
전문가 지원으로 유지 관리중요하거나 트래픽이 많은 사이트위험이 최소화되고 성능이 전체적으로 점검됨비용과 계획이 필요함

일반적인 권장은 작은 사이트에서는 신뢰할 수 있는 최적화 플러그인으로 시작하고, 큰 수익을 올리는 사이트에서는 SQL 쿼리를 먼저 스테이징 환경에서 테스트하는 것입니다. 데이터베이스 성능은 호스팅 인프라와도 직접적인 관계가 있습니다. 집중적인 쿼리 영역의 워드프레스 사이트에 대해서는 고성능 웹 호스팅과 안전한 데이터 전송을 위한 SSL 인증서 페이지가 유용할 수 있습니다.

단계별 wp_commentmeta 정리

1. 유지 관리 창 설정

정리 작업은 방문자 트래픽이 적은 시간대에 계획하세요. 큰 테이블에서 DELETE 쿼리는 몇 초가 아니라 몇 분이 걸릴 수 있습니다. 이 동안 관리 패널이 느려질 수 있습니다. 전자상거래나 회원 사이트에서는 작업 전에 사용자 세션, 주문 및 폼 제출을 고려해야 합니다.

2. 전체 백업을 받고 테이블 접두사를 확인하세요

백업 없이 어떤 삭제 쿼리도 실행하지 마세요. 그런 다음 wp-config.php 파일에서 table_prefix 값을 확인하세요. 만약 접두사가 wp_가 아니라면, 다음 쿼리에서 wp_commentmeta와 wp_comments 이름을 자신의 접두사로 변경하세요.

3. 소속 없는 레코드를 먼저 계산하세요

정리 전 얼마나 많은 레코드가 삭제될지를 확인하는 것은 통제를 제공합니다: SELECT COUNT(*) FROM wp_commentmeta cm LEFT JOIN wp_comments c ON cm.comment_id = c.comment_ID WHERE c.comment_ID IS NULL;

예를 들어 결과가 84,230이라면, 이만큼의 레코드가 연결된 댓글이 더 이상 존재하지 않는다는 뜻입니다. 이 숫자를 기록해 두세요. 작업 후 동일한 쿼리를 다시 실행하여 결과가 0으로 줄어드는지 확인할 수 있습니다.

4. 소속 없는 commentmeta 레코드를 삭제하세요

가장 일반적이고 안전한 정리 쿼리는 다음과 같습니다: DELETE cm FROM wp_commentmeta cm LEFT JOIN wp_comments c ON cm.comment_id = c.comment_ID WHERE c.comment_ID IS NULL;

이 쿼리는 wp_comments 테이블에 대응하는 comment_id 값을 가지지 않은 메타 레코드를 삭제합니다. 큰 사이트에서는 이 작업을 부분적으로 나누는 것이 더 안전할 수 있습니다. 일부 MySQL 버전에서는 LIMIT를 사용하여 단계별 삭제를 선호합니다. 예를 들어 먼저 10,000개의 레코드로 진행하는 것이 잠금 위험을 줄일 수 있습니다.

5. 빈 또는 불필요한 메타 값을 평가하세요

일부 메타 레코드는 meta_value가 비어 있을 수 있습니다. 그러나 빈 값이 항상 불필요하다는 의미는 아닙니다. 일부 플러그인은 빈 값을 표시기로 사용할 수 있습니다. 따라서 다음 쿼리로 먼저 규모를 확인하세요: SELECT meta_key, COUNT(*) FROM wp_commentmeta WHERE meta_value = '' GROUP BY meta_key ORDER BY COUNT(*) DESC;

만약 오래되고 더 이상 사용되지 않는 플러그인에 속하는 빈 값의 수천 개 레코드를 발견하면, 플러그인이 비활성화되고 제거되었는지 확인한 후 목표를 가지고 삭제할 수 있습니다. 예를 들어 old_plugin_key라는 meta_key가 더 이상 사용되지 않는다면: DELETE FROM wp_commentmeta WHERE meta_key = 'old_plugin_key' AND meta_value = '';

여기서 중요한 점은 모든 빈 meta_value 레코드를 무작정 삭제하지 않는 것입니다. 목표를 가지고 증거 기반으로 정리하는 것은 2026 SEO 기준에서 기대되는 기술적 품질 접근법과 일치하며, 속도 향상과 기능 손실 위험을 줄입니다.

6. 스팸 플러그인 잔여물 점검

Akismet 및 유사한 안티 스팸 플러그인은 댓글에 추가 기록을 작성할 수 있습니다. 이 데이터는 활성 스팸 분석에 유용할 수 있지만, 수년 전에 삭제된 댓글과 관련된 레코드는 소속 없는 쿼리에서 이미 정리됩니다. 댓글이 남아있고 과거 스팸 정보를 유지하고 싶지 않다면, 법적, 운영적 및 플러그인 의존성 측면에서 먼저 결정을 내리세요. 활성 댓글의 메타 기록을 삭제하면 일부 감사 또는 보고 화면에 영향을 줄 수 있습니다.

7. 테이블을 최적화하세요

삭제 작업 후 데이터베이스에서 물리적 공간이 항상 자동으로 회수되지는 않습니다. MySQL/MariaDB 구성에 따라 테이블을 최적화해야 할 수 있습니다: OPTIMIZE TABLE wp_commentmeta;

이 작업은 테이블을 재구성하고 인덱스를 정리하며 디스크 사용량을 줄일 수 있습니다. 큰 테이블에서는 일시적인 잠금을 생성할 수 있으므로, 다시 낮은 트래픽 시간에 수행해야 합니다. InnoDB를 사용하는 현대적인 설치에서는 효과가 구성에 따라 다를 수 있지만, 유지 관리 후 측정을 위한 유용한 단계입니다.

8. 캐시를 청소하고 사이트를 테스트하세요

데이터베이스 정리가 완료된 후 객체 캐시, 페이지 캐시 및 CDN 캐시를 청소하세요. 그런 다음 댓글 폼, 댓글 목록, 관리 패널의 댓글 화면, 스팸 필터링 및 관련 플러그인 패널을 테스트하세요. 도메인, DNS 또는 CDN 측에서도 성능 개선을 계획하고 있다면 도메인 관리 및 DNS 설정 주제를 검토할 수 있습니다.

성능 향상은 어떻게 측정할 수 있나요?

성능 향상은 어떻게 측정할 수 있나요?

정리 작업의 효과를 이해하려면 작업 전후의 측정을 수행해야 합니다. 단순히 느껴지는 속도뿐만 아니라 수치 데이터도 추적해야 합니다. 다음 메트릭은 실용적인 틀을 제공합니다.

  • wp_commentmeta 레코드 수: 정리 전후의 COUNT 결과.
  • 데이터베이스 크기: phpMyAdmin 또는 호스팅 패널의 테이블 크기.
  • 백업 시간: 자동 백업 완료 시점.
  • 관리 패널 응답 시간: 댓글 화면의 열리는 시간.
  • TTFB: 서버 첫 바이트 시간, 특히 동적 페이지에서.
  • 오류 로그: 정리 후 PHP 또는 MySQL 오류 발생 여부.

예시 유지 관리 시나리오에서, 420,000개의 레코드가 있는 wp_commentmeta 테이블에서 310,000개의 소속 없는 레코드가 발견되어 삭제되었을 때 데이터베이스 백업 크기가 480MB에서 310MB로 줄어들 수 있습니다. 댓글 화면은 6초에서 2초로 줄어들 수 있습니다. 모든 사이트에서 동일한 비율을 기대할 수는 없지만, 불필요한 레코드가 줄어드는 것은 특히 자원이 제한된 호스팅에서 눈에 띄는 완화 효과를 제공합니다.

SEO 측면에서 왜 중요한가요?

구글은 사용자 경험과 기술적 접근 가능성을 점점 더 중요시합니다. 데이터베이스 팽창은 직접적인 순위 요소로 간주되지는 않지만, 페이지 응답 시간, 크롤링 효율성 및 관리 프로세스에 간접적인 영향을 미칩니다. 워드프레스 백엔드가 느려지면 콘텐츠 업데이트, 댓글 관리 및 기술적 유지 관리가 중단될 수 있습니다. 동적 페이지에서 쿼리 시간이 늘어나면 TTFB가 증가할 수 있으며, 이는 Core Web Vitals 평가에 부정적인 영향을 미칠 수 있습니다.

2026년 SEO 접근 방식에서는 기술 정리가 콘텐츠 품질만큼 중요합니다. 인공지능 지원 검색 결과와 추천 답변 시스템은 빠르게 로드되며 오류가 없는 신뢰할 수 있는 사이트를 더 잘 크롤링할 수 있습니다. 데이터베이스 정리는 깨진 플러그인 잔여물을 줄이고, 백업 복구 시간을 단축하며, 사이트의 지속성을 강화합니다. 특히 뉴스, 블로그, 교육 및 커뮤니티 사이트에서 댓글 인프라가 많이 사용되는 경우 wp_commentmeta 관리가 정기적인 SEO 감사의 일환이 되어야 합니다.

자주 하는 실수

  • 백업 없이 DELETE 쿼리를 실행하는 것.
  • 테이블 접두사를 확인하지 않고 복사-붙여넣기 SQL을 사용하는 것.
  • 활성 플러그인이 사용하는 meta_key 값을 삭제하는 것.
  • 모든 빈 meta_value 레코드를 불필요하다고 간주하는 것.
  • 실시간 및 트래픽이 많은 사이트에서 대규모 삭제 작업을 한 번에 수행하는 것.
  • 정리 후 테이블 최적화 및 캐시 청소를 잊는 것.
  • 성능 측정을 하지 않고 작업의 영향을 평가하려고 하는 것.

이러한 실수는 대부분 성급한 유지 관리 프로세스에서 발생합니다. 최선의 방법은 먼저 분석하고, 다음으로 백업을 받고, 이후 작은 단위로 검증된 단계로 진행하는 것입니다.

정기 유지 관리를 위한 권장 주기

댓글 트래픽이 적은 기업 사이트에서는 6개월에 한 번 점검하는 것으로 충분할 수 있습니다. 활성 블로그, 뉴스 사이트 또는 스팸 공격에 취약한 폼에서는 1-3개월마다 데이터베이스 검토가 더 적합합니다. 매우 높은 트래픽 프로젝트에서는 모니터링 자동화를 설정할 수 있습니다. 주간 보고서를 통해 wp_commentmeta 레코드 수, 가장 큰 meta_key 값 및 테이블 크기를 추적할 수 있습니다.

또한 wp_commentmeta뿐만 아니라 wp_postmeta, wp_options 및 transient 레코드도 워드프레스 성능에서 중요한 역할을 합니다. 보다 포괄적인 최적화를 위해 워드프레스 데이터베이스 최적화 가이드, 안전한 출판을 위한 WordPress 보안 팁 및 인프라 선택을 위한 Hostragons 호스팅 솔루션 링크를 통해 관련 자료를 확인할 수 있습니다.

실용적인 체크리스트

  • 전체 파일 및 데이터베이스 백업이 완료되었습니다.
  • 테이블 접두사가 확인되었습니다.
  • wp_commentmeta의 총 레코드 수가 측정되었습니다.
  • 가장 빈번한 meta_key 값이 나열되었습니다.
  • 소속 없는 레코드 수가 계산되었습니다.
  • 삭제 쿼리가 먼저 스테이징 환경 또는 저트래픽에서 실행되었습니다.
  • OPTIMIZE TABLE 작업이 적절한 시간에 수행되었습니다.
  • 캐시가 청소되었습니다.
  • 댓글 폼 및 관리 패널이 테스트되었습니다.
  • 전후 성능 결과가 기록되었습니다.

자주 묻는 질문

wp_commentmeta 테이블을 완전히 비우는 것이 옳은가요?

아니요. wp_commentmeta 테이블에는 활성 댓글과 플러그인에 필요한 데이터가 포함될 수 있습니다. 완전히 비우는 것은 댓글 점수, 스팸 기록 또는 플러그인 기능에 손상을 초래할 수 있습니다. 안전한 접근 방식은 소속 없는 확인된 불필요한 레코드를 삭제하는 것입니다.

이 작업이 제 워드프레스 사이트를 확실히 빠르게 할까요?

테이블이 크고 불필요한 레코드로 가득 차 있다면 속도를 향상시킬 수 있습니다; 특히 백업, 관리 패널 및 댓글 화면에서 차이를 느낄 수 있습니다. 그러나 속도 문제가 wp_commentmeta 때문만은 아닐 수 있습니다. 테마, 플러그인, 캐시, 호스팅 리소스 및 이미지 최적화도 점검해야 합니다.

SQL 쿼리를 실행하는 것이 안전한가요?

올바른 쿼리, 올바른 테이블 접두사 및 최신 백업으로 작업할 경우 안전합니다. 그럼에도 SQL 작업은 되돌리기 어려운 변경을 수행합니다. 따라서 먼저 카운트 쿼리를 실행하고, 가능하면 스테이징 환경에서 테스트하며, 실제 사이트에서는 트래픽이 적은 시간을 선택해야 합니다.

wp_commentmeta 정리는 얼마나 자주 해야 하나요?

댓글이 적은 사이트에서는 6개월에 한 번 점검하는 것으로 충분할 수 있습니다. 활발한 댓글이 있는 블로그, 뉴스 사이트 및 스팸 공격을 받는 프로젝트의 경우 1-3개월마다 분석하는 것이 좋습니다. 목표는 지속적으로 삭제하는 것이 아니라, 테이블의 성장을 정기적으로 감시하는 것입니다.

정리 후 어떤 점검을 해야 하나요?

댓글 폼, 댓글 목록, 스팸 필터링, 관리 패널의 댓글 화면 및 관련 플러그인 패널을 테스트해야 합니다. 또한 캐시를 청소하고, 오류 로그를 점검하며, 데이터베이스 크기 및 응답 시간을 비교해야 합니다.

결론

워드프레스 데이터베이스 wp_commentmeta 테이블 정리로 사이트 속도 향상은 올바르게 수행되면 낮은 위험과 효과적인 유지 관리 단계가 될 수 있습니다. 기본 규칙은 백업을 받고, 소속 없는 레코드를 증거로 식별하며, 목표를 가지고 삭제하고 결과를 측정하는 것입니다. 만약 워드프레스 사이트에서 데이터베이스 증가, 느린 관리 패널 또는 긴 백업 시간을 경험하고 있다면, 이 정리는 좋은 시작이 될 수 있습니다. 더 강력하고 지속 가능한 성능을 위해 인프라를 점검하고 싶다면, Hostragons의 워드프레스 호환 호스팅 솔루션을 살펴볼 수 있습니다.

이 기사를 공유하세요:

Hostragons 팀

호스팅, 서버, 도메인 이름에 대한 최신 가이드를 전문가 팀과 함께 확인하세요. 프로젝트에 맞는 최적의 솔루션을 찾아드리겠습니다.

문의하기