소개
텍스트 필드는 Odoo에서 가장 흔하게 쓰이는 필드 유형 중 하나입니다. 메모란에 한 줄 이상의 코멘트를 남기거나, 상품 설명을 작성하거나, 영업 주문에 내부 코멘트를 추가할 때 대부분 사용자가 입력하는 공간이 바로 이 필드입니다.
화면에서는 단순한 여러 줄 입력 상자처럼 보이지만, 이 필드의 속성과 Odoo 데이터 모델·ORM에서의 역할을 이해하면 폼 설계, 커스텀 모듈 개발, 또는 Odoo Studio로 필드를 구성할 때 훨씬 적절한 결정을 내릴 수 있습니다.
이 가이드는 텍스트 필드가 무엇을 저장하는지와 동작 방식부터, 실제 비즈니스 활용 예시, 기술적 커스터마이징 방법, 권장 관행 및 흔히 범하는 실수까지 실무에 필요한 내용을 모두 다룹니다.
Odoo에서 텍스트(Text) 필드란 무엇인가
Odoo ORM에서 fields.Text는 여러 줄의 일반 텍스트를 저장하는 필드 타입입니다. PostgreSQL의 TEXT 컬럼으로 매핑되어 길이 제한이 없고, 한 문장부터 여러 단락까지 자유롭게 담을 수 있습니다.
In forms, it renders as a resizable <textarea> element. In list views, it appears as truncated plain text. In search views, it supports text-based filtering just like the Char field.
기본적인 필드 정의 예시는 다음과 같은 형태입니다(개념 설명용).
예: Python 모듈 내에서 모델을 확장해 내부 메모 필드를 추가하면, Odoo는 해당 필드를 TEXT 타입으로 처리합니다. (코드 예시는 개념 이해를 위한 형태입니다.)
Odoo Studio에서는 이 필드를 ‘Multi-Line Text(다중 줄 텍스트)’로 표기합니다. Studio로 만든 필드는 자동으로 x_studio_ 접두사가 붙고, 코드나 XML-RPC로 만들면 기술명(name)을 직접 정하게 됩니다.
Char, Text, Html 필드와의 차이점
Odoo에서는 텍스트를 담을 수 있는 필드가 몇 가지 있는데, 어떤 상황에 어느 타입을 써야 하는지 헷갈리는 경우가 흔합니다.
- Char 필드: 한 줄 입력용으로 이름, 코드, 참조값처럼 짧은 문자열에 적합합니다. 선택적으로 길이 제한(size)을 둘 수 있습니다.
- Text 필드: 여러 줄 입력용의 textarea로, 메모나 설명, 자유 서술형 코멘트를 담기에 좋습니다. 서식(마크업)이 없는 일반 텍스트를 저장합니다.
- Html 필드: 리치 텍스트 편집기를 제공하며, 서식이 필요한 이메일 템플릿, 제품 웹 설명, 웹 페이지 콘텐츠 등에 적합합니다. HTML 마크업을 함께 저장합니다.
Text 필드는 Char와 Html의 중간 역할을 합니다. Char보다 입력 공간이 넓고, Html처럼 서식 처리 복잡성은 없기 때문에 내부 메모나 간단한 설명 대부분에는 Text가 적절합니다.
텍스트 필드의 동작 원리
모델에 Text 필드를 추가하면 모듈 설치·업그레이드 시 Odoo가 PostgreSQL에 해당 TEXT 컬럼을 자동으로 생성합니다. 별도의 SQL 마이그레이션을 수동으로 할 필요는 없습니다.
Char와 달리 Text 필드에는 size 파라미터가 없습니다. 데이터베이스 컬럼 자체가 문자 수 제한을 두지 않도록 설계되어 있어, 내용 길이를 사전에 제한하기 부적절한 경우에 사용됩니다.
주요 필드 속성
Odoo에서 Text 필드에 자주 쓰이는 핵심 속성들은 다음과 같습니다.
- translate: True로 설정하면 다국어 번역을 지원합니다. 다국어 환경에서 사용자 언어에 따라 다른 값을 보여줘야 할 때 유용합니다.
- required: 필수 입력으로 만들어 줍니다. 이속성은 인터페이스와 ORM 레벨 모두에서 작동하여 값이 비어 있으면 레코드를 저장할 수 없습니다.
- default: 새 레코드 생성 시 자동으로 채워질 기본값을 지정합니다. 고정 문자열이나 호출 가능한(callable) 메서드 모두 허용됩니다.
- compute: 파이썬 메서드와 연결해 필드 값을 동적으로 계산하도록 합니다. 자동 요약이나 파생 콘텐츠 생성에 유용합니다.
- store: compute와 함께 사용하면 계산된 값을 DB에 저장할지 여부를 결정합니다. store=True이면 값이 검색 가능하고 리포트에 포함됩니다.
- copy: 레코드 복제 시 필드 값을 복사할지 여부를 제어합니다. 기본값은 True이며, 특정 상황에서는 False로 설정해 복제 시 비워두도록 합니다.
- index: Text 필드에는 일반적인 B-tree 인덱스를 잘 사용하지 않습니다. 검색 가능한 텍스트는 PostgreSQL의 전체 텍스트 검색(Full-Text Search)이나 Odoo의 필터링을 활용하는 것이 보통입니다.
뷰에서의 표시 방식
In form views, the Text field renders as a <textarea> that users can resize vertically. In list views, content is truncated to fit the column width. In search views, it supports text-based search filters out of the box once you add it to the search view definition.
Html 필드와 달리 Text 필드는 WYSIWYG 편집기를 로드하지 않습니다. 사용자가 입력한 그대로(줄바꿈 포함) DB에 저장되며 서식 도구 모음이 없다는 점을 염두에 둬야 합니다.
ORM과의 상호작용
개발자 관점에서 Text 필드의 읽기·쓰기는 단순합니다. 레코드 객체에서 값을 직접 읽고 쓰면 ORM이 영속성을 처리합니다. 줄바꿈은 그대로 저장되고, Text 필드에는 자동적인 입력 값 정화(sanitization)가 적용되지 않습니다. 이 점이 Html 필드와의 중요한 차이점으로, Html 필드는 XSS 방지를 위한 정화 로직이 들어갑니다.
비즈니스 활용 사례
실무에서 Text 필드가 쓰이는 대표적 위치들
영업: 내부 주문 메모
영업 주문의 note 또는 내부 메모 필드는 Text 타입인 경우가 많습니다. 영업 담당자는 배송 지침, 포장 유의사항, 고객 선호사항 등 구조화된 필드로 담기 어려운 내용을 기록해 운영팀과 공유합니다. 이 메모는 주문과 함께 이동하지만 고객에게 출력되지는 않습니다.
재고: 제품 내부 메모
제품 폼의 Notes 탭은 내부 운영 정보를 적는 Text 필드를 제공합니다. 창고팀은 취급 주의 사항, 파손 경고, 특정 공급처 관련 메모 등을 기록합니다. 웹사이트나 고객 문서에 노출되지 않으므로 외부에 알려줄 필요가 없는 운영 정보 저장에 적합합니다.
구매: 공급사 약정 및 배송 지시
구매 주문의 공급사 메모 필드는 이메일이나 통화로 합의된 특정 조건이나 배송 제약을 기록하는 데 사용됩니다. 주문 레코드에 해당 정보가 붙어 있으면 실제 입고 시점에 원 대화 내용을 찾지 못해 생기는 혼선을 줄일 수 있습니다.
CRM: 영업 기회 요약과 회의 노트
영업팀은 기회(Opportunity) 레코드에 회의 메모, 제기된 이슈, 구매 과정의 맥락 등을 Text 필드로 남깁니다. 채터(논의 로그)와 달리 전용 Text 필드는 구조적으로 정리되어 다른 담당자가 인계받을 때 빠르게 상황을 파악하게 해줍니다.
인사: 직원·지원자 코멘트
HR에서는 면접 메모, 온보딩 코멘트, 성과 관찰 사항 등을 직원 또는 지원자 레코드에 남겨야 할 때가 많습니다. 직원 모델에 붙은 Text 필드는 별도 모델을 만들지 않고 간단히 정보를 보관하고, 검색·출력·커스텀 리포트에 포함하기도 수월합니다.
텍스트 필드 생성과 맞춤화 방법
텍스트 필드를 모델에 추가하는 방법은 기술적 상황과 배포 방식에 따라 세 가지가 있습니다.
Odoo Studio 사용(코드 불필요)
코드를 쓰고 싶지 않은 비즈니스 사용자나 컨설턴트에게는 Odoo Studio가 가장 쉬운 방법입니다. 개발 없이 Text 필드를 추가하려면 다음 절차를 따르면 됩니다.
- 메인 메뉴에서 Odoo Studio를 엽니다(Studio 앱 필요).
- 필드를 추가할 폼을 엽니다.
- Studio 사이드바에서 ‘Multi-Line Text’ 필드를 폼으로 끌어다 놓습니다.
- 필드 속성 패널에서 라벨, 필수 여부, 기본값 등을 설정합니다.
- Studio를 저장하고 닫습니다.
Studio는 필드 생성과 뷰 업데이트를 자동으로 처리합니다. 생성된 필드는 x_studio_ 접두사를 갖고 즉시 폼에서 사용 가능하며 데이터베이스 마이그레이션이나 서버 재시작이 필요하지 않습니다.
Python으로 커스텀 모듈에서 정의하기
버전 관리가 필요하거나 여러 환경에 배포해야 하는 커스터마이즈는 Python 코드로 모델에 필드를 정의하는 것이 바람직합니다. 표준 Odoo 개발 방식은 다음과 같습니다.
예: res.partner를 확장해 x_client_notes 같은 Text 필드를 추가하면 모듈 설치 시 DB 컬럼이 자동 생성됩니다. (코드 예시는 개념 설명용입니다.)
모델 파일에 필드를 정의한 뒤에는 해당 필드를 보이게 할 뷰 XML에 추가해야 합니다. 모듈을 설치하거나 업그레이드하면 Odoo가 자동으로 데이터베이스 컬럼을 생성합니다. 장기 운영 환경에서는 이 방식이 권장됩니다.
XML-RPC API로 생성하기
배포 스크립트나 원격 설정 자동화 같은 상황에서는 XML-RPC API로 필드를 생성할 수도 있습니다.
XML-RPC를 통해 ir.model.fields에 ttype: 'text'로 필드를 생성하면 Odoo가 Text 필드로 등록합니다. 이 방법은 대량 설정이나 원격 배포 시 유용합니다.
ttype: 'text'는 Odoo에 Text 필드를 만들라는 의미이고, state: 'manual'은 모듈 외부에서 생성된 필드임을 표시합니다. Studio나 API로 필드를 만든 경우에 해당하는 설정입니다.
권장 실무 가이드
1. 실제로 여러 줄이 필요할 때만 Text를 사용하세요
가장 흔한 실수는 한 줄로 충분한 값(이름, 코드, 참조 등)에 Text를 쓰는 것입니다. 한 줄 값은 Char로 처리해야 UI가 깔끔하고 데이터 모델이 명확합니다. Text를 불필요하게 쓰면 폼이 거대해지고 데이터 구조가 오해받기 쉽습니다.
2. 서식이 필요하면 Html을 사용하세요
불릿 목록, 굵은 글씨, 하이퍼링크 등 서식을 필요로 하는 콘텐츠를 Text 필드에 넣으면 서식이 사라집니다. 이럴 때는 Html 필드를 선택해 WYSIWYG 편집과 마크업 저장을 활용해야 합니다.
3. 고객용·다국어 콘텐츠에는 translate를 켜세요
다국어로 운영되는 환경에서는 고객에게 보여지는 설명이나 문서에 쓰이는 Text 필드에 translate=True를 설정해야 각 언어별 번역을 관리할 수 있습니다. 내부 운영용 메모는 보통 번역이 필요하지 않습니다.
4. 복제되지 말아야 할 메모는 copy=False로 설정하세요
판매 주문이나 제품을 복제할 때 Text 필드는 기본적으로 복제됩니다. 원본 맥락에만 의미가 있는 메모는 복제되면 혼란을 일으키므로 그런 필드는 copy=False로 두어 복제 시 빈 값으로 시작하도록 하세요.
5. 자동 요약은 compute와 store=True 조합을 사용하세요
다른 필드 값을 합쳐 자동 요약을 만들고 싶을 때는 compute로 값을 생성하고 store=True로 DB에 저장하면 검색과 필터링, 리포트에 유리합니다. @api.depends 데코레이터로 의존 필드를 지정하면 효율적인 계산 필드를 만들 수 있습니다.
자주 발생하는 실수들
Html가 필요한데 Text를 선택하는 실수
웹사이트나 포맷된 PDF 출력에 들어갈 콘텐츠라면 Text로 저장하면 서식이 모두 사라집니다. 서식이 필요한 출력 채널이 있는지 먼저 확인하고 필드 타입을 결정하세요.
Char가 적합한데 Text를 고르는 실수
운송장 번호나 제품 코드처럼 짧은 값만 들어갈 필드를 Text로 만들면 불필요하게 큰 textarea가 폼을 어수선하게 만듭니다. 이런 경우 Char를 사용해 한 줄 입력으로 처리하세요.
다국어 레이블·설명에 translate 설정을 빼먹는 실수
여러 국가에서 쓰이는 Odoo 인스턴스에서 사용자에게 보이는 Text 필드에 translate=True를 빼먹으면 모든 사용자가 같은 내용을 보게 되어 문제를 일으킵니다. 사후에 추가하면 데이터 마이그레이션이 필요할 수 있으니 초기에 고려하세요.
구조화된 데이터를 Text에 저장하는 실수
JSON이나 파이프 구분 값처럼 구조화된 정보를 자유 텍스트에 숨겨두면 이후 필터·그룹·리포트가 불가능해집니다. 구조가 있는 데이터는 Selection, Many2one, 별도 모델 등 적절한 필드 타입으로 분리해야 유지보수가 쉬워집니다.
검색 뷰에 필드를 추가하지 않는 실수
중요한 정보를 담은 Text 필드인데 검색 뷰에 포함시키지 않으면 목록에서 키워드 검색으로 찾을 수 없습니다. 사용자가 일일이 스크롤해야 하므로, 검색 대상이 될 필드는 생성 시점에 검색 뷰에 추가하세요.
맺음말
텍스트 필드는 겉보기에는 평범하지만 폼을 진지하게 설계할 때 그 중요성이 드러나는 핵심 구성 요소입니다.
Char, Text, Html 중 어떤 것을 선택하느냐는 모든 Odoo 커스터마이즈 프로젝트 초반에 내려야 하는 기본 결정 중 하나이며, 올바르게 선택하면 추후 재작업과 데이터 품질 문제를 피할 수 있습니다.
Odoo Studio로 간단히 메모 필드를 추가하든, Python 모듈로 정의하든, API로 자동화하든 본 가이드의 원칙을 따르면 사용 사례에 맞게 필드를 적절히 구성할 수 있습니다.
잘 설계된 Odoo 데이터 모델은 작은 결정들의 누적입니다. 각 정보에 맞는 필드 타입을 고르는 것이 그중 하나이며, 적절히 쓰인 Text 필드는 구조화하기 어려운 서술형 내용을 담는 데 신뢰할 만한 도구가 됩니다.
Dasolo는 기업들이 모든 부서에서 Odoo를 구현·커스터마이즈·최적화하도록 돕습니다. 깔끔한 데이터 모델 설계, 맞춤 필드·워크플로우 개발, 또는 처음부터 전체 Odoo 이행까지 필요하신 것을 함께 진행합니다. 연락하기 귀사의 Odoo 프로젝트에 관해 이야기 나눠보시죠.