Skip to content

설정 실전

Config 구조체에는 30개 이상의 필드가 있지만, 일상적인 사용에서는 몇 가지 주요 설정 그룹만 이해하면 됩니다. 이 가이드는 시나리오에 맞는 설정을 빠르게 선택하는 데 도움을 줍니다. 전체 필드 설명은 API 레퍼런스 — 설정을 참조하세요.

네 가지 프리셋

라이브러리는 대부분의 시나리오를 포괄하는 네 가지 프리셋을 제공합니다:

프리셋적용 시나리오주요 차이
DefaultConfig()일반 추출모든 기능 활성화, 안전한 기본값
HighSecurityConfig()신뢰할 수 없는 입력제한 강화, 감사 활성화, 깊이 상한 하향
TextOnlyConfig()순수 텍스트만 필요모든 미디어 보존 비활성화, 최대 성능
MarkdownConfig()Markdown 출력인라인 이미지/링크를 Markdown 형식으로 변환
go
package main

import (
    "fmt"
    "log"

    "github.com/cybergodev/html"
)

func main() {
    data := []byte(`<html><body><h1>제목</h1><p>본문 내용</p></body></html>`)

    // 대부분의 시나리오: 기본 설정 직접 사용
    p1, _ := html.New()
    defer p1.Close()
    r1, _ := p1.Extract(data)
    fmt.Println(r1.Title)

    // 순수 텍스트만 필요 (예: 검색 엔진 인덱스)
    p2, _ := html.New(html.TextOnlyConfig())
    defer p2.Close()

    // Markdown 출력 (예: CMS 마이그레이션)
    p3, _ := html.New(html.MarkdownConfig())
    defer p3.Close()
    md, _ := p3.ExtractToMarkdown(data)
    fmt.Println(md)
}

프리셋에서 시작하기

잘 모를 때는 DefaultConfig()에서 시작하여 필요에 따라 개별 필드를 조정하세요. 프리셋끼리 조합할 수 있습니다 — 하나의 프리셋을 가져온 뒤 필드를 덮어쓰세요:

go
cfg := html.HighSecurityConfig()
cfg.PreserveImages = false // 고보안 기반에서 이미지 추가 비활성화
processor, _ := html.New(cfg)

6개 주요 필드 그룹 안내

리소스 관리

메모리 사용량과 성능을 제어합니다. 일상적인 개발에서는 보통 조정할 필요가 없습니다.

필드기본값설명
MaxInputSize50 MB최대 입력 크기, 메모리 고갈 방지
MaxCacheEntries2000캐시 항목 수 상한; 0으로 설정 시 캐시 비활성화
CacheTTL1시간캐시 유지 시간
CacheCleanup5분백그라운드 만료 캐시 정리 간격
WorkerPoolSize4배치 처리 동시성 (1–256)
ProcessingTimeout30초단일 문서 처리 타임아웃; 0으로 설정 시 무제한

캐시는 Processor 인스턴스에만 적용

패키지 수준 함수(예: html.Extract)는 풀링된 Processor를 사용하며, 호출할 때마다 캐시를 비웁니다. 캐시가 필요하면 html.New()로 독립 Processor를 생성하세요. 자세한 내용은 Processor 재사용과 캐시를 참조하세요.

보안

보안 설정은 프로덕션 환경에서 반드시 주의해야 할 중요 사항입니다. 전체 보안 기능 소개는 보안 개요를 참조하세요.

필드기본값설명
EnableSanitizationtrueHTML 소독 (위험한 태그/속성 제거)
MaxDepth500DOM 중첩 깊이 상한, 스택 오버플로 방지
AllowedBaseDir""파일 작업 샌드박스 디렉토리; 빈 값 = 제한 없음
Audit비활성화보안 감사 로그 설정

AllowedBaseDir

사용자가 제공한 파일 경로를 처리할 때는 반드시 AllowedBaseDir을 설정하세요. OS 파일 핸들을 통해 실제 경로를 해석하여 (심볼릭 링크와 Windows junction 우회 방지).

콘텐츠 추출

HTML에서 어떤 콘텐츠를 추출할지 제어합니다.

필드기본값설명
ExtractArticletrue지능형 문서 인식 (본문 콘텐츠 자동 위치 파악)
PreserveImagestrue이미지 정보 보존
PreserveLinkstrue링크 정보 보존
PreserveVideostrue비디오 추출
PreserveAudiostrue오디오 추출

불필요한 미디어 타입을 비활성화하면 성능이 향상됩니다:

go
cfg := html.DefaultConfig()
cfg.PreserveVideos = false
cfg.PreserveAudios = false
// 텍스트, 이미지, 링크만 추출

출력 형식

텍스트 출력에서 이미지와 링크의 표현 방식을 제어합니다. 자세한 내용은 출력 형식 실전을 참조하세요.

필드기본값선택 가능한 값
InlineImageFormat"none""none", "markdown", "html", "placeholder"
InlineLinkFormat"none""none", "markdown", "html"
TableFormat"markdown""markdown", "html"
Encoding""(자동)"utf-8", "gbk", "shift_jis", "windows-1252"

Encoding을 비워두면 자동 감지됩니다. 수동으로 지정하면 감지 단계를 건너뛰어 성능이 향상되지만, 인코딩을 확실히 알 때만 사용하세요. 자세한 내용은 인코딩 감지 실전을 참조하세요.

링크 추출

다음 필드는 ExtractAllLinks에서만 적용되며, 어떤 타입의 리소스 링크를 추출할지 제어합니다. 자세한 내용은 링크 추출 실전을 참조하세요.

필드기본값설명
ResolveRelativeURLstrue상대 URL을 절대 URL로 해석
BaseURL""해석 기준; 빈 값일 때 HTML에서 자동 감지
IncludeImagestrue<img> 링크 포함
IncludeVideostrue<video>/<iframe> 링크 포함
IncludeAudiostrue<audio> 링크 포함
IncludeCSStrue<link rel="stylesheet"> 포함
IncludeJStrue<script src> 포함
IncludeContentLinkstrue<a href> 내부 링크 포함
IncludeExternalLinkstrue외부 링크 포함
IncludeIconstruefavicon/icon 포함

링크 추출 vs 콘텐츠 추출

Include* 필드는 ExtractAllLinks에만 영향을 줍니다. 콘텐츠 추출(Extract)에서의 링크 보존은 PreserveLinks가 제어합니다.

확장

필드설명
Scorer커스텀 콘텐츠 평가기; nil일 때 DefaultScorer 사용

커스텀 Scorer로 특정 웹사이트에 맞춰 문서 인식을 최적화할 수 있습니다. 자세한 내용은 테스트와 사용자 정의 확장을 참조하세요.

일반적인 설정 조합

웹 크롤러

고빈도 배치 크롤링 시나리오에서는 동시성을 높이고 타임아웃을 줄이세요:

go
package main

import (
    "log"
    "time"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.DefaultConfig()
    cfg.WorkerPoolSize = 8                          // 배치 동시성 향상
    cfg.ProcessingTimeout = 10 * time.Second        // 타임아웃 단축
    cfg.PreserveVideos = false                      // 크롤러는 비디오 불필요
    cfg.PreserveAudios = false

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    // 배치 추출
    pages := [][]byte{[]byte("<html><body>페이지1</body></html>")}
    batch := processor.ExtractBatch(pages)
    log.Printf("성공 %d, 실패 %d", batch.Success, batch.Failed)
}

API 백엔드 서비스

사용자가 제출한 HTML을 처리할 때는 고보안 설정을 사용하고 파일 디렉토리를 제한하세요:

go
package main

import (
    "log"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.HighSecurityConfig()
    cfg.AllowedBaseDir = "/var/www/uploads" // 파일 디렉토리 제한

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    // 사용자 업로드 HTML 파일 처리
    result, err := processor.ExtractFromFile("/var/www/uploads/user.html")
    if err != nil {
        log.Fatal(err)
    }
    log.Println(result.Title)
}

콘텐츠 마이그레이션 도구

구 사이트의 HTML을 Markdown으로 변환하고, 링크를 보존하며 상대 URL을 해석합니다:

go
package main

import (
    "fmt"
    "log"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.MarkdownConfig()
    cfg.ResolveRelativeURLs = true
    cfg.BaseURL = "https://old-site.example.com"

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    data := []byte(`<html><body><article><h1>오래된 글</h1><a href="/post/123">링크</a></article></body></html>`)
    md, err := processor.ExtractToMarkdown(data)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(md)
}

Validate

모든 설정은 html.New()에 전달될 때 자동으로 검증됩니다. 수동으로 Validate()를 호출하여 미리 확인할 수도 있습니다:

go
cfg := html.DefaultConfig()
cfg.MaxInputSize = -1 // 의도적으로 잘못된 값 설정
if err := cfg.Validate(); err != nil {
    log.Fatal(err) // html: invalid config: MaxInputSize=-1, must be positive
}

검증 규칙에는 필드 범위 검사와 형식 문자열 검증이 포함됩니다. 잘못된 설정은 *ConfigError를 반환하며, errors.Is(err, html.ErrInvalidConfig)로 판별할 수 있습니다. 전체 필드 제약 사항은 API 레퍼런스 — 설정을 참조하세요.