Oracle EBS 프로젝트에 투입됐는데 “OAF 화면 하나만 만들어 주세요”라는 말을 들었다면, 대부분 첫 이틀은 코딩이 아니라 JDeveloper가 안 켜져서 날아갑니다. 이 글은 그 이틀을 두 시간으로 줄이는 것이 목표입니다. OA Framework의 구조를 먼저 그림으로 잡고, 내 EBS 인스턴스에 맞는 JDeveloper를 찾아 설치한 뒤, Hello World 페이지를 브라우저에 띄우는 데까지 순서대로 갑니다.
목차
01 — OrientationOAF가 도대체 뭔가
Oracle Application Framework, 줄여서 OA Framework 또는 OAF는 Oracle E-Business Suite 안에서 HTML 기반 화면을 만들고 배포하기 위해 오라클이 만든 프레임워크입니다. EBS를 써보셨다면 화면이 두 종류라는 걸 아실 겁니다. Java 애플릿이 뜨면서 실행되는 Forms 화면과, 브라우저에서 그냥 열리는 Self-Service 화면. 후자가 OAF입니다.
기술적으로는 J2EE 기반의 MVC(Model-View-Controller) 패턴이고, Model 계층은 BC4J(Business Components for Java)라는 오라클 고유 기술로 구현돼 있습니다. 개발 도구는 오라클이 EBS 버전별로 따로 배포하는 JDeveloper + OA Extension을 씁니다. 여기서 “버전별로 따로”라는 게 핵심인데, 뒤에서 자세히 다루겠습니다.
iProcurement, iSupplier Portal, iExpenses, Approvals Management 같은 모듈이 전부 OAF로 만들어져 있습니다. 즉 OAF를 안다는 건 이 화면들을 고칠 수 있다는 뜻입니다.
Forms와 뭐가 다른가
| 구분 | Oracle Forms | OA Framework |
|---|---|---|
| 실행 환경 | Java 애플릿 / JRE 필요 | 순수 HTML — 브라우저만 있으면 됨 |
| 개발 도구 | Forms Builder | JDeveloper + OA Extension |
| 주 언어 | PL/SQL | Java + XML (+ PL/SQL) |
| 화면 정의 | FMB 바이너리 파일 | XML 문서 (DB의 JDR 저장소에 보관) |
| 커스터마이징 | CUSTOM.pll / 폼 복사 | Personalization / Extension / 신규 페이지 |
| 모바일 | 사실상 불가 | 가능 |
가장 중요한 차이는 마지막 줄에서 두 번째입니다. OAF는 화면 정의가 XML로 DB에 들어있기 때문에, 소스 코드를 건드리지 않고도 화면을 바꿀 수 있는 길이 열려 있습니다. 이게 Personalization이고, 2편의 주제입니다.
02 — ArchitectureMVC 3계층 구조와 BC4J 용어 정리
OAF 코드를 처음 열면 AM, VO, EO, VL, AO, CO 같은 두 글자 약어가 쏟아집니다. 이걸 먼저 정리하지 않으면 어떤 문서를 읽어도 진도가 안 나갑니다. 아래 그림 한 장으로 정리됩니다

FIG.01 — OA Framework의 MVC 3계층. View는 전부 XML, Controller와 Model은 Java. 브라우저 요청이 View → Controller → Model 순으로 내려가고, 조회 결과가 역순으로 올라와 HTML로 렌더링됩니다.
외우기 요령
“CO는 AM만 부른다” 한 줄만 기억하세요. Controller에서 직접 JDBC를 열거나 SQL을 던지는 코드는 OAF 코딩 표준 위반이고, 실제로 패치 때 깨집니다. CO는 getApplicationModule(webBean)으로 AM을 가져와서 AM에 정의한 메서드를 호출하고, 실제 쿼리는 그 안의 VO가 처리합니다.
페이지 하나가 열릴 때 실제로 벌어지는 일
OAF 디버깅의 90%는 “지금 processRequest인가 processFormRequest인가”를 구분하는 데서 갈립니다. 값이 안 찍힌다, 버튼을 눌러도 반응이 없다 같은 증상은 대부분 잘못된 메서드에 코드를 넣어서 생깁니다

FIG.02 — 페이지 요청 처리 라이프사이클. processRequest는 화면이 그려지기 전에 딱 한 번, processFormRequest는 사용자가 무언가를 누를 때마다 실행됩니다.
STEP 1
내 EBS 인스턴스의 OAF 버전 확인하기
본격적인 세팅의 출발점입니다. 범용 JDeveloper를 다운로드하면 안 됩니다. EBS OAF 확장을 개발할 때는 EBS 제품개발팀이 배포한 전용 빌드를 써야 하고, 이 빌드는 EBS의 ATG 패치 레벨에 종속됩니다. 그래서 순서가 “JDeveloper 설치”가 아니라 “내 서버 버전 확인 → 거기 맞는 JDeveloper 찾기”입니다.
1-1. 프로파일 옵션 2개 켜기
System Administrator 책임으로 로그인해서 아래 두 개를 사용자 레벨로 켭니다.
| 프로파일 옵션 | 내부명 | 값 | 용도 |
|---|---|---|---|
| FND: Diagnostics | FND_DIAGNOSTICS | Yes | About This Page 링크 노출 |
| Personalize Self-Service Defn | FND_CUSTOM_OA_DEFINTION | Yes | Personalize Page 링크 노출 |
1-2. About This Page에서 버전 읽기
아무 OAF 화면이나 열면 (예: iProcurement 홈, 또는 Preferences 화면) 페이지 하단에 About this Page 링크가 생깁니다. 클릭하면 진단 화면이 뜨는데, Technology Components 탭에 OA Framework 버전이 찍혀 있습니다. 12.2.0, 12.1.3 같은 형태입니다. 이 숫자를 메모하세요

FIG.03 — JDeveloper 버전 매칭 흐름. 이 4단계를 건너뛰고 아무 JDeveloper나 설치하는 것이 OAF 입문자의 1번 실수입니다.
필독 문서
Doc ID 416708.1 — OA Framework: How to Identify Required Oracle JDeveloper Patches For Oracle E-Business Suite Release 12.x or 11i. My Oracle Support에서 이 번호로 검색하세요. (신규 MOSFS 체계에서는 Article ID KB852730으로도 조회됩니다.) 11i, 12.0, 12.1, 12.2 전 버전의 대응표가 한 문서에 정리돼 있습니다.
STEP 2
JDeveloper 압축 풀고 폴더 구조 이해하기
받은 패치 zip을 경로에 공백과 한글이 없는 위치에 풉니다. D:\OAF 정도가 무난합니다. 풀면 폴더 세 개가 나옵니다.
D:\OAF\
├── jdevbin\ # JDeveloper 실행 파일 본체. 여기는 건드리지 않습니다.
│ └── jdev\bin\jdevW.exe # ← 실제 실행 파일
├── jdevdoc\ # OAF Developer's Guide WebHelp. 오프라인 문서.
└── jdevhome\ # 내 작업 공간. 소스와 접속정보가 전부 여기 있습니다.
└── jdev\
├── myprojects\ # 내가 만든 워크스페이스(.jws)와 소스
├── myclasses\ # 컴파일된 .class 산출물
└── dbc_files\secure\ # ← .dbc 파일을 여기에 넣습니다
구조를 이렇게 나눠 놓은 이유가 있습니다. jdevbin은 오라클이 준 것이라 EBS 패치가 올라가면 통째로 교체되고, jdevhome은 내 자산이라 그대로 유지됩니다. 그래서 소스는 반드시 jdevhome 아래에만 둡니다.
STEP 3
dbc 파일 가져오기 · 환경변수 설정
JDeveloper가 EBS 인스턴스에 붙으려면 .dbc 파일(Database Connection descriptor)이 필요합니다. 이 파일에는 DB 접속 정보와 애플리케이션 서버 보안 키가 들어 있고, 서버에만 존재합니다. WinSCP나 FTP로 로컬로 내려받아야 합니다.
# 애플리케이션 서버에 SSH 접속 후
$ cd $FND_SECURE
$ pwd
/u01/app/EBSDEV/fs1/inst/apps/EBSDEV_ebsapp/appl/fnd/12.0.0/secure
$ ls -ltr *.dbc
EBSDEV.dbc
# R12 : $INST_TOP/appl/fnd/12.0.0/secure (= $FND_SECURE)
# 11i : $FND_TOP/secure
내려받은 EBSDEV.dbc를 D:\OAF\jdevhome\jdev\dbc_files\secure\ 안에 넣습니다.
환경변수 JDEV_USER_HOME
내 PC > 속성 > 고급 시스템 설정 > 환경 변수 > 새로 만들기.
| 변수 이름 | 변수 값 |
|---|---|
JDEV_USER_HOME | D:\OAF\jdevhome\jdev |
끝에 \jdev까지 붙는다는 점에 주의하세요. D:\OAF\jdevhome까지만 잡으면 JDeveloper가 dbc 파일을 못 찾아서 접속 목록이 비어 보입니다. 흔한 실수입니다.

FIG.04 — 로컬 개발 환경과 EBS 서버의 관계. JDeveloper는 dbc 파일의 정보로 EBS DB에 직접 붙어서, 내 PC에서 실제 데이터를 조회하는 OAF 페이지를 띄웁니다.
STEP 4
JDeveloper 실행 · DB 접속 만들기
D:\OAF\jdevbin\jdev\bin\jdevW.exe를 실행합니다. 바탕화면에 바로가기를 만들어 두면 편합니다. 처음 실행하면 마이그레이션 여부를 묻는 창이 몇 개 뜨는데 그냥 확인 누르고 넘어가면 됩니다.
JDK 관련
JDeveloper 10g/11g 계열은 최신 Windows에서 실행 안 되는 경우가 있습니다. 이때는 jdevbin\jdev\bin\jdev.conf 안의 SetJavaHome 항목을 패치에 동봉된 JDK 경로로 명시해 주면 대부분 해결됩니다.
4-1. 워크스페이스 열기
File > Open 에서 jdevhome\jdev\myprojects\toolbox.jws를 엽니다. 오라클이 학습용으로 넣어둔 ToolBox Tutorial 워크스페이스입니다.
4-2. 프로젝트에 DB 접속 연결
Navigator에서 Tutorial 프로젝트 우클릭 > Project Properties > Oracle Applications > Database Connection 탭 > New.
- Connection Type: Oracle (JDBC)
- Username / Password: EBS DB의
apps계정 - Driver: thin
- Host Name / JDBC Port / SID: DB 서버 정보 입력
- Test Connection 눌러서 Success 확인
같은 작업을 LabSolutions 프로젝트에도 반복합니다. LabSolutions에는 튜토리얼 실습의 정답 코드가 들어 있어서, 막힐 때 비교해 보기 좋습니다.
4-3. Runtime Connection 설정
같은 Oracle Applications 탭의 Runtime Connection에서 실행 시 사용할 정보를 넣습니다.
| 항목 | 입력 값 |
|---|---|
| DBC File Name | dbc_files\secure\EBSDEV.dbc 선택 |
| User Name | EBS 애플리케이션 로그인 ID (예: OPERATIONS) |
| Password | 해당 계정 비밀번호 |
| Application Short Name | AK (튜토리얼 기본값) |
| Responsibility Key | FWK_TBX_TUTORIAL |
이 네 가지가 있어야 JDeveloper가 실행 시점에 EBS 애플리케이션 컨텍스트(사용자, 책임, Operating Unit)를 잡아줍니다. 안 넣으면 페이지는 뜨는데 데이터가 안 나오거나 권한 오류가 납니다.
STEP 5
Hello World 띄우기
Navigator에서 Tutorial > oracle.apps.ak.hello > webui 아래의 HelloWorldPG.xml을 찾습니다. 우클릭 > Run.
브라우저가 열리면서 이런 URL이 뜹니다.
http://localhost:8988/OA_HTML/runregion.jsp?region=/oracle/apps/ak/hello/webui/HelloWorldPG
&akRegionApplicationId=601®ionAppId=601
화면에 텍스트 필드와 Go 버튼이 하나씩 보이고, 이름을 넣고 Go를 누르면 인사말이 나오면 성공입니다. 여기까지 오면 환경 세팅은 끝난 겁니다. 이제부터는 실제 개발입니다.
확인 습관
Hello World가 뜬 상태에서 HelloWorldPG.xml을 열어 Structure 창을 보세요. pageLayout > mainContent > messageTextInput > submitButton 이라는 트리가 보일 텐데, 이게 FIG.01에서 본 Region-Item 구조 그대로입니다. 개념과 실물이 여기서 처음 연결됩니다.
03 — Troubleshooting여기서 자주 막힙니다
| 증상 | 원인 | 조치 |
|---|---|---|
| DBC 파일 목록이 비어 있음 | JDEV_USER_HOME 경로 오류 | 끝에 \jdev까지 붙었는지 확인 후 JDeveloper 재시작 |
| Invalid DBC file / 인증 실패 | dbc를 바이너리 모드로 전송 | FTP를 ASCII 모드로 다시 받거나 WinSCP로 재전송 |
| 페이지 실행 시 500 오류 | Responsibility Key 누락 | Runtime Connection에 책임 키 입력 |
| 서버 배포 후 NoSuchMethodError | JDeveloper 버전 불일치 | Doc 416708.1로 패치 재확인 (FIG.03) |
| About this Page 링크 안 보임 | FND: Diagnostics 미설정 | 프로파일 Yes로 설정 후 재로그인 |
| 한글이 깨짐 | 인코딩 설정 | 프로젝트 인코딩을 UTF-8로 지정 |
04 — Reference공식 문서 확보하기
OAF는 서적이 거의 없습니다. 오라클 공식 Developer’s Guide가 사실상 유일한 정본이고, 다행히 Oracle Help Center에 버전별 PDF가 공개돼 있습니다.
- 12.2.14 —
docs.oracle.com/cd/F21816_01/infoportal/oafdg/12214_OAFDevGuide.pdf - 12.2.12 —
.../12212_OAFDevGuide.pdf - 12.2.10 —
.../12210_OAFDevGuide.pdf - 12.2.7~12.2.8 —
.../1227_to_1228_OAFDevGuide.pdf - 12.2.4 —
.../1224_OAFDevGuide.pdf
같은 문서가 JDeveloper 설치 폴더의 jdevdoc 안에 WebHelp 형태로도 들어 있고, JDeveloper 내부 도움말에서도 열립니다. 읽는 순서는 1~3장으로 개념을 잡고, 8장의 코딩 표준을 반드시 읽는 것입니다. 8장을 건너뛰면 나중에 패치 적용 시 커스터마이징이 전부 날아가는 코드를 쓰게 됩니다.
2편에서 다룰 내용
환경이 준비됐으니 다음은 실제 개발입니다. 요구사항을 받았을 때 Personalization으로 끝낼지, Extension을 할지, 새 페이지를 만들지 판단하는 기준부터 시작해서, EO/VO/AM/CO를 순서대로 만드는 커스텀 페이지 개발, 커스텀 패키지 네이밍 규칙, VO Extension과 CO Extension, 그리고 R12.2 온라인 패치 환경에서의 배포 절차를 다룹니다.
