소개
Char 필드는 Odoo 데이터 모델에서 가장 기본적이고 자주 쓰이는 문자열 필드입니다. 연락처 이름, 제품 코드, 주문 메모처럼 화면에서 보이는 짧은 텍스트 항목 대부분이 사실상 Char 필드로 저장됩니다.
Odoo Studio로 양식을 구성하는 업무 사용자이든, 모듈을 개발하는 개발자이든, 고객의 시스템 설계를 돕는 컨설턴트이든 간에 이 필드의 동작 원리를 이해하는 것은 정확한 설정과 데이터 품질 유지에 큰 도움이 됩니다.
겉보기에는 단순해 보이지만, 길이 제한, 번역 설정, 인덱스 처리, 계산 필드와의 결합 등 알아둬야 할 속성과 동작이 여러 가지 있습니다. 이 글에서는 Char 필드가 무엇을 저장하는지, 화면에서 어떻게 보이고 동작하는지, 생성·수정 방법과 실제 비즈니스 사례까지 핵심만 정리합니다.
Odoo에서 Char 필드란 무엇인가
Odoo의 ORM에서 Char 필드는 짧은 텍스트를 저장하도록 설계되어 있습니다. 데이터베이스에는 크기 제한을 명시했는지에 따라 PostgreSQL의 VARCHAR 또는 TEXT 컬럼으로 매핑됩니다.
사용자 인터페이스 관점에서는 Char 필드가 단일행 텍스트 입력란으로 표시되고 목록뷰에서는 일반 텍스트 열로 보입니다. 이름, 코드, 식별자처럼 한 줄에 들어가는 짧은 문자열을 저장할 때 표준적으로 사용됩니다.
모델 정의에서 어떻게 보이는지 예시를 보면 직관적입니다.
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
customer_po_reference = fields.Char(
string='Customer PO Reference',
size=64,
index=True,
)
string은 화면에 표시되는 레이블을 정하고, 선택 사항인 size는 최대 문자 수를 제한합니다. index는 해당 필드로 빠른 검색을 할 수 있도록 데이터베이스 인덱스를 만듭니다.
Odoo Studio에서는 같은 개념의 필드를 ‘Text(한 줄)’로 드롭해 만들 수 있으며, 이때 자동으로 x_studio_ 접두사가 붙습니다. 코드나 API로 만들면 기술 이름을 직접 정할 수 있습니다.
필드의 동작 방식
필드를 정의하면 모듈 설치나 업그레이드 시점에 Odoo가 데이터베이스 컬럼을 자동으로 생성해 주기 때문에 별도의 SQL 마이그레이션을 수동으로 작성할 필요가 없습니다.
데이터베이스 레벨에서 size를 지정하지 않으면 필드는 TEXT로 저장되고, 지정하면 VARCHAR(n)로 저장됩니다. PostgreSQL은 두 타입을 효율적으로 다루므로 주된 차이는 성능보다는 길이 제약을 강제할지의 여부입니다.
주요 필드 속성
Odoo에서 Char 필드에 자주 사용하는 핵심 속성들은 다음과 같습니다:
- size: 허용 가능한 최대 문자 수입니다. 지정하지 않으면 DB 레벨에서 길이 제한이 없습니다.
- translate:
True로 설정하면 언어별 번역을 허용합니다. 다국어 환경에서 유용합니다. - required: 인터페이스와 모델 차원에서 필드를 필수로 만듭니다.
- default: 새 레코드 생성 시 자동으로 채워질 기본값을 설정합니다.
- index: 해당 필드로 빠른 검색과 필터링이 가능하도록 인덱스를 생성합니다.
- compute: 파이썬 메서드로 값을 동적으로 계산하도록 연결합니다. 파생 값이나 조합 값에 유용합니다.
- store:
compute와 함께 사용하면 계산된 값을 DB에 저장할지 여부를 제어합니다. - copy: 레코드 복제 시 필드 값을 복사할지 제어합니다. 기본값은
True입니다.
뷰에서의 표시 방식
폼 뷰에서는 일반적인 <input type="text">로 보이고, 리스트 뷰에서는 텍스트로 렌더링됩니다. 검색 뷰에서는 포함(contains), 동일(equals), 시작(with) 같은 연산자 필터를 기본으로 지원합니다.
뷰 위젯을 적용하면 표시 방식을 바꿀 수 있습니다. 예를 들어 email 위젯을 쓰면 클릭 가능한 이메일 링크가 되고, url 위젯은 새 탭에서 열도록 만듭니다.
Odoo ORM과의 상호작용
개발자 입장에서는 Char 필드의 읽기·쓰기 방식이 다른 필드와 동일합니다. 레코드 객체에서 값을 직접 읽고 쓸면 되며, 정의한 속성에 따라 프레임워크가 유효성 검사와 처리(예: 길이 제한, 번역)를 담당합니다. 복잡한 변환 과정이 없어 실무에서 매우 편리합니다.
비즈니스 적용 사례
Char 필드는 Odoo 구현 전반에 걸쳐 광범위하게 활용됩니다. 다음은 실무에서 흔히 보이는 다섯 가지 사례입니다.
CRM: 고객 참조 코드
기업들은 고객마다 내부 식별 코드를 부여하곤 합니다. res.partner에 Char 필드를 추가하면 고객 목록에서 검색이 쉬워지고, 판매주문이나 청구서에 자동으로 표시되어 비슷한 이름의 고객을 구분할 때 유용합니다.
영업: 구매 주문 번호 표기
고객이 보낸 구매 주문에는 PO 번호가 포함되며 이 값은 청구서와 배송 문서에 표시되어야 합니다. sale.order의 기본 client_order_ref가 Char 필드로 흐름을 유지해 고객과의 불필요한 확인 절차를 줄여 줍니다.
재고: 내부 제품 코드
product.template의 default_code는 Odoo에서 내부 참조로 쓰이는 Char 필드입니다. 창고, 바코드 스캐너, 구매 주문 등 시스템 전반에서 일관된 식별자로 사용되므로 데이터 정리가 중요합니다.
회계: 세금·등록 번호
VAT, 세무 ID, 사업자 등록번호 같은 값은 파트너 레코드의 Char 필드에 저장됩니다. 적절히 설정하면 청구서와 비용 문서에 자동으로 반영되어 여러 국가에서 운영하는 회사의 수작업을 크게 줄여줍니다.
HR: 사원 ID 및 출입 카드 코드
사원 식별 번호나 배지 코드, 외부 급여 시스템의 식별자를 저장할 때 Char 필드는 가볍고 편리한 연결 수단이 됩니다. 초기에 완전한 통합이 없어도 기록을 일치시키는 데 도움이 됩니다.
Char 필드 생성 및 커스터마이즈 방법
Odoo 모델에 Char 필드를 추가하는 방법은 기술 스택과 배포 방식에 따라 크게 세 가지가 있습니다.
Odoo Studio 사용(코드 불필요)
Odoo Studio는 로우코드로 커스텀 필드를 추가할 때 가장 쉬운 방법입니다. 절차는 다음과 같습니다:
- 메인 메뉴에서 Odoo Studio를 엽니다.
- 필드를 추가할 폼으로 이동합니다.
- 사이드바에서 ‘Text(한 줄)’ 필드를 폼으로 드래그합니다.
- 필드 속성 패널에서 레이블, 필수 여부, 필요하면 길이 제한을 설정합니다.
- 저장하고 Studio를 닫습니다.
Studio는 자동으로 x_studio_ 접두사가 붙는 필드를 생성하고 뷰에 추가합니다. 별도 DB 마이그레이션은 필요 없습니다.
커스텀 모듈에서 Python 사용
버전 관리와 배포가 필요한 변경이라면 Python으로 모델에 필드를 정의하는 것이 권장되는 접근법입니다:
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_erp_customer_id = fields.Char(
string='ERP Customer ID',
size=32,
index=True,
copy=False,
)
모델에 필드를 추가한 뒤에는 해당 필드를 화면에 표시하도록 뷰 XML에도 넣어야 합니다. 모듈을 설치하거나 업그레이드하면 Odoo가 DB 컬럼을 자동으로 생성합니다.
XML-RPC API를 통한 생성
배포 파이프라인이나 원격 설정 스크립트에서 프로그래밍 방식으로 필드를 만들 때는 XML-RPC API를 사용해 Char 필드를 생성할 수 있습니다:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_custom_reference',
'field_description': 'Custom Reference',
'model_id': model_id,
'ttype': 'char',
'size': 64,
'state': 'manual',
}]
)
state: manual은 해당 필드가 모듈이 아닌 수동 생성(Studio나 API)임을 표시합니다. 자동 설정 스크립트로 고객 시스템을 구성할 때 이 방식이 흔히 사용됩니다.
권장 실무
1. 최대 길이를 알고 있다면 size를 설정하세요
국가 코드, 전화번호, 고정 길이 식별자처럼 길이가 결정된 값이라면 size를 지정하세요. 모델을 읽는 사람에게 의도를 알려주고 실수로 긴 문자열이 들어가는 일을 막을 수 있습니다.
2. 자주 검색되는 필드에는 인덱스를 추가하세요
사용자가 고객 코드나 주문 참조로 자주 필터링하면 index=True를 설정하세요. 수만 건 이상의 레코드가 있는 테이블에서는 인덱스 유무가 응답 속도의 차이를 크게 만듭니다.
3. 다국어 콘텐츠는 translate=True를 사용하세요
여러 언어 사용자를 지원하는 시스템에서는 제품명이나 직책처럼 언어별로 달라져야 할 필드에 번역을 활성화하면 문서와 UI에서 올바른 언어로 값이 표시됩니다.
4. 기술적 이름은 명확하고 일관되게 지으세요
커스텀 모듈에서는 x_customer_erp_id처럼 의미 있는 이름을 사용하세요. Studio로 만든 경우 배포 전에 속성에서 이름을 정리해 두면 나중에 변경이 어렵습니다.
5. 파생 참조는 compute로 처리하세요
연도와 시퀀스 번호를 결합한 참조처럼 계산으로 생성되는 값은 계산된 Char 필드로 만들고 store=True로 저장하면 검색과 리포트에서 바로 사용할 수 있습니다.
자주 빠지는 실수
길이 제한을 두지 않으면 이상한 데이터가 들어올 수 있습니다
제한이 없으면 사용자가 참조 필드에 긴 문단을 붙여 넣을 수 있습니다. 출력 문서나 외부 시스템으로 전송할 때 문자 수 제한으로 문제가 생길 수 있으니 길이가 중요한 필드는 합리적인 제한을 두세요.
자주 검색되는 필드에 인덱스를 빼먹음
인덱스가 없으면 큰 테이블에서 필터할 때 전체 스캔이 발생합니다. 데이터가 일정 규모 이상으로 커진 뒤에야 문제를 인지하는 경우가 많으므로 초기에 자주 쓰일 필드에는 인덱스를 고려하세요.
Char와 Text 필드를 혼동하는 실수
Char는 한 줄짜리 짧은 텍스트, Text는 여러 줄을 담는 용도입니다. 주소나 설명처럼 여러 문장으로 쓸 가능성이 있다면 Text를 사용하지 않으면 줄 바꿈이나 편집성이 떨어져 사용자 경험이 나빠집니다.
다국어 필드에 translate 설정을 잊음
여러 국가에서 쓰는 시스템에서 번역 옵션을 활성화하지 않으면 모든 사용자가 동일한 값을 보게 되어 고객 문서나 UI에서 문제가 발생할 수 있습니다.
선택값이나 관계형 데이터인데 Char로 처리함
값이 제한된 목록(카테고리, 상태, 국가 등)이라면 Selection이나 Many2one을 쓰는 것이 맞습니다. Char를 쓰면 오타와 변형으로 일관성 있는 그룹화와 보고가 어렵습니다.
자주 묻는 질문
Q: Odoo에서 Char 필드와 Text 필드의 차이는 무엇인가요?
A: Char는 단일행의 짧은 텍스트(이름, 코드 등)에 쓰이고 폼에서는 텍스트 입력으로 렌더링됩니다. Text는 길고 여러 줄의 콘텐츠(설명, 노트 등)에 적합하며 리사이즈 가능한 텍스트영역으로 표시됩니다.
Q: Char 필드의 문자 수를 제한할 수 있나요?
A: 예. Python에서 필드를 정의할 때 fields.Char(size=64)처럼 size를 설정하면 됩니다. Studio에서도 필드 속성에서 길이 제한을 정할 수 있습니다. 지정하지 않으면 DB 레벨에서 제한이 없습니다.
Q: Char 필드를 검색창에 표시하려면 어떻게 하나요?
A: 모델의 검색뷰에 해당 필드를 추가해야 합니다. Studio에서는 필드 속성에서 검색 옵션을 활성화하고, 코드에서는 XML의 <search> 뷰 안에 <field name="your_char_field"/>를 추가하면 됩니다.
Q: Char 필드에 숫자를 저장해도 되나요?
A: 기술적으로는 가능하지만 계산이나 수치 비교가 필요한 값이라면 Integer나 Float를 쓰세요. 우편번호, 전화번호, 시리얼 등 숫자처럼 보이는 문자열을 저장할 때는 Char가 적절합니다.
Q: 계산된(Char) 필드를 저장하도록 만들려면 어떻게 하나요?
A: 필드에 compute='_compute_my_field'와 store=True를 지정하세요. 계산 메서드에는 @api.depends()를 사용해 어떤 필드 변경 시 재계산할지 선언합니다. 이렇게 하면 검색·필터·내보내기 시 다시 계산하지 않고 저장된 값을 사용합니다.
맺음말
Char 필드는 겉보기보다 훨씬 더 많이 사용되는 요소입니다. 일상적으로 수십 군데에서 보게 되지만, 시스템을 설계할 때 언제 Char를 쓰고 언제 다른 타입을 선택해야 하는지 아는 것이 데이터 품질과 운영 효율에 큰 영향을 줍니다.
Odoo Studio로 간단히 필드를 추가하든, 커스텀 Python 모듈로 버전관리하든, API로 원격 생성하든 앞서 정리한 원칙을 따르면 처음부터 올바르게 설계할 수 있습니다.
올바른 필드 타입 위에 쌓인 깔끔한 데이터 모델은 성공적인 Odoo 도입의 핵심 기반입니다. Char 필드는 작은 구성 요소지만 잘 이해해 두면 전체 시스템 품질에 큰 도움이 됩니다.
Dasolo에서는 기업들이 Odoo를 전사적으로 구현·커스터마이즈·최적화할 수 있도록 지원합니다. 데이터 모델 설계, 워크플로우에 맞는 커스텀 필드 추가, 또는 완전한 모듈 개발이 필요하다면 저희 팀이 도와드릴 수 있습니다. 문의하기 귀사의 Odoo 프로젝트에 대해 이야기해 보시죠.