# 외부 DB 연결 관리 기능 가이드

## 개요

외부 DB 연결 관리 기능은 다양한 외부 데이터베이스와의 연결을 설정하고 관리하는 기능을 제공합니다. 이 기능을 통해 PostgreSQL, MySQL, MariaDB 등 다양한 데이터베이스에 연결하여 데이터를 조회하고 저장할 수 있습니다.

## 주요 기능

### 1. 연결 관리

- 새 연결 생성
- 기존 연결 수정
- 연결 삭제
- 연결 활성화/비활성화
- 연결 테스트

### 2. 지원하는 데이터베이스 타입

- PostgreSQL
- MySQL
- MariaDB
- Oracle
- SQL Server
- SQLite

### 3. 연결 설정 항목

#### 기본 정보
- 연결명 (필수)
- DB 타입 (필수)
- 설명 (선택)

#### 연결 정보
- 호스트 (필수)
- 포트 (필수)
- 데이터베이스명 (필수)
- 사용자명 (필수)
- 비밀번호 (필수)

#### 고급 설정
- 연결 타임아웃 (기본값: 30초)
- 쿼리 타임아웃 (기본값: 60초)
- 최대 연결 수 (기본값: 10)
- SSL 사용 여부
- SSL 인증서 경로 (SSL 사용 시)

## 사용 방법

### 1. 새 연결 생성

1. "외부 DB 연결 관리" 화면에서 "새 연결 추가" 버튼 클릭
2. 기본 정보 입력
   - 연결명: 고유한 식별자로 사용
   - DB 타입: 연결할 데이터베이스 종류 선택
   - 설명: 연결에 대한 부가 설명 (선택사항)
3. 연결 정보 입력
   - 호스트: 데이터베이스 서버 주소
   - 포트: DB 타입에 따라 기본값 제공
   - 데이터베이스명: 연결할 데이터베이스 이름
   - 사용자명: 데이터베이스 접속 계정
   - 비밀번호: 계정 비밀번호
4. 필요한 경우 고급 설정 구성
5. "연결 테스트" 버튼으로 연결 가능 여부 확인
6. "생성" 버튼으로 연결 저장

### 2. 연결 수정

1. 연결 목록에서 수정할 연결의 "편집" 버튼 클릭
2. 필요한 정보 수정
   - 비밀번호는 변경 시에만 입력
   - 비밀번호 필드를 비워두면 기존 비밀번호 유지
3. "연결 테스트"로 수정된 정보 확인
4. "수정" 버튼으로 변경사항 저장

### 3. 연결 테스트

- 새 연결 생성 시: 임시 연결을 생성하여 테스트 후 삭제
- 기존 연결 수정 시: 현재 연결로 테스트 실행
- 테스트 결과에 서버 버전, 응답 시간 등 상세 정보 표시
- 실패 시 상세한 오류 메시지 제공

### 4. 연결 삭제

1. 연결 목록에서 삭제할 연결의 "삭제" 버튼 클릭
2. 확인 대화상자에서 "삭제" 선택
3. 해당 연결과 관련된 모든 설정 제거

## 보안 고려사항

1. 비밀번호 관리
   - 비밀번호는 AES-256-CBC로 암호화하여 저장
   - 비밀번호는 UI에 표시되지 않음
   - 수정 시 비밀번호 필드를 비워두면 기존 비밀번호 유지

2. SSL 연결
   - SSL 사용 옵션 제공
   - 인증서 경로 설정 가능
   - 자체 서명 인증서 지원

3. 접근 제어
   - 회사 코드별 연결 관리
   - 활성/비활성 상태 관리
   - 연결별 최대 연결 수 제한

## 문제 해결

### 일반적인 문제

1. 연결 테스트 실패
   - 호스트/포트 접근 가능 여부 확인
   - 데이터베이스명 정확성 확인
   - 사용자 계정 권한 확인
   - 방화벽 설정 확인

2. 타임아웃 발생
   - 연결 타임아웃 값 조정
   - 네트워크 상태 확인
   - 데이터베이스 서버 부하 확인

3. SSL 연결 오류
   - 인증서 파일 경로 확인
   - 인증서 유효성 확인
   - SSL 설정 일치 여부 확인

### 오류 메시지 해석

1. "ECONNREFUSED"
   - 원인: 호스트/포트에 연결할 수 없음
   - 해결: 호스트/포트 정확성 확인, 방화벽 설정 확인

2. "password authentication failed"
   - 원인: 사용자명/비밀번호 불일치
   - 해결: 계정 정보 정확성 확인

3. "database does not exist"
   - 원인: 데이터베이스가 존재하지 않음
   - 해결: 데이터베이스명 정확성 확인

## 모범 사례

1. 연결명 작성
   - 용도를 명확히 알 수 있는 이름 사용
   - 회사/환경 정보 포함 권장
   - 예: "운영_회계DB", "개발_테스트DB"

2. 보안 설정
   - 가능한 SSL 사용
   - 최소 권한의 계정 사용
   - 연결 타임아웃 적절히 설정

3. 성능 최적화
   - 필요한 최소한의 최대 연결 수 설정
   - 쿼리 타임아웃 적절히 설정
   - 주기적인 연결 테스트 수행

## API 참조

### ExternalDbConnectionAPI

#### 연결 관리
```typescript
// 연결 목록 조회
getConnections(filter: ExternalDbConnectionFilter): Promise<ExternalDbConnection[]>

// 연결 상세 조회
getConnectionById(id: number): Promise<ExternalDbConnection>

// 새 연결 생성
createConnection(data: ExternalDbConnection): Promise<ExternalDbConnection>

// 연결 수정
updateConnection(id: number, data: ExternalDbConnection): Promise<ExternalDbConnection>

// 연결 삭제
deleteConnection(id: number): Promise<void>
```

#### 연결 테스트
```typescript
// 연결 테스트
testConnection(connectionId: number, password?: string): Promise<ConnectionTestResult>
```

#### 데이터 조회/저장
```typescript
// 테이블 목록 조회
getTables(connectionId: number): Promise<string[]>

// 테이블 컬럼 정보 조회
getTableColumns(connectionId: number, tableName: string): Promise<ColumnInfo[]>

// 테이블 데이터 조회
getTableData(connectionId: number, tableName: string, options?: QueryOptions): Promise<any[]>

// 테이블 데이터 저장
saveTableData(connectionId: number, tableName: string, data: any[], options: SaveOptions): Promise<{ affected_rows: number }>
```

## 향후 계획

1. 기능 개선
   - 연결 풀 모니터링
   - 연결 통계 대시보드
   - 쿼리 실행 이력 관리

2. 지원 예정 기능
   - 연결 복제
   - 연결 설정 임포트/익스포트
   - 연결 그룹 관리

3. 보안 강화
   - 역할 기반 접근 제어
   - 감사 로그 강화
   - 연결 암호화 강화
