Skip to content

Commit 2a762b3

Browse files
committed
Merge branch 'develop' into feature/profile
2 parents cd91aad + 197cd3d commit 2a762b3

File tree

98 files changed

+4285
-593
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+4285
-593
lines changed

.github/workflows/ci.cd.prod.yml

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,55 @@ jobs:
5050
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
5151
restore-keys: ${{ runner.os }}-gradle
5252

53-
- name: MySQL 컨테이너 실행
53+
- name: S3에서 init.sql 다운로드
54+
env:
55+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
56+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
57+
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
58+
run: |
59+
mkdir -p docker
60+
aws s3 cp s3://${{ secrets.S3_BUCKET_NAME }}/db/init.sql ./docker/init.sql
61+
62+
- name: Docker Compose 설치
63+
run: |
64+
sudo curl -L "https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
65+
sudo chmod +x /usr/local/bin/docker-compose
66+
67+
- name: Docker Compose 실행
68+
run: |
69+
chmod -R 755 ./docker
70+
docker-compose -f docker-compose.yml up -d
71+
72+
- name: 컨테이너 실행 대기
5473
run: |
55-
docker run --name log4u-mysql \
56-
-e MYSQL_ROOT_PASSWORD=root \
57-
-e MYSQL_DATABASE=log4u \
58-
-e MYSQL_USER=dev \
59-
-e MYSQL_PASSWORD=devcos4-team08 \
60-
-d \
61-
-p 3307:3306 \
62-
mysql:8.0.33
74+
echo "Waiting for MySQL to be ready..."
75+
for i in {1..10}; do
76+
if docker-compose exec mysql mysqladmin ping -h "127.0.0.1" --silent; then
77+
echo "MySQL is ready!"
78+
break
79+
fi
80+
sleep 1
81+
done
82+
if ! docker-compose exec mysql mysqladmin ping -h "127.0.0.1" --silent; then
83+
echo "MySQL did not start in time!"
84+
exit 1
85+
fi
86+
87+
echo "Waiting for PostgreSQL to be ready..."
88+
for i in {1..10}; do
89+
if docker-compose exec -T postgres pg_isready -d gis_db -U postgres; then
90+
echo "PostgreSQL is ready!"
91+
break
92+
fi
93+
sleep 2
94+
done
95+
if ! docker-compose exec -T postgres pg_isready -d gis_db -U postgres; then
96+
echo "PostgreSQL did not start in time!"
97+
docker-compose logs postgres
98+
exit 1
99+
fi
100+
101+
63102
64103
- name: Build and analyze
65104
env:
@@ -70,17 +109,19 @@ jobs:
70109
JWT_SECRET: ${{ secrets.JWT_SECRET }}
71110
JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS: ${{ secrets.JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS }}
72111
JWT_REFRESH_TOKEN_EXPIRE_TIME_SECONDS: ${{ secrets.JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS }}
112+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
113+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
114+
AWS_REGION: ${{ secrets.AWS_REGION }}
115+
S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
73116

74117
# 테스트용으로 dev 프로필 사용(시크릿 제외하고 prod 와 동일)
75118
run: |
76119
chmod +x ./gradlew
77120
# 소나클라우드 임시 비활성화 ./gradlew build jacocoTestReport sonar --info -Pprofile=dev -Dsonar.branch.name=${{ github.ref_name }}
78121
./gradlew build -i jacocoTestReport -Pprofile=dev
79122
80-
- name: Docker MySQL 종료 및 제거
81-
run: |
82-
docker stop log4u-mysql
83-
docker rm log4u-mysql
123+
- name: Docker Compose 종료
124+
run: docker-compose -f docker-compose.yml down
84125

85126
# AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
86127
- name: Configure AWS credentials
@@ -90,20 +131,33 @@ jobs:
90131
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
91132
aws-region: ${{ secrets.AWS_REGION }}
92133

93-
- name: Secret 파일 수동 생성
134+
- name: Secret 파일 수동 생성(gitignore 무시)
94135
run: |
95136
mkdir -p ./src/main/resources
96137
echo "${{ secrets.PROD_SECRET }}" | base64 --decode > ./src/main/resources/application-prod-secret.yml
97138
98139
mkdir -p ./deploy-package/src/main/resources
99140
rsync -av --exclude='deploy-package' ./ ./deploy-package
141+
100142
cp ./src/main/resources/application-prod-secret.yml ./deploy-package/src/main/resources/application-prod-secret.yml
143+
cp ./src/main/resources/application-prod.yml ./deploy-package/src/main/resources/application-prod.yml
144+
145+
- name: Docker Compose 및 Init.sql 파일 추가
146+
run: |
147+
mkdir -p ./deploy-package/docker
148+
cp ./docker-compose.yml ./deploy-package/docker-compose.yml
149+
cp ./docker/init.sql ./deploy-package/docker/init.sql
101150
102151
- name: 빌드 결과 수동 생성
103152
run: |
104153
mkdir -p ./deploy-package/build/libs
105154
cp build/libs/Log4U-0.0.1-SNAPSHOT.jar ./deploy-package/build/libs/
106155
156+
- name: 배포 디렉토리 구조 출력
157+
run: |
158+
sudo apt-get update && sudo apt-get install -y tree
159+
tree ./deploy-package
160+
107161
# 빌드 결과물을 S3 버킷에 업로드
108162
- name: Upload to AWS S3
109163
run: |
@@ -114,7 +168,7 @@ jobs:
114168
--source ./deploy-package
115169
116170
# S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
117-
- name: Deploy to AWS EC2 from S3g
171+
- name: Deploy to AWS EC2 from S3
118172
run: |
119173
aws deploy create-deployment \
120174
--application-name ${{ secrets.CODE_DEPLOY_APP_NAME }} \

.github/workflows/dev-build.yml

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,38 @@ jobs:
3636
restore-keys: ${{ runner.os }}-sonar
3737

3838

39-
- name: MySQL 컨테이너 실행
39+
- name: Docker Compose 실행
4040
run: |
41-
docker run --name log4u-mysql \
42-
-e MYSQL_ROOT_PASSWORD=root \
43-
-e MYSQL_DATABASE=log4u \
44-
-e MYSQL_USER=${{ secrets.DB_USERNAME }} \
45-
-e MYSQL_PASSWORD=${{ secrets.DB_PASSWORD}} \
46-
-d \
47-
-p 3307:3306 \
48-
mysql:8.0.33
41+
docker-compose -f docker-compose.yml up -d
4942
50-
- name: Wait for MySQL to be ready
43+
- name: 컨테이너 실행 대기
5144
run: |
45+
echo "Waiting for MySQL to be ready..."
5246
for i in {1..10}; do
53-
if docker exec log4u-mysql mysqladmin ping -h "127.0.0.1" --silent; then
47+
if docker exec log4u_mysql mysqladmin ping -h "127.0.0.1" --silent; then
5448
echo "MySQL is ready!"
5549
break
5650
fi
57-
echo "Waiting for MySQL to start..."
5851
sleep 1
5952
done
60-
if ! docker exec log4u-mysql mysqladmin ping -h "127.0.0.1" --silent; then
53+
if ! docker exec log4u_mysql mysqladmin ping -h "127.0.0.1" --silent; then
6154
echo "MySQL did not start in time!"
6255
exit 1
6356
fi
6457
58+
echo "Waiting for PostgreSQL to be ready..."
59+
for i in {1..10}; do
60+
if docker exec log4u_postgres pg_isready -U postgres; then
61+
echo "PostgreSQL is ready!"
62+
break
63+
fi
64+
sleep 1
65+
done
66+
if ! docker exec log4u_postgres pg_isready -U postgres; then
67+
echo "PostgreSQL did not start in time!"
68+
exit 1
69+
fi
70+
6571
- name: Test and analyze
6672
env:
6773
#GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -81,17 +87,19 @@ jobs:
8187
JWT_SECRET: ${{ secrets.JWT_SECRET }}
8288
JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS: ${{ secrets.JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS }}
8389
JWT_REFRESH_TOKEN_EXPIRE_TIME_SECONDS: ${{ secrets.JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS }}
84-
90+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
91+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
92+
AWS_REGION: ${{ secrets.AWS_REGION }}
93+
S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
8594
# dev 프로필 사용
8695
run: |
8796
chmod +x ./gradlew
8897
# 소나클라우드 임시 비활성화 ./gradlew build jacocoTestReport sonar --info -Pprofile=dev -Dsonar.branch.name=${{ github.ref_name }}
8998
./gradlew build -i jacocoTestReport -Pprofile=dev
9099
91-
- name: Docker MySQL 종료 및 제거
92-
run: |
93-
docker stop log4u-mysql
94-
docker rm log4u-mysql
100+
101+
- name: Docker Compose 종료
102+
run: docker-compose -f docker-compose.yml down
95103

96104
- name: Upload Test Report
97105
uses: actions/upload-artifact@v4

build.gradle.kts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ dependencies {
3535
implementation("org.springframework.boot:spring-boot-starter-data-redis")
3636
implementation("mysql:mysql-connector-java:8.0.33")
3737

38+
implementation ("org.antlr:antlr4-runtime:4.10.1")
39+
40+
41+
// PostgreSQL + PostGIS
42+
implementation("org.postgresql:postgresql:42.7.3") // 최신 버전 확인
43+
implementation ("org.hibernate.orm:hibernate-spatial:6.2.7.Final") // 최신 Hibernate 6
44+
implementation("org.hibernate.orm:hibernate-core:6.2.7.Final")
45+
46+
// Geometry 관련
47+
implementation ("org.locationtech.jts:jts-core:1.18.2")
48+
3849
compileOnly("org.projectlombok:lombok")
3950
testCompileOnly("org.projectlombok:lombok")
4051
testAnnotationProcessor("org.projectlombok:lombok")
@@ -60,6 +71,10 @@ dependencies {
6071

6172
// mysql
6273
runtimeOnly("com.mysql:mysql-connector-j")
74+
75+
// AWS
76+
implementation(platform("software.amazon.awssdk:bom:2.31.11"))
77+
implementation("software.amazon.awssdk:s3")
6378
}
6479

6580
tasks.withType<Test> {

docker-compose.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
services:
2+
postgres:
3+
image: postgis/postgis:15-3.3
4+
container_name: log4u_postgres
5+
environment:
6+
POSTGRES_DB: gis_db
7+
POSTGRES_USER: postgres
8+
POSTGRES_PASSWORD: 1234
9+
ports:
10+
- "5432:5432"
11+
volumes:
12+
- pgdata:/var/lib/postgresql/data
13+
- ./docker/init.sql:/docker-entrypoint-initdb.d/init.sql
14+
networks:
15+
- log4u-net
16+
17+
mysql:
18+
image: mysql:8.0.33
19+
container_name: log4u_mysql
20+
environment:
21+
TZ: Asia/Seoul
22+
MYSQL_ROOT_PASSWORD: root
23+
MYSQL_USER: dev
24+
MYSQL_PASSWORD: devcos4-team08
25+
MYSQL_DATABASE: log4u
26+
ports:
27+
- "3307:3306"
28+
volumes:
29+
- mysql_data:/var/lib/mysql
30+
networks:
31+
- log4u-net
32+
33+
volumes:
34+
pgdata:
35+
mysql_data:
36+
37+
networks:
38+
log4u-net:

scripts/deploy.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@ DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
99

1010
TIME_NOW=$(date +%c)
1111

12+
# Docker Compose로 postgres 실행
13+
echo "$TIME_NOW > Docker Compose postgres 서비스 실행" >> $DEPLOY_LOG
14+
docker-compose up -d postgres
15+
16+
# Docker Compose 서비스 확인
17+
POSTGRES_STATUS=$(docker ps --filter "name=log4u_postgres" --format "{{.Status}}")
18+
if [[ "$POSTGRES_STATUS" == *"Up"* ]]; then
19+
echo "$TIME_NOW > PostgreSQL 서비스가 성공적으로 실행되었습니다." >> $DEPLOY_LOG
20+
else
21+
echo "$TIME_NOW > PostgreSQL 서비스 실행 실패!" >> $DEPLOY_LOG
22+
exit 1
23+
fi
24+
1225
# build 파일 복사
1326
echo "$TIME_NOW > $JAR_FILE 파일 복사" >> $DEPLOY_LOG
1427
cp $PROJECT_ROOT/build/libs/Log4U-0.0.1-SNAPSHOT.jar $JAR_FILE
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.example.log4u.common.config;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import javax.sql.DataSource;
7+
8+
import org.springframework.boot.context.properties.ConfigurationProperties;
9+
import org.springframework.boot.jdbc.DataSourceBuilder;
10+
import org.springframework.context.annotation.Bean;
11+
import org.springframework.context.annotation.Configuration;
12+
import org.springframework.context.annotation.Primary;
13+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
14+
import org.springframework.orm.jpa.JpaTransactionManager;
15+
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
16+
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
17+
import org.springframework.transaction.PlatformTransactionManager;
18+
19+
@Configuration
20+
@EnableJpaRepositories(
21+
basePackages = {
22+
"com.example.log4u.common",
23+
"com.example.log4u.domain.comment",
24+
"com.example.log4u.domain.diary",
25+
"com.example.log4u.domain.follow",
26+
"com.example.log4u.domain.like",
27+
"com.example.log4u.domain.media",
28+
"com.example.log4u.domain.reports",
29+
"com.example.log4u.domain.supports",
30+
"com.example.log4u.domain.user",
31+
"com.example.log4u.domain.subscription"
32+
},
33+
entityManagerFactoryRef = "mysqlEntityManagerFactory",
34+
transactionManagerRef = "mysqlTransactionManager"
35+
)
36+
public class MySqlConfig {
37+
38+
@Bean
39+
@Primary
40+
@ConfigurationProperties(prefix = "spring.datasource")
41+
public DataSource mysqlDataSource() {
42+
return DataSourceBuilder.create().build();
43+
}
44+
45+
@Bean(name = "mysqlEntityManagerFactory")
46+
@Primary
47+
public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory() {
48+
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
49+
em.setDataSource(mysqlDataSource());
50+
em.setPackagesToScan(
51+
"com.example.log4u.common",
52+
"com.example.log4u.domain.comment",
53+
"com.example.log4u.domain.diary",
54+
"com.example.log4u.domain.follow",
55+
"com.example.log4u.domain.like",
56+
"com.example.log4u.domain.media",
57+
"com.example.log4u.domain.reports",
58+
"com.example.log4u.domain.supports",
59+
"com.example.log4u.domain.user",
60+
"com.example.log4u.domain.subscription"
61+
);
62+
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
63+
vendorAdapter.setShowSql(true);
64+
vendorAdapter.setGenerateDdl(true);
65+
em.setJpaVendorAdapter(vendorAdapter);
66+
67+
Map<String, Object> properties = new HashMap<>();
68+
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
69+
properties.put("hibernate.hbm2ddl.auto", "update");
70+
properties.put("hibernate.format_sql", true);
71+
em.setJpaPropertyMap(properties);
72+
73+
return em;
74+
}
75+
76+
@Bean(name = "mysqlTransactionManager")
77+
@Primary
78+
public PlatformTransactionManager mysqlTransactionManager() {
79+
JpaTransactionManager transactionManager = new JpaTransactionManager();
80+
transactionManager.setEntityManagerFactory(mysqlEntityManagerFactory().getObject());
81+
return transactionManager;
82+
}
83+
}

0 commit comments

Comments
 (0)