APIS api 추가
This commit is contained in:
@@ -91,11 +91,13 @@ kjb-gradle.sh tasks --all
|
||||
|
||||
1. **IDE 설정 파일 생성 (최초 1회)**
|
||||
```bash
|
||||
# IntelliJ IDEA 사용 시
|
||||
kjb-gradle.sh idea
|
||||
|
||||
# Eclipse 사용 시
|
||||
# Eclipse 사용 시 (기본)
|
||||
kjb-gradle.sh eclipse
|
||||
|
||||
# IntelliJ IDEA 사용 시 (build.gradle.intellij 파일 사용 필요)
|
||||
# 1. build.gradle을 build.gradle.eclipse로 백업
|
||||
# 2. build.gradle.intellij를 build.gradle로 복사
|
||||
# 3. kjb-gradle.sh idea 실행
|
||||
```
|
||||
|
||||
2. **QueryDSL 등 소스 코드 생성**
|
||||
@@ -109,7 +111,8 @@ kjb-gradle.sh tasks --all
|
||||
```
|
||||
|
||||
4. **IDE에서 프로젝트 열기**
|
||||
- `kjb-gradle.sh idea` 또는 `kjb-gradle.sh eclipse` 실행 후, IDE에서 프로젝트를 엽니다.
|
||||
- Eclipse: `kjb-gradle.sh eclipse` 실행 후, IDE에서 프로젝트를 엽니다.
|
||||
- IntelliJ: IntelliJ 전용 `build.gradle.intellij`를 `build.gradle`로 교체 후 사용합니다.
|
||||
|
||||
5. **실행 구성(Run Configuration) 설정**
|
||||
- 사용하는 WAS(Tomcat 등)에 `eapim-admin` 프로젝트를 배포하도록 설정합니다.
|
||||
@@ -156,26 +159,24 @@ eapim-admin (root project)
|
||||
- **Lombok**: 애노테이션 프로세싱을 통한 Getters/setters/builders
|
||||
- **MapStruct**: DTO와 엔티티 간의 객체 매퍼
|
||||
|
||||
#### 이중 Q-Class 생성 (Gradle + Eclipse)
|
||||
#### Q-Class 생성 위치
|
||||
|
||||
이 프로젝트는 **Gradle과 Eclipse 애노테이션 프로세서 모두를 사용**하므로, Q-classes가 **두 위치에 생성**됩니다:
|
||||
|
||||
1. **`build/generated/java/`** - `kjb-gradle.sh compileJava` 또는 `kjb-gradle.sh build` 실행 시 Gradle이 생성
|
||||
2. **`WebContent/generated/`** - Eclipse IDE에서 빌드 시 Eclipse APT가 생성
|
||||
|
||||
**이는 예상된 동작이며 의도적입니다.** 두 디렉토리 모두 `.gitignore`에 포함되어 있으며 커밋해서는 안 됩니다.
|
||||
Q-classes는 `build/generated/java/` 디렉토리에 생성됩니다.
|
||||
- `kjb-gradle.sh compileJava` 또는 `kjb-gradle.sh build` 실행 시 Gradle이 자동으로 생성
|
||||
- 이 디렉토리는 `.gitignore`에 포함되어 있으며 커밋해서는 안 됩니다
|
||||
|
||||
#### 생성된 코드 작업하기
|
||||
|
||||
- **Gradle 빌드**: `build/generated/java/`의 Q-classes가 자동으로 classpath에 포함됩니다
|
||||
- **Eclipse IDE**: `WebContent/generated/`의 Q-classes가 자동으로 classpath에 포함됩니다
|
||||
- **업데이트 pull 후**: `kjb-gradle.sh compileJava`를 실행하거나 Eclipse 프로젝트를 새로고침하여 Q-classes를 재생성합니다
|
||||
- **Q-classes IDE 오류 시**: `kjb-gradle.sh clean compileJava` 또는 Eclipse → Project → Clean으로 재생성합니다
|
||||
- **업데이트 pull 후**: `kjb-gradle.sh compileJava`를 실행하여 Q-classes를 재생성합니다
|
||||
- **Q-classes IDE 오류 시**: `kjb-gradle.sh clean compileJava`로 재생성합니다
|
||||
|
||||
중복이 문제를 일으키지 않는 이유:
|
||||
- 두 도구 모두 동일한 JPA 엔티티에서 동일한 Q-classes를 생성합니다
|
||||
- 두 출력 디렉토리 모두 gitignore됩니다
|
||||
- 각 도구는 자체 생성 클래스를 사용합니다 (classpath 충돌 없음)
|
||||
#### IDE별 빌드 설정 파일
|
||||
|
||||
- **`build.gradle`**: Eclipse 전용 (기본, Eclipse APT 플러그인 포함)
|
||||
- **`build.gradle.intellij`**: IntelliJ IDEA 전용
|
||||
|
||||
IntelliJ를 사용하려면 `build.gradle.intellij`를 `build.gradle`로 교체해야 합니다.
|
||||
|
||||
## 로컬 개발 환경 설정
|
||||
|
||||
@@ -315,6 +316,50 @@ com.eactive.eai
|
||||
|
||||
리포지토리는 Spring Data JPA 규칙을 사용하며, 서비스는 `@Service`, 컨트롤러는 `@RestController`/`@Controller`를 사용합니다.
|
||||
|
||||
### Multi-tenancy (동적 스키마 전환)
|
||||
|
||||
애플리케이션은 Hibernate Multi-tenancy를 사용하여 **런타임에 스키마를 동적으로 전환**합니다.
|
||||
|
||||
**핵심 컴포넌트:**
|
||||
- `DataSourceContextHolder` - ThreadLocal로 현재 데이터소스 타입 관리
|
||||
- `DataSourceTypeManager` - 데이터소스 타입 상수 정의 (MONITORING, APIGW, EAI, BAT 등)
|
||||
- `TenantIdentifierResolver` - `DataSourceContextHolder`에서 tenant 식별자 반환
|
||||
- `ConfigurableMultiTenantConnectionProvider` - tenant에 따라 `connection.setSchema()` 호출
|
||||
- `DataSourceTypeInterceptor` - 요청 파라미터 `serviceType`에서 데이터소스 자동 설정
|
||||
|
||||
**동작 흐름:**
|
||||
1. `DataSourceTypeInterceptor.preHandle()` → `request.getParameter("serviceType")` 읽음
|
||||
2. `DataSourceContextHolder.setDataSourceType(dataSourceType)` 설정
|
||||
3. JPA 쿼리 실행 시 `TenantIdentifierResolver` → `DataSourceContextHolder`에서 tenant 반환
|
||||
4. `ConfigurableMultiTenantConnectionProvider` → `connection.setSchema(schema)` 호출
|
||||
|
||||
**사용 방법:**
|
||||
|
||||
1. **URL 파라미터 방식** (인터셉터가 자동 처리):
|
||||
```
|
||||
/api/endpoint?serviceType=APIGW
|
||||
```
|
||||
|
||||
2. **Controller에서 명시적 설정** (특정 데이터소스 강제):
|
||||
```java
|
||||
@Controller
|
||||
public class MyController {
|
||||
@RequestMapping("/my/api.json")
|
||||
public String myApi() {
|
||||
// 서비스 호출 전에 데이터소스 설정
|
||||
DataSourceContextHolder.setDataSourceType(
|
||||
DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW));
|
||||
|
||||
return myService.getData();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**주의사항:**
|
||||
- `@PersistenceContext`만 사용 (기본 `entityManagerFactory` 사용, Multi-tenancy 적용됨)
|
||||
- `@PersistenceContext(unitName = "entityManagerFactoryForEMS")`는 **Multi-tenancy 미적용** (MONITORING 스키마 고정)
|
||||
- Controller에서 `DataSourceContextHolder` 설정 후 Service 메서드를 호출해야 트랜잭션 시작 시점에 올바른 스키마가 적용됨
|
||||
|
||||
### 주요 초기화
|
||||
- `AppInitializer` - 시스템 프로퍼티를 설정하는 메인 애플리케이션 시작 빈
|
||||
- `CustomizingAppInitializer` - 고객사별 초기화
|
||||
@@ -328,19 +373,7 @@ com.eactive.eai
|
||||
|
||||
## IDE 설정
|
||||
|
||||
### Eclipse
|
||||
|
||||
```bash
|
||||
kjb-gradle.sh eclipse
|
||||
```
|
||||
|
||||
다음을 생성합니다:
|
||||
- `.project` 및 `.classpath` 파일
|
||||
- Eclipse WTP 설정 (context path: `/monitoring`)
|
||||
- UTF-8 인코딩 설정
|
||||
- QueryDSL/Lombok을 위한 애노테이션 프로세서 설정
|
||||
|
||||
### IntelliJ IDEA
|
||||
### IntelliJ IDEA (권장)
|
||||
|
||||
```bash
|
||||
kjb-gradle.sh idea
|
||||
@@ -348,6 +381,30 @@ kjb-gradle.sh idea
|
||||
|
||||
또는 IntelliJ에서 직접 "Import Gradle Project"를 사용합니다.
|
||||
|
||||
기본 `build.gradle`은 IntelliJ 전용으로 설정되어 있습니다.
|
||||
|
||||
### Eclipse
|
||||
|
||||
Eclipse를 사용하려면 Eclipse APT 플러그인이 포함된 별도의 빌드 설정 파일을 사용해야 합니다:
|
||||
|
||||
```bash
|
||||
# 1. 기존 build.gradle 백업 (필요시)
|
||||
cp build.gradle build.gradle.intellij
|
||||
|
||||
# 2. Eclipse 전용 설정으로 교체
|
||||
cp build.gradle.eclipse build.gradle
|
||||
|
||||
# 3. Eclipse 프로젝트 생성
|
||||
kjb-gradle.sh eclipse
|
||||
```
|
||||
|
||||
Eclipse 전용 설정(`build.gradle.eclipse`)은 다음을 포함합니다:
|
||||
- `com.diffplug.eclipse.apt` 플러그인 (Eclipse APT 지원)
|
||||
- `.project` 및 `.classpath` 파일 생성
|
||||
- Eclipse WTP 설정 (context path: `/monitoring`)
|
||||
- UTF-8 인코딩 설정
|
||||
- QueryDSL/Lombok을 위한 애노테이션 프로세서 설정
|
||||
|
||||
## 테스트
|
||||
|
||||
테스트에 사용되는 것들:
|
||||
|
||||
Reference in New Issue
Block a user