Claude Code –print 활용법: claude -p를 자동화 도구로 쓰는 실무 가이드¶
Claude Code를 처음 쓰면 보통 interactive 모드부터 떠올린다. 터미널에서 claude를 실행하고, 이 파일을 읽어달라거나 버그를 찾아달라고 말하면서 대화를 이어가는 방식이다. 이건 분명 강력하다. 다만 실무를 하다 보면 다른 욕심이 생긴다. “이걸 그냥 한 번 실행하고 결과만 받아서 스크립트에 붙일 수 없을까?”
그때 진짜 빛나는 옵션이 --print, 즉 claude -p다.
공식 CLI reference를 보면 claude -p "query"는 Query via SDK, then exit로 설명된다. 표현은 단순하지만, 이 한 줄이 의미하는 바는 꽤 크다. 대화형 세션을 열고 계속 주고받는 대신, Claude Code를 자동화 가능한 실행 단위로 호출할 수 있다는 뜻이기 때문이다.
이 글에서는 claude --print를 단순한 편의 옵션이 아니라, 터미널 자동화·쉘 파이프라인·CI 작업에 연결하는 실무 인터페이스로 해석해보겠다. 공식 문서 기준으로 핵심 플래그를 정리하고, 실제로 어디에 쓰면 체감이 큰지, 그리고 언제는 interactive 모드가 더 나은지도 같이 짚는다.
Claude –print는 무엇이고 왜 중요한가¶
claude -p의 가장 큰 장점은 “답변만 출력하고 끝난다”는 점이 아니다. 진짜 장점은 자동화 흐름에 끼워 넣기 쉬운 형태라는 데 있다.
예를 들어 interactive 모드는 이런 상황에 잘 맞는다.
- 코드베이스를 탐색하면서 여러 번 되묻고 싶을 때
- 방향을 바꿔가며 리팩터링을 진행할 때
- 장시간 세션에서 컨텍스트를 쌓아가고 싶을 때
반대로 --print는 이런 상황에 훨씬 잘 맞는다.
- 한 번의 입력으로 요약 결과만 받고 싶을 때
- 표준입력(stdin)으로 로그나 diff를 흘려 보내고 싶을 때
- shell script, cron, GitHub Actions 같은 비대화형 환경에서 실행하고 싶을 때
- 결과를 text나 JSON으로 받아 다음 단계에 넘기고 싶을 때
가장 단순한 예시는 이렇다.
claude -p "이 프로젝트의 README 개선 포인트를 5개로 정리해줘"
이건 그냥 “짧은 질문용”으로 보일 수 있다. 그런데 공식 문서에 이미 다음 예시가 같이 나온다.
cat logs.txt | claude -p "이 로그의 핵심 문제를 설명해줘"
여기서 감이 온다. claude -p는 채팅창 대체재가 아니라, 입력을 받아서 출력을 내보내는 CLI 컴포넌트처럼 쓸 수 있다. 이 차이를 이해하면 활용 폭이 확 넓어진다.
먼저 이해해야 할 핵심 플래그 5가지¶
claude --print를 제대로 쓰려면 -p만 외우면 끝이 아니다. 실무에서 중요한 건 그 주변 옵션들이다. 공식 CLI reference 기준으로 특히 체감이 큰 것만 뽑아보면 다음 다섯 가지다.
1) –output-format: 사람이 읽을지, 기계가 읽을지 정한다¶
공식 문서에 따르면 print mode의 출력 형식은 text, json, stream-json을 지원한다.
text: 사람이 바로 읽기 좋다json: 후속 스크립트가 파싱하기 좋다stream-json: 스트리밍 이벤트를 단계별로 처리하기 좋다
처음엔 대부분 text로 시작한다. 그게 가장 편하다. 하지만 자동화로 가면 거의 반드시 json 쪽으로 가게 된다. 이유는 단순하다. 자연어 문장은 사람이 보기엔 좋아도, 스크립트가 안정적으로 읽기엔 너무 유연하다. 문장 한 줄만 바뀌어도 후속 파서가 깨질 수 있다.
그래서 실무 감각으로는 이렇게 정리하면 된다.
- 내 눈으로 보고 끝내는 작업 → text
- 다른 프로그램이 이어서 읽는 작업 → json
- 이벤트를 실시간 처리하거나 세밀한 관찰이 필요함 → stream-json
2) –max-turns: 자동화를 안전하게 만든다¶
공식 문서에서 --max-turns는 print mode 전용이며, agentic turn 수를 제한한다고 설명한다. limit에 도달하면 에러로 종료한다.
이 옵션은 생각보다 중요하다. 자동화에서 제일 무서운 건 “잘 되느냐”보다 “예상보다 너무 오래 도느냐”다. 특히 CI나 cron 작업에서는 다음 같은 문제가 바로 생긴다.
- 실행 시간이 길어짐
- 비용 예측이 어려워짐
- 너무 많은 도구 호출이 발생함
- 파이프라인 전체 타임아웃을 유발함
그래서 claude -p를 반복 작업에 붙일 때는 --max-turns를 거의 기본값처럼 생각하는 편이 낫다.
claude -p --max-turns 3 "이 에러 로그를 분석하고 가장 가능성 높은 원인을 알려줘"
이렇게 해두면 결과가 조금 덜 화려할 수는 있어도, 자동화는 훨씬 다루기 쉬워진다.
3) –json-schema: 구조화 출력의 완성도¶
JSON 출력만으로는 아직 부족할 때가 있다. 모델이 JSON을 내놓더라도 키 이름이 조금씩 달라지거나, 배열 구조가 흔들리거나, 필드가 빠질 수 있기 때문이다. 이럴 때 --json-schema가 강력하다.
공식 문서에서는 print mode에서 JSON Schema에 맞춘 validated JSON output을 받을 수 있다고 설명한다. 이건 실무에서 정말 크다. 결과를 “그럴듯한 JSON”이 아니라 “계약이 있는 JSON”으로 바꿔주기 때문이다.
예를 들어 코드 리뷰 결과를 아래 구조로 고정하고 싶다고 해보자.
summaryrisk_levelmust_fixtest_suggestions
그러면 이런 식으로 설계할 수 있다.
git diff --staged | claude -p \
--output-format json \
--json-schema '{
"type":"object",
"properties":{
"summary":{"type":"string"},
"risk_level":{"type":"string","enum":["low","medium","high"]},
"must_fix":{"type":"array","items":{"type":"string"}},
"test_suggestions":{"type":"array","items":{"type":"string"}}
},
"required":["summary","risk_level","must_fix","test_suggestions"]
}' \
--max-turns 3 \
"코드 리뷰 결과를 JSON으로 반환해줘"
이런 패턴이 좋은 이유는 명확하다. 결과를 Slack 알림, GitHub PR 코멘트, 내부 대시보드, 릴리즈 체크리스트로 넘길 때 훨씬 안정적이다.
4) –input-format, –include-partial-messages: 스트리밍 입력·출력에 대비한다¶
공식 문서에는 --input-format text|stream-json, 그리고 --include-partial-messages 옵션도 나온다. 특히 후자는 --print와 --output-format=stream-json 조합에서 partial streaming events를 포함시킬 때 사용한다.
이 옵션들은 모든 사람이 당장 쓸 필요는 없다. 하지만 다음 단계 자동화를 생각한다면 존재를 알아둘 가치가 크다.
- 이벤트 단위 로깅
- 중간 진행 상황 추적
- 장시간 작업의 스트리밍 모니터링
- 다른 agent/tool 체인과 연결
즉, claude -p는 생각보다 훨씬 “파이프라인 친화적”인 설계를 갖고 있다.
5) –no-session-persistence, –max-budget-usd: 운영 관점의 옵션¶
공식 CLI reference에는 print mode에서 --no-session-persistence, --max-budget-usd도 지원한다고 나온다.
--no-session-persistence: 세션을 디스크에 남기고 싶지 않을 때 유용하다--max-budget-usd: 비용 상한을 미리 걸고 싶을 때 유용하다
이 둘은 데모보다 운영에서 빛난다. 개인 테스트에서는 없어도 되지만, 여러 저장소나 팀 파이프라인에 붙이기 시작하면 “얼마나 썼는지”, “무엇을 남기는지”가 꽤 중요한 문제가 된다.
실무에서 바로 쓰는 claude –print 패턴¶
이제부터는 진짜 중요한 부분이다. claude -p가 좋은 건 알겠는데, 대체 어디에 붙이면 효율이 바로 체감될까?
내 기준으로 가장 먼저 추천하는 건 세 가지다. 로그 요약, diff 리뷰, 문서 초안이다. 이 셋은 반복적이면서도, 사람이 처음부터 끝까지 직접 쓰기엔 귀찮고, 그렇다고 완전 자동 승인하면 위험해서 “초안 생성” 형태가 잘 맞는다.
패턴 1) 로그 요약 자동화¶
운영 로그나 테스트 실패 로그는 매번 읽기 귀찮다. 특히 길이가 길수록 더 그렇다. 이때 claude -p는 꽤 시원하게 먹힌다.
cat logs.txt | claude -p --max-turns 3 \
"이 로그에서 핵심 오류, 가장 가능성 높은 원인, 다음 확인 명령 3개를 정리해줘"
여기서 좋은 점은 두 가지다.
1. stdin으로 바로 흘려 넣을 수 있다.
2. 결과를 짧고 일정한 포맷으로 요구하기 쉽다.
이 패턴은 서버 장애 대응 초기에 특히 유용하다. 물론 Claude가 진실 그 자체를 보장하진 않는다. 하지만 “어디부터 봐야 하는지”를 압축해주는 첫 번째 정리 레이어로는 꽤 실용적이다.
패턴 2) git diff 리뷰 초안¶
개인적으로 claude -p가 가장 실무 친화적으로 느껴지는 순간은 git diff를 넣을 때다.
git diff --staged | claude -p \
--output-format json \
--max-turns 3 \
"이 변경사항의 핵심 요약, 잠재 리스크, 추가 테스트 포인트를 JSON으로 정리해줘"
이건 PR을 열기 전 점검 단계에 아주 잘 맞는다. 특히 다음 같은 팀에서 효율이 크다.
- 작은 수정이 자주 쌓이는 팀
- 코드 리뷰 전에 셀프 체크를 강하게 하는 팀
- PR 설명을 늘 비슷한 형식으로 쓰고 싶은 팀
Before/After 관점으로 보면 차이가 분명하다.
Before
- 커밋은 했는데 뭘 바꿨는지 설명을 다시 생각해야 함
- 놓친 테스트 포인트가 있는지 감으로 체크함
- 리뷰어가 맥락을 이해하는 데 시간이 걸림
After
- 변경 요약이 먼저 정리됨
- 위험 포인트를 선제적으로 점검함
- PR 본문 초안까지 바로 이어갈 수 있음
패턴 3) 릴리즈 노트·문서 초안 생성¶
사람들이 AI를 제일 자주 붙이는 영역 중 하나가 문서인데, claude -p는 여기서도 잘 먹힌다. 다만 핵심은 “완성본 자동 발행”이 아니라 “초안 자동 생성”이다.
git log --oneline -n 20 | claude -p \
--max-turns 3 \
"최근 변경사항을 기준으로 사용자용 릴리즈 노트 초안을 한국어로 작성해줘"
혹은 변경 파일 목록과 diff를 같이 넣어서 다음처럼 요청할 수도 있다.
- 사용자 공지용 요약
- 개발팀 내부 공유용 변경 요약
- QA 체크리스트 초안
- 배포 메일 초안
문서 작업은 “0에서 1”이 제일 힘들다. claude -p는 이 첫 문단의 마찰을 줄이는 데 유독 강하다.
CI/CD와 쉘 스크립트에 붙일 때 좋은 설계¶
여기서부터는 조금 더 운영적인 얘기다. claude -p를 스크립트에 붙일 때는 단순히 “되네?”에서 멈추면 안 된다. 자동화는 잘되는 것만큼 안전하게 망가지는 것이 중요하다.
1) 처음에는 text보다 JSON을 목표로 가는 편이 낫다¶
사람이 직접 읽는 용도라면 text도 충분하다. 하지만 팀에서 재사용할 계획이 있다면 아예 초반부터 JSON output을 염두에 두는 편이 좋다.
왜냐하면 자동화는 대체로 진화한다.
- 1단계: 터미널에서 사람이 본다
- 2단계: 결과를 파일에 저장한다
- 3단계: 다른 스크립트가 읽는다
- 4단계: Slack/이슈/PR에 붙인다
이 흐름으로 가면 결국 구조화 출력이 필요해진다. 그래서 초기부터 --output-format json을 고려하는 게 장기적으로 덜 귀찮다.
2) 가능한 한 schema를 붙인다¶
실무 경험상 JSON만 받고 schema를 생략하면, 처음 며칠은 좋아 보이다가 나중에 미묘한 필드 변화 때문에 손이 간다. 자동화는 예외가 쌓이면 바로 불신을 산다.
그래서 추천 순서는 이렇다.
1. 먼저 text로 아이디어 검증
2. 유효한 사용처가 보이면 JSON으로 전환
3. 팀이 쓰기 시작하면 schema를 붙여 계약화
이 순서를 따르면 속도와 안정성을 둘 다 챙기기 좋다.
3) max-turns와 실패 기준을 같이 둔다¶
--max-turns만 있다고 끝은 아니다. shell script 차원에서도 실패 조건을 같이 정해두는 게 좋다.
예를 들면 이런 식이다.
- 종료 코드가 0이 아니면 실패
- 응답 JSON에 필수 필드가 없으면 실패
- 응답 시간이 특정 기준을 넘으면 실패
- 결과가 비어 있으면 재시도 또는 사람 검토로 전환
즉, claude -p를 “똑똑한 함수 호출”처럼 취급하되, 함수 계약을 사람이 명시해야 한다.
4) 최종 결정은 사람에게 남긴다¶
이건 중요해서 한 번 더 강조하고 싶다. claude --print는 반복 업무 자동화에는 아주 좋지만, 최종 승인까지 무조건 맡기는 방향은 신중해야 한다. 특히 아래 영역은 사람 검토가 남아야 한다.
- 프로덕션 배포 승인
- 보안 관련 최종 판정
- 고객 공지 발송
- 중요 코드 변경의 자동 머지
내 추천은 늘 같다. 요약·분류·초안·체크리스트 생성은 적극 자동화하고, 승인·발행·병합은 사람 확인 단계를 남겨라.
interactive 모드보다 –print가 더 좋은 순간, 아닌 순간¶
claude -p 얘기를 하다 보면 가끔 “그럼 이제 interactive는 안 써도 되나?” 같은 오해가 생긴다. 그건 아니다. 두 모드는 경쟁 관계라기보다 역할 분담에 가깝다.
–print가 더 좋은 순간¶
- 반복 작업을 매번 같은 형식으로 실행할 때
- cron, CI, 훅, shell script에 붙일 때
- stdin으로 입력을 넘기고 결과만 회수하고 싶을 때
- JSON, schema 기반 후속 처리가 필요할 때
- 사람이 붙어 있지 않은 환경에서 돌릴 때
interactive가 더 좋은 순간¶
- 코드베이스를 탐색하면서 질문을 바꿔가야 할 때
- 여러 파일에 걸친 수정 방향을 함께 잡아갈 때
- 시행착오를 포함한 긴 대화가 필요할 때
- 결과보다 과정이 더 중요한 작업일 때
실제로는 둘을 섞어 쓰는 경우가 많다. 예를 들어 복잡한 버그는 interactive로 파악하고, 매일 반복되는 테스트 로그 분류는 claude -p로 돌리는 식이다. 이 조합이 제일 현실적이다.
실무 체크리스트와 바로 써볼 시작 예제¶
처음 도입하는 사람에게는 거창한 파이프라인보다 작은 반복 업무 하나를 골라 바꾸는 걸 추천한다. 예를 들면 이런 것들이다.
- staging 에러 로그 1차 요약
- PR 전 셀프 리뷰 초안 생성
- 릴리즈 노트 초안 작성
- 긴 문서에서 핵심 TODO만 뽑기
가장 안전한 시작 템플릿은 이 정도다.
cat input.txt | claude -p \
--max-turns 3 \
"입력 내용을 5줄로 요약하고, 핵심 액션 아이템 3개를 bullet list로 정리해줘"
그다음 한 단계 올린 템플릿은 이렇다.
cat input.txt | claude -p \
--output-format json \
--max-turns 3 \
"summary, action_items, risks 필드를 가진 JSON으로 결과를 반환해줘"
실무 안정성을 더 올리고 싶다면 마지막으로 schema까지 붙인다.
cat input.txt | claude -p \
--output-format json \
--json-schema '{
"type":"object",
"properties":{
"summary":{"type":"string"},
"action_items":{"type":"array","items":{"type":"string"}},
"risks":{"type":"array","items":{"type":"string"}}
},
"required":["summary","action_items","risks"]
}' \
--max-turns 3 \
"결과를 JSON으로 반환해줘"
이 정도만 익혀도 claude --print는 그냥 “짧은 답변용 옵션”이 아니라, 꽤 쓸 만한 자동화 빌딩블록으로 보이기 시작한다.
마무리: claude –print는 작은 자동화부터 시작할 때 제일 강하다¶
공식 문서를 보면 claude -p는 분명 단순하다. 한 번 실행하고 끝난다. 하지만 주변 플래그를 같이 보면 얘기가 달라진다. --output-format, --json-schema, --max-turns, --input-format, --no-session-persistence, --max-budget-usd 같은 옵션은 이 모드가 애초에 자동화 친화적인 용도를 품고 있다는 신호에 가깝다.
내 결론은 이렇다.
- interactive 모드는 탐색과 협업에 강하다.
claude --print는 반복 작업과 비대화형 실행에 강하다.- 실무에서 체감이 큰 건
text보다json, 그리고 가능하면schema까지 가는 흐름이다. - 자동화일수록
--max-turns같은 제한 장치를 꼭 같이 써야 한다.
만약 아직 한 번도 안 써봤다면, 오늘은 거창한 시스템 대신 딱 하나만 해보면 된다. 매일 반복해서 읽기 귀찮은 로그, diff, 문서 하나를 골라 claude -p에 넣어보자. 아마 그 순간부터 Claude Code가 “대화형 도우미”를 넘어, 꽤 현실적인 자동화 도구로 보이기 시작할 것이다.
참고 자료¶
- Claude Code Overview: https://code.claude.com/docs/en/overview
- Claude Code CLI Reference: https://code.claude.com/docs/en/cli-reference
- Claude Code Changelog: https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md