5 분 소요

이 장에서 배울 것

이번 장에서는 워크플로우 관리(workflow management)를 배웁니다. 워크플로우는 여러 분석 단계를 정해진 순서와 의존성에 따라 자동으로 실행하는 구조입니다. 생물정보학 분석은 보통 한 번의 코드 실행으로 끝나지 않습니다. 품질관리, trimming, 정렬, 정량, 통계분석, 그림 생성이 줄줄이 이어집니다.

핵심 용어를 먼저 정리하겠습니다.

  • 워크플로우(workflow): 여러 분석 단계를 연결한 전체 흐름입니다.
  • 파이프라인(pipeline): 입력 데이터가 여러 처리 단계를 지나 결과로 바뀌는 과정입니다.
  • 규칙(rule): 어떤 입력 파일을 받아 어떤 출력 파일을 만들지 정의한 단위입니다.
  • 의존성(dependency): 어떤 결과를 만들기 전에 먼저 필요한 파일이나 단계입니다.
  • DAG(directed acyclic graph): 순환이 없는 방향 그래프입니다. 워크플로우의 실행 순서를 표현할 때 씁니다.
  • Snakemake: 규칙 기반 워크플로우 도구입니다. 앞으로는 Snakemake라고 부르겠습니다.
  • Nextflow: 대규모 파이프라인과 컨테이너 실행에 강한 워크플로우 도구입니다. 앞으로는 Nextflow라고 부르겠습니다.

워크플로우 관리

가장 쉬운 비유: 자동 조립 라인

공장에서 부품을 조립할 때 순서가 있습니다. 바퀴를 달기 전에 차체가 있어야 하고, 도색 전에 표면 처리가 필요합니다. 생물정보학 분석도 비슷합니다. BAM 파일을 만들기 전에 FASTQ 정렬이 필요하고, 변이 검출 전에 정렬 결과가 필요합니다.

워크플로우 도구는 이 순서를 기억하고 필요한 단계만 자동으로 실행합니다.

왜 그냥 bash 스크립트로 부족할 수 있는가

간단한 분석은 bash 스크립트로도 가능합니다.

fastqc sample.fastq.gz
hisat2 -x genome -U sample.fastq.gz -S sample.sam
samtools sort sample.sam -o sample.bam

하지만 샘플이 100개가 되고, 중간에 일부 단계가 실패하고, 몇 개 파일만 다시 만들어야 한다면 복잡해집니다. 워크플로우 도구는 이미 만들어진 파일은 건너뛰고, 필요한 출력이 없는 단계만 다시 실행할 수 있습니다.

Snakemake의 기본 생각

Snakemake는 “이 출력 파일을 만들려면 어떤 입력 파일과 명령이 필요한가?”를 규칙으로 적습니다.

rule sort_bam:
    input:
        "mapped/sample.sam"
    output:
        "mapped/sample.sorted.bam"
    shell:
        "samtools sort {input} -o {output}"

이 규칙은 mapped/sample.sam을 입력으로 받아 mapped/sample.sorted.bam을 만든다는 뜻입니다. Snakemake는 출력 파일이 필요한지 보고, 필요하면 shell 명령을 실행합니다.

여러 샘플을 다루는 방식

생물정보학은 여러 샘플을 반복 처리하는 일이 많습니다. 예를 들어 sample1, sample2, sample3이 있다면 같은 규칙을 샘플마다 적용해야 합니다.

SAMPLES = ["sample1", "sample2", "sample3"]

워크플로우에서는 샘플 이름 목록과 파일 이름 패턴을 이용해 반복 처리를 자동화합니다. 사람이 명령어를 100번 복사해 붙이는 것보다 오류가 훨씬 적습니다.

DAG는 실행 순서 지도입니다

DAG는 분석 단계의 의존성을 그림으로 보여줍니다.

FASTQ → QC
FASTQ → 정렬 → BAM 정렬 → count
count + metadata → 통계분석 → 그림

화살표는 “앞 단계가 끝나야 뒤 단계가 가능하다”는 뜻입니다. DAG가 있으면 어떤 단계가 먼저 실행되어야 하는지 명확해집니다.

로그와 실패 처리

긴 분석에서는 실패가 자연스럽게 생깁니다. 파일 경로가 틀릴 수도 있고, 메모리가 부족할 수도 있고, 입력 파일이 깨졌을 수도 있습니다. 그래서 각 단계의 로그를 남기는 것이 중요합니다.

log:
    "logs/sort_bam.log"

로그는 나중에 오류 원인을 찾는 단서입니다. 좋은 파이프라인은 결과만 만드는 것이 아니라, 실패했을 때 어디서 왜 실패했는지 추적할 수 있어야 합니다.

설정 파일을 분리하기

파이프라인 코드 안에 샘플 이름, 경로, 옵션을 모두 박아 넣으면 재사용이 어렵습니다. 설정 파일을 따로 두면 같은 코드로 다른 프로젝트를 처리할 수 있습니다.

reference: data/reference.fa
samples:
  - sample1
  - sample2
threads: 8

설정과 코드를 분리하면 파이프라인을 더 깨끗하게 관리할 수 있습니다.

실전 보강: wildcard와 샘플 확장

워크플로우 도구의 힘은 같은 규칙을 여러 샘플에 안전하게 반복하는 데 있습니다.

SAMPLES = ["S1", "S2", "S3"]

rule sort_bam:
    input:
        "mapped/{sample}.sam"
    output:
        "mapped/{sample}.sorted.bam"
    shell:
        "samtools sort {input} -o {output}"

여기서 {sample}은 wildcard입니다. S1, S2, S3에 대해 각각 같은 규칙이 적용됩니다. 샘플이 3개면 sorted BAM도 3개 만들어집니다. 샘플이 100개여도 규칙을 100번 복사하지 않습니다.

실전 보강: DAG와 실패한 단계만 다시 실행하기

워크플로우는 출력 파일 사이의 의존성을 보고 DAG를 만듭니다.

FASTQ → QC
FASTQ → alignment → sorted BAM → variant calling → VCF

만약 variant calling 단계만 실패했다면 FASTQ QC와 alignment를 처음부터 다시 할 필요가 없습니다. 이미 필요한 중간 파일이 있고 변경되지 않았다면 실패한 단계부터 다시 실행할 수 있습니다. 이것이 긴 생물정보학 파이프라인에서 매우 중요합니다.

초보자가 자주 하는 오해

  • 오해 1: 워크플로우는 bash를 길게 쓴 것과 같다. 의존성 추적, 재실행 판단, 로그 관리가 핵심 차이입니다.
  • 오해 2: 출력 파일 이름만 맞으면 된다. input/output 관계가 잘못되면 엉뚱한 파일로 분석할 수 있습니다.
  • 오해 3: DAG에 순환이 있어도 괜찮다. A가 B를 필요로 하고 B가 A를 필요로 하면 시작할 수 없습니다.
  • 오해 4: config 파일은 귀찮은 장식이다. 샘플 목록과 파라미터를 코드에서 분리해야 재사용과 재현이 쉬워집니다.

이전 개념과 다음 개념의 연결

워크플로우는 E13 RNA-seq, E14 변이 분석, E15 single-cell 분석을 실제로 여러 샘플에 반복 적용하는 방법입니다. 실행 환경은 E20, 계산 자원은 E22, 결과 재현은 E24와 이어집니다.

생물정보학에서 왜 중요한가

연구 결과는 한 번 눌러서 나온 것이 아닙니다. 수많은 중간 파일과 처리 단계가 결과를 만듭니다. 워크플로우 관리는 이 과정을 코드로 기록해, 다시 실행하고 검증할 수 있게 만듭니다.

어려운 개념 보강: Snakemake rule의 input/output을 읽는 법

Snakemake에서 초보자가 가장 많이 틀리는 부분은 input, output, shell의 관계입니다. rule은 “출력 파일을 만들기 위한 약속”입니다. 사람이 명령을 위에서 아래로 실행한다고 생각하기보다, Snakemake가 필요한 출력 파일을 보고 거꾸로 필요한 입력을 찾아간다고 이해해야 합니다.

rule sort_bam:
    input:
        "mapped/{sample}.sam"
    output:
        "mapped/{sample}.sorted.bam"
    shell:
        "samtools sort {input} -o {output}"

각 요소의 의미는 다음과 같습니다.

  • rule sort_bam: 규칙 이름입니다. 사람이 알아보기 위한 이름입니다.
  • input: 이 결과를 만들기 전에 있어야 하는 파일입니다.
  • output: 이 규칙이 만들어야 하는 파일입니다.
  • {sample}: wildcard입니다. S1, S2 같은 샘플 이름이 들어갈 자리입니다.
  • shell: 실제로 실행할 명령입니다.

예를 들어 최종 목표가 mapped/S1.sorted.bam이면 Snakemake는 {sample}S1로 채워서 다음 관계를 만듭니다.

input  = mapped/S1.sam
output = mapped/S1.sorted.bam
shell  = samtools sort mapped/S1.sam -o mapped/S1.sorted.bam

흔한 오류는 shell 명령이 output과 다른 파일을 만드는 경우입니다.

rule bad_sort:
    input:
        "mapped/{sample}.sam"
    output:
        "mapped/{sample}.sorted.bam"
    shell:
        "samtools sort {input} -o result.bam"

이 규칙은 outputmapped/{sample}.sorted.bam을 적어 놓고 실제 명령은 result.bam을 만듭니다. 그러면 Snakemake 입장에서는 약속한 output이 생기지 않은 것입니다. 워크플로우에서는 파일 이름 약속이 곧 논리입니다.

DAG는 이 약속들의 연결입니다. 어떤 rule의 output이 다른 rule의 input이 되면 두 단계가 연결됩니다. 그래서 workflow를 설계할 때는 “명령어를 어떤 순서로 쓸까?”보다 “각 단계가 어떤 파일을 받아 어떤 파일을 만드는가?”를 먼저 생각하는 편이 안전합니다.

미니 실습 블록: Snakemake rule의 input/output 연결 확인하기

이 실습은 Snakemake rule의 input/output 연결 확인하기를 직접 손으로 확인하는 연습입니다. 왜 필요한가 하면, 워크플로우 도구는 파일 의존성을 기준으로 실행 순서를 정하므로 input과 output이 어긋나면 전체 파이프라인이 멈추기 때문입니다.

rule count_reads:
    input:
        "data/raw/{sample}.fastq.gz"
    output:
        "results/{sample}.read_count.txt"
    shell:
        "zcat {input} | wc -l > {output}"

각 코드 요소의 의미를 풀어보면 다음과 같습니다. {sample}은 wildcard입니다. Snakemake는 원하는 output을 만들기 위해 필요한 input을 역으로 찾고, rule 사이의 의존성을 DAG로 구성합니다.

생물정보학/계산생물학에서 쓰이는 장면은 분명합니다. 여러 샘플의 QC, trimming, alignment, counting을 자동 반복할 때 필요합니다.

흔한 오해 또는 주의점도 있습니다. shell 명령이 실제로 만드는 파일 경로와 output에 적힌 경로가 다르면 Snakemake는 결과를 찾지 못합니다.

핵심 정리

워크플로우 관리는 여러 분석 단계를 의존성에 따라 자동 실행하는 방법입니다. Snakemake와 Nextflow는 대표적인 도구입니다. 좋은 워크플로우는 입력, 출력, 규칙, 로그, 설정 파일을 명확히 남깁니다.

문제 풀이

워크플로우 관리

0 / 42
Gemini AI 채점

주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.

API KEY 미등록
  1. 1. [객관식] 객관식

    워크플로우의 설명으로 적절한 것은?

    선택지
  2. 2. [객관식] 객관식

    파이프라인(pipeline)의 설명으로 적절한 것은?

    선택지
  3. 3. [객관식] 객관식

    규칙(rule)의 설명으로 적절한 것은?

    선택지
  4. 4. [객관식] 객관식

    의존성(dependency)의 의미로 적절한 것은?

    선택지
  5. 5. [객관식] 객관식

    DAG의 설명으로 적절한 것은?

    선택지
  6. 6. [객관식] 객관식

    Snakemake의 대표적 특징으로 적절한 것은?

    선택지
  7. 7. [객관식] 객관식

    Nextflow가 자주 언급되는 이유로 적절한 것은?

    선택지
  8. 8. [객관식] 객관식

    bash 스크립트만으로 복잡한 분석이 어려워지는 상황은?

    선택지
  9. 9. [객관식] 객관식

    Snakemake 규칙의 input은 무엇을 뜻하는가?

    선택지
  10. 10. [객관식] 객관식

    Snakemake 규칙의 output은 무엇을 뜻하는가?

    선택지
  11. 11. [객관식] 객관식

    워크플로우 도구가 이미 만들어진 파일을 보고 할 수 있는 일은?

    선택지
  12. 12. [객관식] 객관식

    로그(log)를 남기는 이유로 적절한 것은?

    선택지
  13. 13. [객관식] 객관식

    설정 파일을 분리하는 이유로 적절한 것은?

    선택지
  14. 14. [객관식] 객관식

    샘플 100개에 같은 분석을 적용할 때 워크플로우가 유리한 이유는?

    선택지
  15. 15. [객관식] 객관식

    워크플로우에서 “입력 FASTQ → 정렬 BAM → count table”은 무엇을 보여주는가?

    선택지
  16. 16. [객관식] 객관식

    좋은 파이프라인의 특징으로 적절한 것은?

    선택지
  17. 17. [객관식] 객관식

    워크플로우가 연구 재현성에 도움 되는 이유는?

    선택지
  18. 18. [객관식] 객관식

    DAG에서 순환이 있으면 문제가 되는 이유로 적절한 것은?

    선택지
  19. 19. [객관식] 객관식

    samtools sort {input} -o {output}에서 {input}{output}은?

    선택지
  20. 20. [객관식] 객관식

    워크플로우를 쓰더라도 사람이 확인해야 할 것은?

    선택지
  21. 21. [객관식] 객관식

    Snakemake에서 {sample} 같은 표현의 역할은?

    선택지
  22. 22. [객관식] 객관식

    샘플 5개에 대해 각 샘플마다 sorted BAM 1개를 만드는 규칙이 있다. 출력 sorted BAM 수는?

    선택지
  23. 23. [객관식] 객관식

    샘플 4개마다 QC html과 QC zip을 하나씩 만든다면 총 출력 파일 수는?

    선택지
  24. 24. [객관식] 객관식

    DAG에 순환이 있으면 안 되는 이유는?

    선택지
  25. 25. [객관식] 객관식

    워크플로우 도구가 bash 스크립트보다 유리한 대표 상황은?

    선택지
  26. 26. [객관식] 객관식

    Snakemake rule의 inputoutput이 중요한 이유는?

    선택지
  27. 27. [객관식] 객관식

    config 파일로 샘플 목록과 파라미터를 분리하는 이유는?

    선택지
  28. 28. [객관식] 객관식

    출력 파일이 이미 있고 입력 파일이 바뀌지 않았다면 워크플로우 도구가 할 수 있는 합리적 행동은?

    선택지
  29. 29. [객관식] 객관식

    로그 파일이 중요한 이유는?

    선택지
  30. 30. [객관식] 객관식

    E13 RNA-seq 파이프라인을 워크플로우화할 때 가장 적절한 단위는?

    선택지
  31. 31. [실전] 객관식

    Snakemake에서 inputoutput이 중요한 이유는?

    선택지
  32. 32. [실전] 객관식

    Snakemake rule의 output 경로와 shell 명령이 만든 파일 경로가 다르면?

    선택지
  33. 주관식 33. [응용] 주관식 · Gemini 채점

    워크플로우와 파이프라인을 입문자 눈높이로 설명하라.

  34. 주관식 34. [응용] 주관식 · Gemini 채점

    Snakemake 규칙이 input, output, shell을 갖는 이유를 설명하라.

  35. 주관식 35. [응용] 주관식 · Gemini 채점

    DAG가 워크플로우에서 중요한 이유를 설명하라.

  36. 주관식 36. [응용] 주관식 · Gemini 채점

    로그가 긴 생물정보학 분석에서 중요한 이유를 설명하라.

  37. 주관식 37. [응용] 주관식 · Gemini 채점

    설정 파일을 코드와 분리하는 장점을 설명하라.

  38. 주관식 38. [응용] 주관식 · Gemini 채점

    워크플로우 도구가 bash 스크립트보다 유리한 상황을 설명하라.

  39. 주관식 39. [응용] 주관식 · Gemini 채점

    샘플 5개에 대해 QC html과 sorted BAM을 각각 1개씩 만드는 워크플로우라면 최종 출력 파일 수를 계산하고, wildcard가 왜 유용한지 설명하라.

  40. 주관식 40. [응용] 주관식 · Gemini 채점

    워크플로우 도구가 실패한 단계만 다시 실행할 수 있는 이유를 DAG와 input/output 관점에서 설명하라.

  41. 주관식 41. [실습] 주관식 · Gemini 채점

    FASTQ 파일의 줄 수를 세어 results/{sample}.line_count.txt로 저장하는 Snakemake rule을 작성하라.

  42. 주관식 42. [실습] 주관식 · Gemini 채점

    워크플로우의 DAG가 왜 순환을 가지면 안 되는지 설명하라.