chore: MSSQL에서 PostgreSQL로 프로젝트 마이그레이션
- local, dev, prod 프로필의 환경 설정 파일을 PostgreSQL 연결 정보로 변경 - pom.xml에 PostgreSQL JDBC 드라이버 의존성과 Lombok 빌드 설정을 추가 - SpringConfig의 MyBatis 설정을 PostgreSQL 전용 매퍼 파일을 사용하도록 변경 - log4j2.xml의 로그 디렉터리를 절대 경로 /logs에서 상대 경로로 변경 - plan.md에 DB 설정 정보를 추가하고 README.md를 PostgreSQL 기반 구성에 맞게 갱신
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
# SDL Base
|
||||
|
||||
Spring Boot 3 기반 백엔드와 Vue 3/Vite 기반 프론트엔드가 함께 있는 통합 프로젝트입니다.
|
||||
|
||||
## 개요
|
||||
|
||||
- 백엔드: Spring Boot 3.3.0, Java 17, Maven, MyBatis
|
||||
- 프론트엔드: Vue 3, Vite 5, Vue Router, Vuex
|
||||
- 배치: Quartz Scheduler
|
||||
- 문서: `doc/` 하위 AsciiDoc/HTML 문서
|
||||
- 프로필: `local`, `dev`, `prod`
|
||||
|
||||
## 프로젝트 구조
|
||||
|
||||
```text
|
||||
sdl-base/
|
||||
├── src/main/java/ # Spring Boot 애플리케이션, 설정, 컨트롤러, 서비스
|
||||
├── src/main/resources/ # 공통 리소스, 메시지, MyBatis 매퍼
|
||||
├── src/main/resources-local/ # local 프로필 설정
|
||||
├── src/main/resources-dev/ # dev 프로필 설정
|
||||
├── src/main/resources-prod/ # prod 프로필 설정
|
||||
├── frontend/ # Vue 3 + Vite 프론트엔드
|
||||
├── doc/ # 설치/구성/기능 문서
|
||||
├── source/ # 로컬 Maven 저장소로 참조하는 SDL 라이브러리
|
||||
├── pom.xml # 백엔드 빌드 설정
|
||||
└── plan.md # 작업 메모 및 환경 정보
|
||||
```
|
||||
|
||||
## 주요 실행 흐름
|
||||
|
||||
1. 백엔드는 `com.samsung.SdlBaseBootApplication`에서 시작합니다.
|
||||
2. `local` 프로필에서는 `config.properties`의 `datasource.*` 값을 사용해 직접 DB에 연결합니다.
|
||||
3. `dev`, `prod` 프로필에서는 `db.jndi=sdl_ds` 기반 JNDI 데이터소스를 사용합니다.
|
||||
4. MyBatis 매퍼는 PostgreSQL 경로인 `src/main/resources/sql/mybatis/postgresql/`를 사용합니다.
|
||||
5. 프론트엔드는 `frontend/`에서 Vite로 실행하거나 빌드 산출물을 백엔드 정적 리소스로 내보냅니다.
|
||||
|
||||
## 실행 전 준비
|
||||
|
||||
### 백엔드
|
||||
|
||||
- Java 17 이상
|
||||
- Maven 3.9 이상 또는 프로젝트 포함 `./mvnw`
|
||||
- PostgreSQL 접근 가능 환경
|
||||
- 필요 시 `JASYPT_KEY` 환경변수 설정
|
||||
|
||||
예시:
|
||||
|
||||
```bash
|
||||
export JASYPT_KEY=your-jasypt-key
|
||||
```
|
||||
|
||||
### 프론트엔드
|
||||
|
||||
- Node.js 20.14.0 이상
|
||||
- npm
|
||||
|
||||
## 로컬 실행 방법
|
||||
|
||||
### 1. 프론트엔드 의존성 설치
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm install
|
||||
```
|
||||
|
||||
### 2. 프론트엔드 개발 서버 실행
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm run local
|
||||
```
|
||||
|
||||
- 기본 포트: `8081`
|
||||
- API 대상: `http://localhost:8080`
|
||||
|
||||
### 3. 백엔드 실행
|
||||
|
||||
프로젝트 루트에서 실행합니다.
|
||||
|
||||
```bash
|
||||
./mvnw spring-boot:run -Plocal
|
||||
```
|
||||
|
||||
또는 IDE에서 `com.samsung.SdlBaseBootApplication`을 Spring Boot Application으로 실행하면 됩니다.
|
||||
|
||||
## 빌드 방법
|
||||
|
||||
### 백엔드 빌드
|
||||
|
||||
```bash
|
||||
./mvnw clean package
|
||||
```
|
||||
|
||||
### 프론트엔드 운영 빌드
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm run build
|
||||
```
|
||||
|
||||
기본 운영 빌드 결과물은 `frontend/.env.production`의 `VITE_DIST_PATH` 설정에 따라 백엔드 웹 리소스 경로로 출력됩니다.
|
||||
|
||||
## 프로필별 설정 파일
|
||||
|
||||
- `src/main/resources-local/application.properties`
|
||||
- `src/main/resources-local/config.properties`
|
||||
- `src/main/resources-dev/application.properties`
|
||||
- `src/main/resources-dev/config.properties`
|
||||
- `src/main/resources-prod/application.properties`
|
||||
- `src/main/resources-prod/config.properties`
|
||||
|
||||
## DB 연결 정보
|
||||
|
||||
`plan.md` 기준으로 현재 반영된 PostgreSQL 정보는 다음과 같습니다.
|
||||
|
||||
- DBMS: PostgreSQL
|
||||
- 호스트: `192.168.0.60`
|
||||
- 포트: `5432`
|
||||
- 데이터베이스: `casaos`
|
||||
- 사용자: `casaos`
|
||||
- 비밀번호: `casaos`
|
||||
|
||||
적용 위치:
|
||||
|
||||
- 로컬 메인 데이터소스: `src/main/resources-local/config.properties`
|
||||
- Quartz 데이터소스: `src/main/resources-dev/application.properties`
|
||||
- Quartz 데이터소스: `src/main/resources-prod/application.properties`
|
||||
|
||||
## 참고 문서
|
||||
|
||||
- 설치 문서: `doc/설치/로컬설치.adoc`
|
||||
- Quartz 문서: `doc/Appendix/QuartzClustering.adoc`
|
||||
- 전체 문서 인덱스: `doc/index.html`
|
||||
|
||||
## 확인 메모
|
||||
|
||||
- 현재 백엔드 MyBatis 설정은 PostgreSQL 매퍼 경로를 사용하도록 정리했습니다.
|
||||
- `dev`, `prod`는 애플리케이션 메인 데이터소스를 JNDI로 조회하므로 WAS/JNDI 설정도 별도로 맞아야 합니다.
|
||||
@@ -0,0 +1,8 @@
|
||||
# DB 정보
|
||||
- DB : postgresql
|
||||
- DB 이름 : casaos
|
||||
- DB 유저 : casaos
|
||||
- DB 비밀번호 : casaos
|
||||
- DB 포트 : 5432
|
||||
- DB 호스트 : 192.168.0.60
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -76,6 +77,17 @@
|
||||
<artifactId>mssql-jdbc</artifactId>
|
||||
<version>12.8.1.jre8</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.7.3</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.checkerframework</groupId>
|
||||
<artifactId>checker-qual</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<!-- Mysql -->
|
||||
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
|
||||
<!--<dependency>
|
||||
@@ -197,6 +209,13 @@
|
||||
<meminitial>512m</meminitial>
|
||||
<maxmem>1024m</maxmem>
|
||||
<encoding>UTF-8</encoding>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
@@ -246,5 +265,6 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<sdl.version>6.0.0</sdl.version>
|
||||
<log4j2.version>2.23.1</log4j2.version>
|
||||
<lombok.version>1.18.46</lombok.version>
|
||||
</properties>
|
||||
</project>
|
||||
|
||||
@@ -35,8 +35,10 @@ public class SpringConfig {
|
||||
ApplicationContext applicationContext) throws IOException {
|
||||
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
|
||||
factoryBean.setDataSource(dataSource);
|
||||
factoryBean.setConfigLocation(applicationContext.getResource("classpath:sql/mybatis/mssql/mybatis-config.xml"));
|
||||
factoryBean.setMapperLocations(applicationContext.getResources("classpath*:sql/mybatis/mssql/**/mapper-mybatis-*.xml"));
|
||||
// PostgreSQL 설정에 맞는 MyBatis 매퍼를 사용한다.
|
||||
factoryBean.setConfigLocation(applicationContext.getResource("classpath:sql/mybatis/postgresql/mybatis-config.xml"));
|
||||
// PostgreSQL 전용 매퍼 XML 전체를 로딩한다.
|
||||
factoryBean.setMapperLocations(applicationContext.getResources("classpath*:sql/mybatis/postgresql/**/mapper-mybatis-*.xml"));
|
||||
return factoryBean;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@ spring.quartz.job-store-type=jdbc
|
||||
spring.quartz.jdbc.initialize-schema=always
|
||||
|
||||
spring.quartz.datasource.driver-class-name=org.postgresql.Driver
|
||||
spring.quartz.datasource.jdbcUrl=jdbc:postgresql://10.40.87.189:5445/SDL
|
||||
spring.quartz.datasource.username=sdl5
|
||||
spring.quartz.datasource.password=dlatl#123
|
||||
spring.quartz.datasource.jdbcUrl=jdbc:postgresql://192.168.0.60:5432/casaos
|
||||
spring.quartz.datasource.username=casaos
|
||||
spring.quartz.datasource.password=casaos
|
||||
|
||||
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
|
||||
spring.quartz.properties.org.quartz.jobStore.isClustered=true
|
||||
@@ -32,4 +32,4 @@ spring.quartz.properties.org.quartz.scheduler-name=QuartzScheduler
|
||||
|
||||
#spring.cache.type=redis
|
||||
#spring.data.redis.host=localhost
|
||||
#spring.data.redis.port=6379
|
||||
#spring.data.redis.port=6379
|
||||
|
||||
@@ -7,19 +7,11 @@ cors.domain=*
|
||||
web-context-path=/
|
||||
web-resource-root=classpath:/public/
|
||||
|
||||
# Datasource(EPAS)182.197.109.75:1433 192.168.0.102:32768
|
||||
#datasource.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
|
||||
#datasource.url=jdbc:sqlserver://182.197.109.75:1433;databaseName=eMBO_dev;TrustServerCertificate=True
|
||||
#datasource.username=embodev
|
||||
#datasource.password=S@am$ung07!
|
||||
|
||||
|
||||
#datasource.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
|
||||
# Datasource(PostgreSQL)
|
||||
datasource.driver=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
|
||||
#datasource.url=jdbc:sqlserver://192.168.0.102:32768;databaseName=eMBO_dev;TrustServerCertificate=True
|
||||
datasource.url=jdbc:log4jdbc:sqlserver://192.168.0.102:32768;databaseName=eMBO_dev;TrustServerCertificate=True
|
||||
datasource.username=sa
|
||||
datasource.password=qazwsx12##
|
||||
datasource.url=jdbc:log4jdbc:postgresql://192.168.0.60:5432/casaos
|
||||
datasource.username=casaos
|
||||
datasource.password=casaos
|
||||
|
||||
|
||||
|
||||
@@ -154,4 +146,4 @@ ghrp.default-protocol=http
|
||||
ghrp.address.prefix=127.0.0.1
|
||||
ghrp.token=2fbee24b-ea55-3ecb-8267-72c340117b47
|
||||
ghrp.dept-service=/dept
|
||||
ghrp.emp-service=/emp
|
||||
ghrp.emp-service=/emp
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Configuration status="INFO">
|
||||
<Configuration status="INFO">
|
||||
<Properties>
|
||||
<Property name="LOG_DIR">logs</Property>
|
||||
</Properties>
|
||||
<Appenders>
|
||||
<Console name="ConsoleAppender" target="SYSTEM_OUT">
|
||||
<Filters>
|
||||
@@ -11,8 +14,8 @@
|
||||
</Filters>
|
||||
<PatternLayout pattern="%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{---}{faint} %clr{%c}{cyan} %n%m%n%xwEx"/>
|
||||
</Console>
|
||||
<RollingFile name="FileAppender" fileName="/logs/sdl-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="/logs/sdl/sdl-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<RollingFile name="FileAppender" fileName="${LOG_DIR}/sdl-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="${LOG_DIR}/sdl/sdl-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<Filters>
|
||||
<MarkerFilter marker="LOG4JDBC_SQL" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
|
||||
<MarkerFilter marker="LOG4JDBC_EXCEPTION" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
|
||||
@@ -27,8 +30,8 @@
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
</RollingFile>
|
||||
<RollingFile name="ApprovalAppender" fileName="/logs/approval/approval-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="/logs/approval/approval-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<RollingFile name="ApprovalAppender" fileName="${LOG_DIR}/approval/approval-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="${LOG_DIR}/approval/approval-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<PatternLayout>
|
||||
<Pattern>[%-5p] %d{yyyy-MM-dd HH:mm:ss} %c %n%m%n</Pattern>
|
||||
</PatternLayout>
|
||||
@@ -36,8 +39,8 @@
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
</RollingFile>
|
||||
<RollingFile name="AccessLogAppender" fileName="/logs/access/access-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="/logs/access/access-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<RollingFile name="AccessLogAppender" fileName="${LOG_DIR}/access/access-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="${LOG_DIR}/access/access-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<PatternLayout>
|
||||
<Pattern>%d %-5p [%t] %-17c{2} \(%13F:%L\) - %m%n</Pattern>
|
||||
</PatternLayout>
|
||||
@@ -45,8 +48,8 @@
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
</RollingFile>
|
||||
<RollingFile name="UserHistoryAppender" fileName="/logs/history/user-history-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="/logs/history/user-history-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<RollingFile name="UserHistoryAppender" fileName="${LOG_DIR}/history/user-history-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="${LOG_DIR}/history/user-history-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<PatternLayout>
|
||||
<Pattern>%d %-5p [%t] %-17c{2} \(%13F:%L\) - %m%n</Pattern>
|
||||
</PatternLayout>
|
||||
@@ -54,8 +57,8 @@
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
</RollingFile>
|
||||
<RollingFile name="RoleHistoryAppender" fileName="/logs/history/role-history-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="/logs/history/role-history-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<RollingFile name="RoleHistoryAppender" fileName="${LOG_DIR}/history/role-history-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="${LOG_DIR}/history/role-history-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<PatternLayout>
|
||||
<Pattern>%d %-5p [%t] %-17c{2} \(%13F:%L\) - %m%n</Pattern>
|
||||
</PatternLayout>
|
||||
@@ -64,8 +67,8 @@
|
||||
</Policies>
|
||||
</RollingFile>
|
||||
<RollingFile name="WorkgroupHistoryAppender"
|
||||
fileName="/logs/history/workgroup-history-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="/logs/history/workgroup-history-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
fileName="${LOG_DIR}/history/workgroup-history-${date:yyyy-MM-dd}-${hostName}.log"
|
||||
filePattern="${LOG_DIR}/history/workgroup-history-%d{yyyy-MM-dd}-${hostName}.log">
|
||||
<PatternLayout>
|
||||
<Pattern>%d %-5p [%t] %-17c{2} \(%13F:%L\) - %m%n</Pattern>
|
||||
</PatternLayout>
|
||||
@@ -116,4 +119,4 @@
|
||||
<AppenderRef ref="FileAppender"/>
|
||||
</Root>
|
||||
</Loggers>
|
||||
</Configuration>
|
||||
</Configuration>
|
||||
|
||||
@@ -12,9 +12,9 @@ spring.quartz.job-store-type=jdbc
|
||||
spring.quartz.jdbc.initialize-schema=always
|
||||
|
||||
spring.quartz.datasource.driver-class-name=org.postgresql.Driver
|
||||
spring.quartz.datasource.jdbcUrl=jdbc:postgresql://10.40.87.189:5445/SDL
|
||||
spring.quartz.datasource.username=sdl5
|
||||
spring.quartz.datasource.password=dlatl#123
|
||||
spring.quartz.datasource.jdbcUrl=jdbc:postgresql://192.168.0.60:5432/casaos
|
||||
spring.quartz.datasource.username=casaos
|
||||
spring.quartz.datasource.password=casaos
|
||||
|
||||
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
|
||||
spring.quartz.properties.org.quartz.jobStore.isClustered=true
|
||||
|
||||
Reference in New Issue
Block a user