웹 개발에서는 게시글 본문, 소개글, 피드백처럼 여러 줄에 걸친 긴 텍스트를 사용자로부터 입력받아 CGI 프로그램으로 전달해야 하는 경우가 자주 있습니다. 이럴 때 HTML의 <textarea> 요소를 사용합니다. 한 줄만 입력받는 <input type="text">와 달리, TEXTAREA는 단락 단위의 긴 문장 입력에 적합합니다.
HTML 폼 예제
다음은 TEXTAREA 박스가 포함된 폼의 HTML 코드 예제입니다.
<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank"> <textarea name = "textcontent" cols = "40" rows = "4"> 여기에 텍스트를 입력하세요... </textarea> <input type = "submit" value = "Submit" /> </form>
각 속성의 역할은 다음과 같습니다.
- action: 폼 데이터를 전송할 CGI 스크립트의 URL (예: /cgi-bin/textarea.py)
- method: 데이터 전송 방식. 긴 텍스트를 전송할 때는 POST 방식이 적합합니다.
- name: 서버 측에서 해당 필드 값을 참조할 때 사용하는 이름 (예: textcontent)
- cols / rows: 텍스트 영역의 가로 폭(문자 수)과 세로 높이(줄 수)를 지정합니다.
이 코드를 브라우저에서 실행하면 다음과 같은 폼이 나타납니다.

CGI 스크립트로 입력값 처리하기
웹 브라우저에서 전송된 데이터를 처리하는 textarea.py 스크립트는 다음과 같습니다.
#!/usr/bin/python3
# CGI 처리를 위한 모듈 임포트
import cgi, cgitb
# 오류 발생 시 브라우저에 상세 디버그 정보 표시
cgitb.enable()
# FieldStorage 인스턴스 생성
form = cgi.FieldStorage()
# 필드에서 데이터 가져오기
if form.getvalue('textcontent'):
text_content = form.getvalue('textcontent')
else:
text_content = "입력 없음"
# HTTP 헤더 출력
print("Content-type:text/html\r\n\r\n")
print("<html>")
print("<head>")
print("<title>Text Area - Fifth CGI Program</title>")
print("</head>")
print("<body>")
print("<h2>입력한 텍스트 내용: %s</h2>" % text_content)
print("</body>")
print("</html>")
코드 동작 원리
- 모듈 임포트:
cgi모듈은 폼 데이터를 파싱하는 핵심 기능을 제공하고,cgitb는 스크립트 실행 중 오류가 발생했을 때 브라우저에 상세한 traceback을 표시해 디버깅을 돕습니다. - FieldStorage 객체 생성:
cgi.FieldStorage()가 전송된 폼 데이터를 파싱하여 마치 딕셔너리처럼 필드별로 접근할 수 있는 객체를 만듭니다. - getvalue()로 값 읽기:
form.getvalue('textcontent')는 name이 textcontent인 필드의 값을 반환합니다. 값이 없으면 None을 반환하므로 if 문으로 빈 입력을 안전하게 처리할 수 있습니다. - 결과 출력: Content-type 헤더를 먼저 출력한 뒤 HTML 본문을 출력하여, 사용자가 입력한 텍스트를 화면에 그대로 보여줍니다.
참고: 위 코드는 현재 표준인 Python 3 문법(print 함수)으로 작성되었습니다. 구버전 Python 2에서는 print "Content-type:text/html\r\n\r\n"처럼 print를 괄호 없이 문장 형태로 사용했습니다. 또한 Python 3.13부터는 표준 라이브러리에서 cgi 모듈이 제거되었으므로, 최신 환경에서는 Flask나 Django 같은 웹 프레임워크 사용을 권장합니다.
마무리
TEXTAREA 요소와 CGI의 FieldStorage를 조합하면 여러 줄 텍스트 입력을 손쉽게 처리할 수 있습니다. 실무에서는 입력값 검증과 함께 XSS 공격 방지를 위해 html.escape() 등으로 출력값을 이스케이프 처리하는 것도 반드시 고려해야 합니다.