# exdev TROAD Oracle (Docker) 개발서버(`chatbot.exdev.co.kr`)에서 교통정보(TROAD) 조회용 Oracle 을 Docker 로 기동합니다. ## 접속 정보 (chatbotApi 와 동일) | 항목 | 값 | |------|-----| | JDBC URL | `jdbc:oracle:thin:@localhost:1521/orcl2` | | Username | `OPR_MAIN` | | Password | `test` | | Image | `gvenzl/oracle-free:23-slim` (Oracle Database Free 23ai) | | Container | `exaichatbot-agent-oracle-troad` | | Volume | `exaichatbot-agent-oracle-troad-data` | `application.yml` 의 기본값은 운영 TROAD(`172.16.163.76`)를 유지합니다. 개발서버에서는 `start-all-server.sh` 가 아래 ENV 로만 localhost Oracle 을 주입합니다 (`SPRING_DATASOURCE_TROAD_URL` / `_USERNAME` / `_PASSWORD`). `git_fetch_all.sh` 는 커밋 전 yml 을 운영값으로 되돌리므로 exdev 설정이 GitHub에 반영되지 않습니다. 개발서버가 Apple Silicon(arm64) 이므로 amd64 전용인 `gvenzl/oracle-xe:21` 대신 arm64 를 지원하는 `gvenzl/oracle-free:23-slim` 을 사용합니다. SYS/SYSTEM 비밀번호 기본값: `OracleExdev!2026` (`ORACLE_SYS_PASSWORD` 환경변수로 변경 가능) ## 기동 / 중지 `start-all-server.sh` / `stop-all-server.sh` 에 포함됩니다. 기동 후 교통정보 뷰가 비어 있으면 `apply-sql.sh` 가 자동 실행됩니다. ```bash # 수동 cd /Users/aidev/dev/exAichatbot_agent/server-dev docker compose -f docker-compose.oracle.yml up -d docker compose -f docker-compose.oracle.yml down # 데이터 볼륨까지 삭제 docker compose -f docker-compose.oracle.yml down -v # 또는 ./stop-all-server.sh --purge-oracle ``` 옵션: | 옵션 | 설명 | |------|------| | `start-all-server.sh --skip-oracle` | Oracle 기동 생략 | | `stop-all-server.sh --purge-oracle` | 컨테이너 + 데이터 볼륨 삭제 | ## 디렉터리 구성 | 경로 | 설명 | |------|------| | `init/` | 컨테이너 최초 초기화 시 1회 실행 (OPR_MAIN 권한 부여) | | `sql/` | 업무 객체 DDL + 데이터 (파일명 순서로 적용) | | `data/` | 원본 CSV 덤프 | | `tools/csv_to_insert.py` | CSV → INSERT 스크립트 변환 | | `apply-sql.sh` | 컨테이너에 `sql/*.sql` 적용 + 결과 검증 | ## 업무 객체 적용 ```bash cd /Users/aidev/dev/exAichatbot_agent/server-dev/oracle # sql/ 전체 적용 ./apply-sql.sh # 특정 파일만 ./apply-sql.sh sql/10_v_incident_ftms.sql sql/20_v_incident_ftms_data.sql ``` ### 적용된 객체 | 객체 | 설명 | |------|------| | `OPR_MAIN.T_INCIDENT_FTMS` | 뷰의 원본 데이터 테이블 (17 컬럼 + `LOADED_AT`) | | `OPR_MAIN.V_INCIDENT_FTMS` | 운영과 동일한 컬럼·순서의 조회용 뷰 | | `PUBLIC SYNONYM V_INCIDENT_FTMS` | 스키마 미지정 조회 지원 | | `TLISDEV.T_TRMB_CD_INFO01M1` | 공통코드 (노선명 COM064 등) | | `TROAD_APP.V_ROUTE_NEW_NM` | 노선명 조회 뷰 (`chatbotApi` 기존 쿼리 그대로 사용) | | `TROAD_APP.V_ROUTE_TRFC_VER001` | 노선별 교통상황 뷰 (`chatbotApi` 기존 쿼리 그대로 사용) | | `TROAD_APP.V_ACDT_BRNWS_VER001` | 교통속보 뷰 (`chatbotApi` 기존 쿼리 그대로 사용) | | `OPR_MAIN.V_ROUTE_*` / `V_ACDT_*` | 스키마 미지정 조회용 미러 뷰 | 운영 뷰는 다수 기반 테이블을 참조하는 읽기 전용 뷰입니다. 개발서버에는 기반 테이블이 없으므로, 뷰 결과 CSV를 물리 테이블에 적재하고 동일 이름 뷰로 노출해 **기존 조회 로직/SQL을 변경하지 않고** 동작하게 합니다. ### 다른 CSV 덤프 추가 ```bash cd /Users/aidev/dev/exAichatbot_agent/server-dev/oracle python3 tools/csv_to_insert.py data/<파일>.csv \ --table OPR_MAIN.<테이블> \ --numeric <숫자컬럼,콤마구분> \ --out sql/<번호>_<이름>_data.sql ./apply-sql.sh sql/<번호>_<이름>_data.sql ``` ## 검증 ```bash docker exec -e NLS_LANG=.AL32UTF8 -it exaichatbot-agent-oracle-troad \ sqlplus OPR_MAIN/test@localhost:1521/ORCL2 SQL> SELECT COUNT(*) FROM V_INCIDENT_FTMS; SQL> SELECT INCIDENT_TYPE, COUNT(*) FROM V_INCIDENT_FTMS GROUP BY INCIDENT_TYPE; ``` 한글 데이터 조회 시 `NLS_LANG=.AL32UTF8` 을 지정해야 깨지지 않습니다.