본문 바로가기
기타/살다 보면 또 좋은 날 오겠지

대부분의 업무자동화는 코드가 너무 복잡하던데(?)

by 일코 2020. 12. 12.

대충 5년 가량 파이썬과 VBA로 엑셀 자동화, 아래아한글 자동화를 종종 다뤄본 입장에서 깨달았던, 가장 공유하고 싶은 인사이트는 바로...

업무자동화가 코딩 입문이나 기초과정보다는 훨씬 어렵다는 것이다.

(물론 엄청나게 간단하면서 효율적인 스크립트도 참 많기는 하다.)

혼자 몇 년 찬천히 삽질할 때는 잘 못 느꼈는데, 몇 번 다른 사람에게 가르쳐주려다 보니까 새삼 깨닫는다. 오랜 삽질도 자산이었다. 순식간에 지나가는 쌔한 느낌을 간과하면 항상 버그가 나타났다. 결국 잠깐 업무자동화 코드 짜려고 파이참 켰다가 한 시간 있다 보면 디버깅과 테스트, 온갖 익셉션을 다루고 있다. 오죽하면 요즘은 (말도 안 된다고 생각했던) TDD라는 개념도 배워보고 있다. 혹시 도움이 될까봐서..

결국 하다 보면 어느 지점에서 타협하게 된다.

'내가 전문 프로그래머도 아니고...'

자동화를 효율적으로 잘 짜는 방법은 한계를 인정하고 할 수 있는 만큼까지만 하는 것이라고 생각한다. 자동으로 처리 할 줄 모르겠으면 스택오버플로에다 던져놓고, 그냥 부족한 대로 용납하는 것. (그리고 다시 업무에 집중~)

어떤 문서에서든 완벽하게 돌아가는 프로그램을 만들기엔 예외가 항상 너무 많다. 왜 GUI로 감싸고, 조건부 서식을 엄격하게 두는지, 왜 엔드유저를 조금도 신뢰해서는 안되는지, 왜 결국 DBMS를 쓰게 되는지... 대부분은 깊은 고통을 동반한 후에야 여러 프로그래밍 교양서에서 읽었던 구절들 중 한 문장으로 노하우가 귀결되더라.

...내가 너무 깊이 들어온 거 아닌가? 온종일 아래아한글만 뚝딱거려도 월급 따박따박 받는 일개 회사원 나부랭이 따위가, 스스로를 너무 고급인력으로 과대평가하고 있는 거 아닌가? 이런 생각이 들기도 한다.


너무 이야기가 삼천포로 빠지고 있는 거 보니, 여기서 끊어야겠다. 하여튼 아래아한글 자동화를 알리고 싶은 사람 입장에서 아무리 파이썬의 쉬운문법  버프를 안고 가도 어려운 것이 사실이다. 오죽하면 쉽게 가르칠 방법을 알아내서 공유하는 노력보다, 고수준의 바인딩이나 잘 읽히는 API매뉴얼을 직접 만들어내는 게 효율적일 것 같다는 생각이 들기도 한다.

그걸 크게 느낀 게 최근이었다. 최근 올린 아래아한글 포스팅 중에 "특정 글자를 찾아서 진하게 만드는" 코드가 있었다. 내가 상상하는 우아한 코드는 이런 느낌이다.

target_list = Hwpdoc.find_strings_by_regex(r"^제\d장.+")
for i in target_list:
    i.style.bold = True


그런데 실제 구현해본 코드는 아래와 같다... 20줄이 넘는다.

hwp.InitScan()  # 탐색 초기화
장번호 = 1  # 인덱스
while True:  # break 만나기 전까지 아래 과정을 무한반복할 것.
    text = hwp.GetText()  # 탐색시작
    if text[0] == 1:  # 문서끝 코드(1)이 나타나면
        break  # while문 종료
    elif re.match(rf"^제{장번호}장", text[1].replace(" ", "")):  # 원하는 문단이면
        hwp.MovePos(201)  # 거기로 캐럿을 옮기고
        Act = hwp.CreateAction("CharShape")  # "글자모양" 액션 생성
        Set = Act.CreateSet()  # "글자모양 액션"의 아이템셋 생성
        Act.GetDefault(Set)  # "글자모양 액션 아이템셋"을 현재 선택블록의 값으로 채우기
        if Set.Item("Bold") == 1:  # 완성된 아이템셋에서 "진하게"가 적용되어 있는지 조회
            pass  # 이미 진하면 패스.
        else:  # 그렇지 않은 경우에 한해
            hwp.HAction.Run("MoveSelLineEnd")  # 라인 끝까지 선택
            hwp.HAction.Run("CharShapeBold")  # 진하게 적용
            hwp.HAction.Run("MoveLineBegin")  # 캐럿 원래위치로
        장번호 += 1  # 다음 장을 찾기 위해 인덱스 + 1
        hwp.InitScan()  # (내용수정이 생기면 탐색이 자동종료되므로) 다시 탐색초기화 실행
    else:  # 원하는 문자열이 아닌 경우
        pass  # 넘어가기

"원하는 문자열을 찾아서 진하게"라는 간단한 작업인데도 코드가 이 정도로 길고 복잡하다는 점은

별 수 없이 일반인에게, 보통 회사원에게 큰 진입장벽이 된다.

"사실 뜯어보면 별 거 없어요. 엄청 쉬워요." 라는 말은 거짓말이다. 인정한다. 어렵다.

 

현재 진행중인 고민이다..

댓글