메인 콘텐츠로 건너뛰기

2026년 지속적 배포란?

지속적 배포란 무엇인가? 2026년 지침서

지속적 배포의 개념을 이해하고, CD와의 차이점, pipepline 구성 요소, 배포 패턴, 및 현대 앱의 구현 방법을 탐색하십시오.

마틴 도나디유

Content Marketer

2026 년 지속적인 배포 가이드

지속적인 배포란 code이 모든 자동화된 품질 검사 단계를 통과한 후에도직접 프로덕션으로 바로 보내지며, 수동 배포 트리거가 필요하지 않다. 현재도45%의 조직이 프로덕션으로 배포를 자동화하지 못하고 있다.

If you’re building with Capacitor or Electron, you’ve probably felt the friction already. A bug fix is ready, the web layer is patched, QA is done, but the release still waits on a person, a meeting, or an app store cycle. That gap between “ready” and “live” is where most delivery pipelines slow down.

__CAPGO_KEEP_0__ 또는 Electron으로 빌드 중이라면, 이미 이러한 마찰을 경험했을 것이다. 버그 픽스가 준비되어 있고 웹层가 패치되었으며 QA가 완료되었지만, 배포는 여전히 사람, 회의, 또는 앱 스토어 주기만 기다리고 있다.

배포 pipeline이 느려지는 곳은 대부분 “준비되었습니다”와 “실시간으로” 사이의 간격이다.

연속 배포

개발자는 결제 수정을 병합합니다. mainpipeline은 애플리케이션을 빌드하고, 자동화된 검사를 실행하고, 결과를 검증하고, 변경 사항이 프로덕션으로 도달하는 것이 없으며, 누군가가 '배포' 버튼을 클릭하지 않습니다. 연속 배포.

정확한 정의는 간단합니다. 연속 배포는 자동으로 정의된 품질 게이트를 통과한 모든 code 변경 사항을 직접 프로덕션으로 출시하는 연속 배포의 관행입니다.인간이 최종 프로덕션 트리거를 유지하는 연속 배포와의 기술적 차이는 간단합니다. 연속 배포는 북플랭크가 연속 배포에 대한 안내서에서 명확하게 설명합니다. 지속적인 배포 및 지속적인 제공.

모든 변경 사항이 배포된다. 릴리스 매니저, 늦은 밤의 승인, '제품 준비' 버튼이 필요하지 않다.

그것은 공격적인 것처럼 들릴 때까지 matures 팀이 어떻게 작동하는지 살펴보면 그다지 공격적이지 않다. 그들은 빌드가 반복 가능하고 테스트가 신뢰되고 배포 단계가 스크립트화되고 생산 동작이 빠르게 회귀를 잡을 수 있는 정도로 충분히 보이면 마지막 게이트를 제거한다.

Capacitor 팀에게는 이것이 중요하다. 릴리스 표면이 분할되어 있다. 네이티브 바이너리에는 여전히 스토어 리뷰가 필요하지만 자바스크립트, CSS, 콘텐츠 및 구성 변경은 종종 훨씬 빠른 경로를 통해 이동할 수 있다. 따라서 Capacitor 앱의 실제 CI/CD workflow for Capacitor apps 지속적인 배포는 팀의 행동을 변경한다. 엔지니어들은 관련이 없는 수정을 하나의 큰 릴리스에 묶지 않는다. 제품 매니저들은 '릴리스 날짜'를 기다리지 않는다. 지원 팀은 한 주 전의 업데이트의 비밀 회귀 대신 작은, 쉽게 설명할 수 있는 변경 사항을 받는다.

CI vs 지속적인 제공 vs 지속적인 배포

대부분의 혼란은 팀이 'CI/CD'라고 말하면서 실제로 세 가지 다른 자동화 수준을 의미한다는 사실에서 비롯된다.

공장 analogy가 여기에서 잘 작동한다.

지속적인 통합 부품을 조립하고 빌드가 여전히 함께 유지되는지 확인한다. CI/CD vs 지속적인 통합 vs 지속적인 제공 vs 지속적인 배포 정속 배포 완성된 패키지를 배송 준비 상태로 로드 도크에 배치합니다. 정속 배포 품질 검사를 통과하면 자동으로 트럭에 적재합니다.

실용적인 차이점

CI는 새로운 code가 깨끗하게 통합되었는지 여부를 확인합니다.

정속 배포는 다른 질문에 답합니다: 이 빌드가 출시 준비 상태인가요?

정속 배포는 한 단계 더 나아갑니다: 만약 준비가 된다면 왜 기다리는 것인가요?

마지막 단계는 성숙도가 나타나는 곳입니다. Forrester의 Global DevOps Benchmark Survey를 인용한 업계 기사에 따르면, 만약 배포를 자동화하지 않는다면, 45%의 조직만이 생산 환경으로 배포를 자동화합니다. 이는 조직의 절반 이상이 아직 배포 전에 일부 수동 단계를 유지하고 있다는 것을 의미합니다. 같은 기사는 이 격차를 정속 배포 채택의 구분선으로 위치시키고 있습니다..

__CAPGO_KEEP_0__CI (계속 통합)CD (계속 배포)CD (계속 배포)
주요 트리거Code 커밋 또는 병합Code 커밋 또는 병합Code 커밋 또는 병합
핵심 목표계속해서 빌드 및 테스트소프트웨어를 언제든지 출시할 수 있도록 유지자동으로 검증된 변경 사항을 출시
제품 출시주목을 집중시키지 않음수동 트리거가 필요함품질 게이트 통과 후 자동
인간의 참여pipeline의 후반부에 자주 필요함제품 출시 이전에 필요함최종 제품 출시 단계에서 제거됨
최적의 선택기본적인 엔지니어링을 안정화하는 팀제품 출시를 원하는 팀강력한 자동화 및 빠른 복구를 원하는 팀

일상에서 각 모델은 어떤 느낌인지

CI CI는 바닥입니다. 팀이 안전하게 병합하고 빠른 빌드 피드백을 받을 수 없다면, 지속적인 배포에 대해 이야기하지 마십시오.

지속적인 제공 지속적인 제공은 많은 좋은 팀이 오랫동안 머물러 있는 곳입니다. 반복 가능한 빌드, 자동화된 검증, 그리고 배포 준비가 된 artifact를 제공하면서도 인간의 배포 결정이 보존됩니다.

실용적인 규칙: 승인자가 정상 빌드를 통과할 때 주로 스텝만 하는 경우, 게이트는 프로세스 극장일 수 있습니다. 승인자가 실제 문제를 발견할 때 자주 승인한다면, 수동 게이트를 유지하세요.

지속적인 배포 지속적인 배포는 자동화의 위험보다 기다리는 비용이 더 높을 때 의미가 있습니다. 백엔드 서비스는 그 시점에 먼저 도달합니다. 하이브리드 모바일 앱은 웹 자산을 위해 먼저 도달할 수 있지만 네이티브 패키지에 대해 도달하지 못할 수 있습니다.

지속적인 배포 PIPELINE의 해부

작동하는 PIPELINE은 신뢰의 연쇄입니다. 한 단계가 약점을 가지고 있다면 '자동 배포'는 '자동 사고'로 변합니다.

code 커밋부터 모니터링까지 지속적인 배포 PIPELINE의 7단계를 나타내는 다이어그램

__CAPGO_KEEP_0__이 merge된 후에 무슨 일이 일어나는가

code이 main branch에 도착하면 pipeline은 예측 가능한 순서로 실행되어야 하며, 숨겨진 오퍼레이터 단계가 없어야 한다.

  1. Code 커밋merge가 발생하면 GitHub Actions, GitLab CI, CircleCI, 또는 다른 러너에서 pipeline이 트리거된다.
  2. 빌드 및 테스트앱이 컴파일되고 의존성이 해결되고 자동화된 테스트가 실행된다.
  3. 아티팩트 생성pipeline이 immutable한 것을 생성하여 프로모션하기 위해, 예를 들어 컨테이너 이미지, 서명된 번들, 또는 패키지드 앱 애셋 세트를 생성한다.
  4. 스테이징 배포아티팩트가 프로덕션과 같은 환경에 도착한다.
  5. 검증스모크 테스트와 환경 체크가 배포가 작동하는지 확인한다.
  6. 프로덕션 배포. 모든 게이트가 통과하면 자동으로 릴리즈가 발생합니다.
  7. 모니터링. 시스템은 변경이 실시간으로 체크합니다.

IBM은 CI/CD 스펙트럼의 성숙한 끝으로 지속적인 배포를 설명하며, 자동화된 검증이 통과하면 별도의 릴리즈 이벤트 없이 변경이 실시간으로 배포되도록 허용합니다. 또한 이로 인해 별도의 릴리즈 일정이 필요하지 않으며, 개발이 완료된 후 변경이 몇 분만에 실시간으로 배포될 수 있음을 강조합니다. IBM에서 지속적인 배포 개요.

모바일 팀의 유용한 정신 모델은 배포 명령이 성공할 때 pipeline이 끝나지 않는다는 것입니다. 릴리즈가 건강할 때까지 pipeline이 끝나야 합니다. 따라서 CI/CD를 연구하는 팀은 빌드 속도보다 검증 및 복구에 동일한 시간을 투자합니다. 실습을 통한 모바일 예시로, __CAPGO_KEEP_0__ CI/CD pipeline 설정 가이드

이와 같은 워크플로가 앱 배포 프로세스에 통합되는 방법을 보여줍니다. Capacitor __CAPGO_KEEP_0__

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

  • __CAPGO_KEEP_0__ __CAPGO_KEEP_0__
  • __CAPGO_KEEP_0__ __CAPGO_KEEP_0__
  • __CAPGO_KEEP_0__ __CAPGO_KEEP_0__
  • __CAPGO_KEEP_0__ __CAPGO_KEEP_0__

What doesn’t work:

  • 수동 QA가 효과적인 게이트 역할을 하면서 pipe line이 자동화된 것처럼 보인다. 장시간 테스트 스위트
  • 개발자들을 체크를 피하는 습관으로 훈련시키는 것. 스테이징과 프로덕션 사이의 환경이 변하는 것.
  • 한 명의 릴리즈 엔지니어가만 알고 있는 마지막 셸 스크립트. 배포 전략 선택
  • 자동으로 프로덕션으로 배포하는 건 모든 사용자에게 모든 변경 사항을 한 번에 노출시키는 건 아니다. 좋은 배포 전략은 팀이 지속적인 배포의 속도와 무책임한 위험을 무릅쓰지 않고 얻는 것이다. blue-green, canary, rolling 배포 전략 비교 다이어그램.

Shipping automatically to production doesn’t mean exposing every user to every change all at once. Good deployment strategy is how teams get the speed of continuous deployment without taking reckless risks.

Shipping automatically to production doesn’t mean exposing every user to every change all at once. Good deployment strategy is how teams get the speed of continuous deployment without taking reckless risks.

Shipping automatically to production doesn’t mean exposing every user to every change all at once. Good deployment strategy is how teams get the speed of continuous deployment without taking reckless risks.

__CAPGO_KEEP_0__

다양한 문제를 해결하는 다양한 패턴.

Blue/Green 배포 두 환경을 유지합니다. 하나는 사용자에게 제공되고 다른 하나는 새로운 버전을 보유합니다. 검증 후 트래픽을 전환합니다. 이 방법은 깨끗한 전환과 빠른 되돌아 오기 경로가 필요할 때 유용합니다.

카나리 배포 새로운 버전의 작은 슬라이스 또는 사용자 또는 트래픽을 먼저 보내고, 건강이 좋으면 롤아웃을 확장하고, 그렇지 않으면 문제가 널리 퍼지기 전에 다시 당기면 됩니다.

롤링 배포 인스턴스를_BATCH로 업데이트합니다. 서비스 환경에서 용량을逐渐 대체하는 것이 유지하는 중복 스택을 유지하는 것보다 더 간단하기 때문에 일반적입니다.

기능 플래그 배포와 출시를 분리합니다. Code는 제품, 지원 또는 엔지니어링이 기능을 노출하기 전까지 프로덕션에 도달할 수 있습니다.

단계별 롤아웃 모바일 및 데스크톱 앱에 특히 중요합니다. 베타 사용자, 내부 직원 또는 특정 고객 그룹에 빌드 또는 OTA 업데이트 push를하고, 검증 후 노출을 확대할 수 있습니다.

실무에서 선택하는 방법

GitLab의 CI/CD 지침은 용어보다 준비가 더 중요하다는 점을 강조합니다. 수동 프로덕션 게이트를 제거하는 결정은 GitLab의 테스트, 관찰성, 롤백 기능의 성숙도에 따라 달라집니다. GitLab의 CI/CD 운영 준비.

다음은 각 옵션의 적합한 시점입니다.

  • blue/green을 선택하세요 다운타임이 불가피하고 병렬 환경을 유지할 수 있는 경우.
  • canary를 선택하세요 변경 사항이 위험한 논리, 사용자 흐름, 또는 외부 통합과 관련된 경우.
  • rolling을 선택하세요 인프라스트럭처의 단순성보다 즉시 전환을 우선하는 경우.
  • feature flags를 선택하세요 code이 사업이 준비되기 전에 준비되면.
  • 선택적 사용자 그룹 출시 다양한 사용자 그룹이 다른 수준의 노출이 필요한 경우

배포 전략은 위험 관리이며, 정교함의 상징이 아니다.

Capacitor 및 Electron 앱의 경우, phased rollouts 및 feature flags이 일반적으로 가장 큰 역할을 한다. 그들은 하이브리드 팀이 배포하는 방식과 일치한다. 공유 웹层를 빠르게 업데이트하고, 하나의 채널에 노출하고, broader 릴리스를 보류할 때까지 telemetry가 깨끗한지 확인할 수 있다.

관찰성 및 안전한 롤백의 중요성

관찰성이 없는 지속적인 배포는 추측이다. 릴리스를 자동화할 수 있지만, 시스템이 변경이 출시된 후에 무슨 일이 일어났는지 알려주지 않으면 신뢰를 자동화할 수 없다.

기술자는 복잡한 시스템의 성능 모니터링 대시보드 및 서버 네트워크 인프라를 감시하는 중이다.

릴리스 후에 무엇을 관찰해야 하나

모니터링은 알려진 지표가 임계값을 넘었는지 알려준다. 관찰성은 더 나아간다. 엔지니어에게 충분한 맥락을 제공하여, 프로덕션에서 이상한 것이 나타날 때 새로운 질문을 할 수 있다.

일반적으로, 다음을 관찰해야 한다.

  • 로그 애플리케이션 오류, 실패한 작업, 그리고 예상치 못한 에지 케이스를 위해
  • 지연 시간, 오류율, 서비스 장애 패턴, 서비스 건강도에 대한 지표 특정 배포 경로 이후에만 감소하는 요청에 대한 트레이스
  • 배포 이벤트와 직접 연결된 시각성은 있어야 합니다. 문제가 시작되는 릴리스에 대해, 온콜 엔지니어는 즉시 타이밍을 연관시킬 수 있어야 합니다. 별도의 시스템을 통해 추적하는 대신. 인시던트 응답 자동화 도구에 집중하는 도구에서 아이디어를 빌려오는 팀은 종종 이 워크플로를 개선합니다.

롤백이 정상적인 일이어야 합니다. 롤백은 '연속적인 배포'에 대한 많은 이야기에서 문제가 발생하는 곳입니다. 롤백이 부족한 지식, 주니어 엔지니어가 잠을 자야 하는지, 마지막으로 안정적인 버전의 기억이 완벽해야 하는지 여부에 따라, 준비가 되지 않았습니다.사용 가능한 롤백 프로세스는 몇 가지 특성을 가지고 있습니다.

빨라야 합니다.

엔지니어는 한 번의 액션 또는 자동화된 규칙으로 마지막으로 좋은 상태를 복원할 수 있어야 합니다.

지연 시간, 오류율, 서비스 장애 패턴, 서비스 건강도에 대한 지표

  • 특정 배포 경로 이후에만 감소하는 요청에 대한 트레이스 That visibility should connect directly to your deployment events. When a release starts causing problems, on-call engineers need to correlate the timing immediately instead of hunting through separate systems. Teams improving this workflow often borrow ideas from tools focused on incident response automation, because release recovery and incident handling overlap heavily in practice.
  • It is tested. Rollback은 실제로 수행된 것입니다. 팀은 스테이징 환경이나 제어된 프로덕션 환경에서 rollback을 수행했습니다.
  • It is observable. 이전 버전이 문제를 해결했는지 확인할 수 있습니다.
  • It is scoped. 서비스 하나, 기능 플래그 하나, 업데이트 채널 하나만 rollback할 수 있습니다. 관련 없는 작업을 취소하지 않습니다.

하이브리드 앱 팀에게 rollback은 더 큰 중요성을 가집니다. 사용자는 앱이 재시작하거나 새로 고침될 때까지 오래된 업데이트를 계속 사용할 수 있기 때문입니다. 채널 기반의 rollback 계획은 일괄적인 revert보다 안전합니다. 따라서 CI/CD 워크플로우의 rollback 전략이 실제로 작동하는 것이 중요합니다. 빠른 배포는 사용자 영향보다 빠른 복구만이 이점입니다.

__CAPGO_KEEP_0__ 및 Electron 앱에 대한 지속적인 배포

하이브리드 앱은 다른 정신 모델을 필요로 합니다. Capacitor 또는 Electron 앱을 백엔드 서비스처럼 다루면 두 개의 중요한 릴리스 트랙을 놓치게 됩니다.

Hybrid apps need a different mental model. If you treat a Capacitor or Electron app like a backend service, you’ll miss the two release tracks that matter.

Capacitor 다이어그램은 하이브리드 모바일 및 데스크톱 애플리케이션의 연속적인 배포 워크플로를 보여줍니다.

두 가지 배포 경로가 있습니다.

하이브리드 앱에는 자연스러운 쉘웹层.

자연스러운 쉘에는 플랫폼 wrapper, 플러그인, 권한, 서명, 저장소 배포 패키지가 포함됩니다. 이 경로는 여전히 자연스러운 플랫폼 규칙을 따릅니다. 자연스러운 code을 변경하거나 플러그인 동작, 권한, 패키징 세부 사항을 변경하면 앱 빌드, 서명, 저장소 제출의 세계로 돌아갑니다.

웹层는 다릅니다. HTML, CSS, JavaScript, 콘텐츠 및 일부 구성은 일반적으로 훨씬 더 짧은 루프에서 움직일 수 있습니다. 앱의 이 부분은 제품 팀이 지속적으로 변경하는 부분이며 연속적인 배포가 가장 큰 실제 이익을 창출하는 부분입니다.

이 분리는 모바일 팀이 “연속적인 배포가 있습니까?”라는 질문을 멈추고 두 개의 더 좋은 질문을 시작해야 한다는 것을 의미합니다.

  • 자연스러운 빌드 및 제출을 자동화할 수 있나요?
  • 설치된 앱에 웹 자산을 안전하게 연속적으로 배포할 수 있나요?

많은 Capacitor 팀의 경우 첫 번째 질문은 “일부”입니다. 두 번째 질문은 잘 설계된 업데이트 경로로 “예”라고 할 수 있습니다.

A 실제적인 하이브리드 릴리스 모델

A 작동하는 모델은 다음과 같습니다.

첫 번째 경로: 네이티브 릴리스

CI를 사용하여 iOS, Android 또는 데스크톱 패키지를 쉘 변경 시 빌드하고 네이티브 테스트, 서명 단계 및 배포 자동화 실행합니다. 이 PIPE라인을 강하게 유지하되, 순수 웹 배포 모델처럼 행동하지 마십시오.

두 번째 경로: 웹 자산 릴리스

변경 사항이 공유 웹 앱에 존재할 때 CI를 사용하여 웹 번들 빌드, 테스트, 릴리스 페이로드 서명, 내부, 베타 또는 프로덕션에 배포합니다. 이로 인해 앱의 가장 빠르게 움직이는 부분에 대한 루프가 닫힙니다.

일반적인 운영 패턴은 다음과 같습니다.

  1. 개발자는 웹 수정 사항을 병합합니다.
  2. CI는 웹 자산을 빌드합니다.
  3. 자동 테스트 및 유효성 검사 통과합니다.
  4. 번들은 서명되고 제한된 채널에 배포됩니다.
  5. 관찰 가능성은 건강한 수용과 주요 회귀가 없는지 확인합니다.
  6. 동일한 번들을 더 넓게 홍보합니다.

실시간 업데이트 플랫폼은 현대적인 하이브리드 앱의 연속 배포 전략의 필수 부분이 됩니다. 이들은 설치된 앱에 유효한 웹 번들을 배포하는 것을 처리합니다. 매번 전체 네이티브 릴리즈를 기다리지 않고. 하나의 옵션은 Capgo, 이 Capacitor 및 Electron 워크플로우에 대한 서명된 실시간 업데이트, 채널 기반 롤아웃, CI/CD 통합 및 롤백 제어를 제공합니다.

운영 세부 사항은 도구 이름이 아닌 채널, 서명, 단계별 롤아웃 및 롤백에 대한 discipline입니다. 만약 팀이 사용자에게 웹 번들을 즉시 전달할 수 있지만 어떤 버전이 어떤 장치에 도달했는지 설명할 수 없다면, 속도만 있으면 제어가 없습니다.

자동화에 이 기능을 통합하는 팀에게는 CI/CD 도구가 OTA 업데이트 트리거하는 방법 이것이 연결점입니다. 빌드 시스템은 단순히 아티팩트를 생성하는 것이 아니라, 업데이트 위치, 조건, 필요할 때 다시 pull하는 방법을 결정해야 합니다.

하이브리드 앱의 연속 배포는 일반적으로 웹层의 연속 배포를 먼저, 네이티브层의 제한된 자동화 두 번째로 의미합니다.

CD 세계의 보안 및 준수

보안 팀은 "자동화된 생산 릴리즈"를 듣고 risk가 증가했다고 생각합니다. 실제로 잘 구축된 pipeline은 repeatable policy로 undocumented human steps를 대체하여 제어가 향상됩니다.

빠른 배포는 여전히 제어가 가능합니다.

A secure CD 설정은 보안 검사를 더 일찍 수행합니다. 정적 분석, 의존성 스캐닝, 아티팩트 서명 및 정책 검사는 pipe라인에 속해야 하며, 별도의 릴리즈 스캔블에서 속해야 합니다. 만약 빌드가 규칙을 위반한다면, 그것은 앞으로 진행되지 않아야 합니다.

This model은 더 깨끗한 감사 기록을 생성합니다. 레포지토리는 누가 무엇을 변경했는지 보여줍니다. pipe라인은 어떤 검사를 수행했는지 보여줍니다. 배포 시스템은 어떤 것이 프로덕션에 도달했는지 및 언제 도달했는지 보여줍니다. 일반적으로, 이것이 수동 승인, 채팅 메시지 및 공유 릴리즈 스크립트를 기반으로 한 프로세스를 수호하는 것보다 더 쉽습니다.

감사관이 일반적으로 관심을 기울이는 것

대부분의 감사관은 인간이 배포 버튼을 클릭했는지 여부를 신경 쓰지 않습니다. 그들은 조직이 제어를 증명할 수 있는지 여부를 신경 쓰며.

그것은 일반적으로 몇 가지 질문으로 귀결됩니다:

  • 릴리스 전에 변경이 검토 및 검증되었습니까?
  • code 경로 또는 정책을 승인한 사용자를 보여줄 수 있나요?
  • 검증 후에 아티팩트가 변경되지 않았는지 증명할 수 있나요?
  • 업데이트를 받은 사용자 또는 채널을 식별할 수 있나요?
  • 잘못된 릴리즈를 즉시 취소하거나 롤백할 수 있나요?

모바일 팀이 설치된 앱으로 웹 업데이트 배송하는 환경에서, signed payloads, channel permissions, version history는 매우 중요합니다. 이러한 제어는 내부 보안 검토를 만족시키면서 배달 속도를 유지하는 데 도움이 됩니다. 만약 당신의 환경이 CI/CD에서 OTA 업데이트와 보안 및 규정 준수 경비대 __CAPGO_KEEP_0__는 올바른 운영 모델입니다.


If you’re shipping Capacitor or Electron apps and want a practical way to continuously deploy the web layer with signed updates, rollout channels, observability, and rollback control, take a look at Capgo. It fits the part of hybrid app delivery where app store timelines are too slow for routine fixes.

Capacitor 앱에 대한 실시간 업데이트

웹层 버그가 활성화된 경우 Capgo를 통해修정을 배포하는 대신 앱 스토어 승인까지 며칠 기다리지 말고. 사용자는 배경에서 업데이트를 받으면서 네이티브 변경 사항은 일반적인 검토 경로에 남아있다.

시작하기

블로그에서 최신 소식

Capgo은 전문적인 모바일 앱을 만들기 위해 필요한 최고의洞察력을 제공한다.