treeru.com
개발

undetected-chromedriver를 subprocess로 넘기려다 하루 날린 이야기

2026-03-25
Treeru

"subprocess에서 undetected-chromedriver로 Chrome을 띄우고, debug port로 메인 프로세스에 넘기면 되지 않을까?" 설계는 깔끔해 보였다. subprocess가 Chrome 초기화를 담당하고, 메인 프로세스는 준비된 Chrome 세션만 받아서 사용하는 구조. 이론상 완벽했다. 그런데 하루 종일 시도한 결과는 4가지 이유로 완전히 불가능하다는 결론이었다.

4가지

만난 문제

1일

날린 시간

0%

성공률

단일 프로세스

올바른 설계

1왜 subprocess로 넘기려 했나

기존 코드가 멀티프로세스 구조였다. 작업마다 subprocess를 생성해서 처리하고, 메인 프로세스는 orchestrator 역할만 하는 패턴이었다. 여기에 셀레니움 작업을 끼워 넣으면서 문제가 생겼다.

Chrome은 무거우니까 subprocess에서 Chrome을 띄워놓고,--remote-debugging-port로 메인 프로세스에서 연결하는 설계를 생각했다. subprocess가 Chrome 로그인까지 처리하고, 로그인된 세션을 메인 프로세스로 넘기는 방식. 그런데 여기서 UC(undetected-chromedriver)를 써야 하는 조건이 걸렸다.

# 의도했던 설계 (결론: 작동 안 함)

# subprocess에서
# UC로 Chrome 시작 → 로그인 → debug port 오픈

# 메인 프로세스에서
# 일반 selenium으로 debug port에 연결
options.add_experimental_option("debuggerAddress", "localhost:9222")
driver = webdriver.Chrome(options=options)

2문제 1: UC가 --remote-debugging-port를 무시한다

첫 번째 벽

UC는 chromedriver 실행 시 자체적으로 랜덤 포트를 할당한다.--remote-debugging-port=9222를 options에 넣어도 실제로는 UC가 선택한 랜덤 포트가 열린다.

# 시도한 코드

options = uc.ChromeOptions()
options.add_argument("--remote-debugging-port=9222")  # ← 무시됨

driver = uc.Chrome(options=options)
# 실제 포트: 랜덤 (9222가 아님)

UC 소스 코드를 열어보니 내부적으로 포트를 직접 관리하고 있었다. 지정한 포트를 덮어쓰는 방식이라 외부에서 포트를 고정할 수가 없었다. 물론 UC의 내부 포트를 읽어올 수는 있지만, subprocess 간에 이 정보를 안전하게 전달하는 것 자체가 또 다른 문제였다.

3문제 2: detach 옵션 미지원

두 번째 벽

subprocess가 종료될 때 Chrome도 같이 죽는 문제. 일반 chromedriver는 detach=True 옵션으로 프로세스 종료 후에도 Chrome을 살려둘 수 있다. UC는 이 옵션을 지원하지 않는다.

# 일반 selenium에서는 가능한데...

# 일반 selenium (작동함)
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=options)
# 프로세스 종료 후에도 Chrome 살아있음

# UC (작동 안 함)
options = uc.ChromeOptions()
options.add_experimental_option("detach", True)  # ← 무시되거나 오류
driver = uc.Chrome(options=options)
# 드라이버 종료 시 Chrome도 같이 죽음

UC는 chromedriver와 Chrome의 생명주기를 통합 관리한다. 이 구조 때문에 detach가 불가능한 것이다. subprocess로 Chrome을 생성하고 넘기는 아이디어 자체가 UC의 설계와 충돌한다.

4문제 3: stdout 파이프 상속 지옥

세 번째 벽 — 가장 황당했던 문제

subprocess로 UC를 실행했더니 메인 프로세스의 communicate()가 영원히 끝나지 않는 현상. UC chromedriver가 부모(메인 프로세스)의 stdout 파이프를 상속해서 열어두고 있기 때문이다. 파이프가 열려있는 한 communicate()는 EOF를 받지 못해 blocking 상태가 된다.

# 이렇게 하면 communicate()가 영원히 블록됨

proc = subprocess.Popen(
    ["python", "worker.py"],  # worker.py 안에서 UC 실행
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)
# 아래 줄이 영원히 안 끝남
stdout, stderr = proc.communicate()  # ← 무한 대기

# close_fds=True로 우회 시도 — 부분적 효과만

proc = subprocess.Popen(
    ["python", "worker.py"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    close_fds=True  # ← UC가 일부 파이프 여전히 상속
)

UC의 chromedriver 실행 방식이 파이프 상속을 막기 어렵게 설계되어 있었다. 이 문제를 해결하더라도 앞의 문제들이 여전히 남아있어서 이 시점에 이미 한계를 느꼈다.

5문제 4: 일반 chromedriver 전환 시 보이지 않는 탭

네 번째 벽

UC를 포기하고 subprocess에서 일반 chromedriver로 Chrome을 띄운 뒤 메인 프로세스에서 debug port로 연결을 시도했다. 연결은 됐다. 그런데 세션은 연결됐는데 실제 작업 중인 탭이 보이지 않았다. selenium이 인식하는 탭과 실제 로그인이 된 탭이 달랐다.

# debug port 연결 후 탭 목록이 다름

# 메인 프로세스에서
options.add_experimental_option("debuggerAddress", f"localhost:{port}")
driver = webdriver.Chrome(options=options)

# 보이는 탭
print(driver.window_handles)  # ['CDP_이상한핸들']

# subprocess에서 열었던 네이버 탭은 다른 핸들로 존재
# window_handles 목록에 제대로 안 뜸

Chrome의 debug port 연결 방식에서 selenium이 관리하는 탭 컨텍스트와 실제로 열려있는 탭 사이에 불일치가 발생하는 것이었다. 일반 chromedriver를 쓰면 어차피 봇 탐지에 걸리는 문제도 여전히 남아있어서 포기했다.

6결론: UC는 단일 프로세스에서만

결국 멀티프로세스 설계를 포기했다. UC를 메인 프로세스에서 직접 사용하고, 셀레니움 작업이 필요한 경우 메인 프로세스에서 처리하는 방식으로 전환했다. 코드 구조가 처음 의도와 달라졌지만 안정적으로 돌아간다.

최종 해결 방법

UC를 메인 프로세스에서 직접 사용. Chrome 세션을 subprocess로 넘기거나 공유하지 않는다. 멀티프로세스가 필요하다면 Chrome 작업만큼은 메인 프로세스에서 처리하도록 아키텍처를 수정했다.

시도결과이유
UC + --remote-debugging-port 고정실패UC가 포트를 내부적으로 덮어씀
UC + detach=True실패UC가 detach 미지원
subprocess communicate() 대기실패stdout 파이프 상속으로 무한 블로킹
일반 chromedriver + debug port 연결실패탭 컨텍스트 불일치 + 봇 탐지 문제 재발
메인 프로세스에서 UC 직접 사용성공UC 설계에 맞는 올바른 사용법

핵심 교훈

UC subprocess 핸드오프가 안 되는 이유

  • UC는 chromedriver를 내부적으로 관리 — 포트 고정이나 세션 이전을 지원하지 않음
  • detach 옵션 미지원 — subprocess 종료 시 Chrome도 같이 죽음
  • UC chromedriver가 부모 프로세스의 stdout 파이프를 상속해 communicate()가 블로킹됨
  • 일반 chromedriver로 debug port 연결 시 탭 컨텍스트 불일치 발생
  • UC는 단일 프로세스에서 처음부터 끝까지 사용하는 것이 올바른 패턴

본 글은 2026년 3월 직접 경험한 삽질을 바탕으로 작성되었습니다. undetected-chromedriver 버전에 따라 동작이 다를 수 있습니다. 본 콘텐츠의 비상업적 공유는 자유이나, 상업적 이용 시 문의 페이지를 통해 연락 바랍니다.

자동화 아키텍처 설계가 필요하신가요?

멀티프로세스 자동화, 셀레니움 시스템 설계, 안정적인 봇 탐지 우회까지. 직접 겪어본 경험으로 도와드립니다.

자동화 개발 상담 신청
T

Treeru

웹 개발, IT 인프라, AI 솔루션 분야의 실무 인사이트를 공유합니다. 기업의 디지털 전환을 돕는 IT 파트너, Treeru입니다.

공유

댓글

(2개)
4.50/ 5

로그인하면 댓글을 작성할 수 있습니다.

2026-03-25
555.0

UC subprocess 핸드오프 시도해보다가 stdout 파이프 문제에서 막혔는데 여기서도 같은 문제가 나오네요. 결국 단일 프로세스로 해결했습니다.

2026-03-25
454.0

UC가 detach를 지원 안 하는 줄 몰랐어요. 공식 문서에 명시가 안 되어 있어서 계속 시도했는데 이 글 보고 바로 이해했습니다.

관련 글

© 2026 TreeRU. All rights reserved.

본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.