diff --git a/.github/workflows/ci_gradle.yml b/.github/workflows/ci_gradle.yml
index 1f351ccf..dda82537 100644
--- a/.github/workflows/ci_gradle.yml
+++ b/.github/workflows/ci_gradle.yml
@@ -25,7 +25,7 @@ jobs:
echo " profiles:" >> application.yml
echo " group:" >> application.yml
echo " "local": "db, s3, secret"" >> application.yml
- echo " "prod": "db, s3"" >> application.yml
+ echo " "prod": "db, s3, redis"" >> application.yml
echo " default: prod" >> application.yml
echo " servlet:" >> application.yml
@@ -49,8 +49,6 @@ jobs:
spring.jwt.secret: ${{ secrets.JWT_SECRET }}
spring.jwt.token.access-expiration-time: ${{ secrets.JWT_ACCESS_EXPIRATION_TIME }}
spring.jwt.token.refresh-expiration-time: ${{ secrets.JWT_REFRESH_EXPIRATION_TIME }}
- spring.data.redis.host: ${{ secrets.REDIS_HOST }}
- spring.data.redis.port: ${{ secrets.REDIS_PORT }}
mail.smtp.port: ${{ secrets.EMAIL_PORT }}
AdminMail.id: ${{ secrets.EMAIL_ID }}
AdminMail.password: ${{ secrets.EMAIL_PASSWORD }}
@@ -78,6 +76,14 @@ jobs:
cloud.aws.credentials.accessKey: ${{ secrets.S3_ACCESS_KEY }}
cloud.aws.credentials.secretKey: ${{ secrets.S3_SECRET_KEY }}
+ - name: 6) Set application-redis.yml
+ uses: microsoft/variable-substitution@v1
+ with:
+ files: ./core/core-infra-redis/src/main/resources/application-redis.yml
+ env:
+ spring.data.redis.host: ${{ secrets.REDIS_HOST }}
+ spring.data.redis.port: ${{ secrets.REDIS_PORT }}
+
- name: Grant execute permission for gradlew and build
run: |
chmod +x ./gradlew
diff --git a/api/build.gradle b/api/build.gradle
index 888612cc..73f1a778 100644
--- a/api/build.gradle
+++ b/api/build.gradle
@@ -3,6 +3,7 @@ dependencies {
implementation project(':core:core-domain');
implementation project(':core:core-infra-db');
implementation project(':core:core-infra-s3');
+ implementation project(':core:core-infra-redis');
// Core
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
@@ -23,10 +24,6 @@ dependencies {
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'
- // Redis
- implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '3.2.0'
- implementation 'org.springframework.session:spring-session-data-redis:3.1.1'
-
// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-api:2.0.4'
@@ -35,7 +32,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
// email
- implementation 'com.sun.mail:jakarta.mail:2.0.1'
+ implementation 'org.springframework.boot:spring-boot-starter-mail'
// FCM
implementation 'com.google.firebase:firebase-admin:9.1.1'
diff --git a/api/out/production/resources/application-local.yml b/api/out/production/resources/application-local.yml
new file mode 100644
index 00000000..fc0720fc
--- /dev/null
+++ b/api/out/production/resources/application-local.yml
@@ -0,0 +1,14 @@
+server:
+ port: 8080
+
+spring:
+ jwt:
+ secret: EENY5W0eegTf1naQB2eDeyCLl5kRS2b8xa5c4qLdS0hmVjtbvo8tOyhPMcAmtPuQ
+ token:
+ access-expiration-time: 999999999
+ refresh-expiration-time: 999999999
+
+ data:
+ redis:
+ host: localhost
+ port: 6379
diff --git a/api/out/production/resources/application-prod.yml b/api/out/production/resources/application-prod.yml
new file mode 100644
index 00000000..8dcd5ffd
--- /dev/null
+++ b/api/out/production/resources/application-prod.yml
@@ -0,0 +1,37 @@
+server:
+ port: 8080
+
+spring:
+ jwt:
+ secret: ${JWT_SECRET}
+ token:
+ access-expiration-time: ${JWT_ACCESS_EXPIRATION_TIME}
+ refresh-expiration-time: ${JWT_REFRESH_EXPIRATION_TIME}
+
+ data:
+ redis:
+ host: ${REDIS_HOST}
+ port: ${REDIS_PORT}
+
+mail:
+ smtp:
+ port: ${EMAIL_PORT}
+ auth: true
+ starttls:
+ required: true
+ enable: true
+ socketFactory:
+ class: javax.net.ssl.SSLSocketFactory
+ fallback: false
+
+AdminMail:
+ id: ${EMAIL_ID}
+ password: ${EMAIL_PASSWORD}
+
+firebase:
+ fcmUrl: ${FIREBASE_URL}
+ firebaseConfigPath: ${FIREBASE_PATH}
+ scope: https://www.googleapis.com/auth/cloud-platform
+
+PORT_ONE_KEY: ${PORT_ONE_KEY}
+PORT_ONE_SECRET: ${PORT_ONE_SECRET}
diff --git a/api/out/production/resources/application.yml b/api/out/production/resources/application.yml
new file mode 100644
index 00000000..0a6b6276
--- /dev/null
+++ b/api/out/production/resources/application.yml
@@ -0,0 +1,14 @@
+server:
+ port: 8080
+
+spring:
+ profiles:
+ group:
+ "local": "db, s3, secret"
+ "prod": "db, s3"
+ default: local
+
+ servlet:
+ multipart:
+ max-file-size: 20MB
+ max-request-size: 20MB
diff --git a/api/out/production/resources/templates/payment.html b/api/out/production/resources/templates/payment.html
new file mode 100644
index 00000000..23407b7b
--- /dev/null
+++ b/api/out/production/resources/templates/payment.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sample Payment
+
+
+
+
+
diff --git a/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/CustomLoginFilter.java b/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/CustomLoginFilter.java
index f2344fe0..c4241ec9 100644
--- a/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/CustomLoginFilter.java
+++ b/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/CustomLoginFilter.java
@@ -19,10 +19,10 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sponus.coredomain.domain.common.ApiResponse;
+import com.sponus.coreinfraredis.util.RedisUtil;
import com.sponus.sponusbe.auth.jwt.dto.JwtPair;
import com.sponus.sponusbe.auth.jwt.util.HttpResponseUtil;
import com.sponus.sponusbe.auth.jwt.util.JwtUtil;
-import com.sponus.sponusbe.auth.jwt.util.RedisUtil;
import com.sponus.sponusbe.auth.user.CustomUserDetails;
import jakarta.servlet.FilterChain;
diff --git a/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/CustomLogoutHandler.java b/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/CustomLogoutHandler.java
index 3a6d3177..7c4bfcb2 100644
--- a/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/CustomLogoutHandler.java
+++ b/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/CustomLogoutHandler.java
@@ -5,10 +5,10 @@
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutHandler;
+import com.sponus.coreinfraredis.util.RedisUtil;
import com.sponus.sponusbe.auth.jwt.exception.SecurityCustomException;
import com.sponus.sponusbe.auth.jwt.exception.SecurityErrorCode;
import com.sponus.sponusbe.auth.jwt.util.JwtUtil;
-import com.sponus.sponusbe.auth.jwt.util.RedisUtil;
import io.jsonwebtoken.ExpiredJwtException;
import jakarta.servlet.http.HttpServletRequest;
diff --git a/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/JwtAuthenticationFilter.java b/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/JwtAuthenticationFilter.java
index 27207e44..76deeb75 100644
--- a/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/JwtAuthenticationFilter.java
+++ b/api/src/main/java/com/sponus/sponusbe/auth/jwt/filter/JwtAuthenticationFilter.java
@@ -9,9 +9,9 @@
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;
+import com.sponus.coreinfraredis.util.RedisUtil;
import com.sponus.sponusbe.auth.jwt.exception.SecurityCustomException;
import com.sponus.sponusbe.auth.jwt.util.JwtUtil;
-import com.sponus.sponusbe.auth.jwt.util.RedisUtil;
import com.sponus.sponusbe.auth.user.CustomUserDetails;
import io.jsonwebtoken.ExpiredJwtException;
diff --git a/api/src/main/java/com/sponus/sponusbe/auth/jwt/util/JwtUtil.java b/api/src/main/java/com/sponus/sponusbe/auth/jwt/util/JwtUtil.java
index 1620f86b..7e9325ed 100644
--- a/api/src/main/java/com/sponus/sponusbe/auth/jwt/util/JwtUtil.java
+++ b/api/src/main/java/com/sponus/sponusbe/auth/jwt/util/JwtUtil.java
@@ -11,6 +11,7 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
+import com.sponus.coreinfraredis.util.RedisUtil;
import com.sponus.sponusbe.auth.jwt.dto.JwtPair;
import com.sponus.sponusbe.auth.jwt.exception.SecurityCustomException;
import com.sponus.sponusbe.auth.jwt.exception.SecurityErrorCode;
diff --git a/api/src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementQueryService.java b/api/src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementQueryService.java
index 376e1fc9..6801f204 100644
--- a/api/src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementQueryService.java
+++ b/api/src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementQueryService.java
@@ -12,7 +12,7 @@
import com.sponus.coredomain.domain.announcement.enums.AnnouncementType;
import com.sponus.coredomain.domain.announcement.repository.AnnouncementRepository;
import com.sponus.coredomain.domain.organization.Organization;
-import com.sponus.sponusbe.auth.jwt.util.RedisUtil;
+import com.sponus.coreinfraredis.util.RedisUtil;
import com.sponus.sponusbe.domain.announcement.dto.response.AnnouncementSummaryResponse;
import lombok.RequiredArgsConstructor;
diff --git a/api/src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementService.java b/api/src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementService.java
index 30af46e0..1fc49c21 100644
--- a/api/src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementService.java
+++ b/api/src/main/java/com/sponus/sponusbe/domain/announcement/service/AnnouncementService.java
@@ -10,14 +10,14 @@
import com.sponus.coredomain.domain.announcement.Announcement;
import com.sponus.coredomain.domain.announcement.AnnouncementImage;
-import com.sponus.coredomain.domain.announcement.AnnouncementView;
import com.sponus.coredomain.domain.announcement.enums.AnnouncementStatus;
import com.sponus.coredomain.domain.announcement.repository.AnnouncementRepository;
-import com.sponus.coredomain.domain.announcement.repository.AnnouncementViewRepository;
import com.sponus.coredomain.domain.organization.Organization;
import com.sponus.coredomain.domain.propose.repository.ProposeRepository;
+import com.sponus.coreinfraredis.entity.AnnouncementView;
+import com.sponus.coreinfraredis.repository.AnnouncementViewRepository;
+import com.sponus.coreinfraredis.util.RedisUtil;
import com.sponus.coreinfras3.S3Util;
-import com.sponus.sponusbe.auth.jwt.util.RedisUtil;
import com.sponus.sponusbe.domain.announcement.dto.request.AnnouncementCreateRequest;
import com.sponus.sponusbe.domain.announcement.dto.request.AnnouncementUpdateRequest;
import com.sponus.sponusbe.domain.announcement.dto.response.AnnouncementCreateResponse;
diff --git a/api/src/main/java/com/sponus/sponusbe/domain/notification/service/FirebaseService.java b/api/src/main/java/com/sponus/sponusbe/domain/notification/service/FirebaseService.java
index ff10ff87..009db64f 100644
--- a/api/src/main/java/com/sponus/sponusbe/domain/notification/service/FirebaseService.java
+++ b/api/src/main/java/com/sponus/sponusbe/domain/notification/service/FirebaseService.java
@@ -17,7 +17,7 @@
import com.sponus.coredomain.domain.organization.Organization;
import com.sponus.coredomain.domain.propose.Propose;
import com.sponus.coredomain.domain.report.Report;
-import com.sponus.sponusbe.auth.jwt.util.RedisUtil;
+import com.sponus.coreinfraredis.util.RedisUtil;
import com.sponus.sponusbe.domain.notification.dto.request.FcmMessage;
import lombok.RequiredArgsConstructor;
diff --git a/api/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java b/api/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java
index 631521b4..fc7086c6 100644
--- a/api/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java
+++ b/api/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java
@@ -6,7 +6,7 @@
import org.springframework.transaction.annotation.Transactional;
import com.sponus.coredomain.domain.organization.Organization;
-import com.sponus.coredomain.domain.propose.repository.ProposeCustomRepository;
+import com.sponus.coreinfradb.propose.ProposeCustomRepository;
import com.sponus.sponusbe.domain.propose.dto.response.DateGroupedProposeResponse;
import com.sponus.sponusbe.domain.propose.dto.response.ProposeSummaryGetResponse;
diff --git a/api/src/main/java/com/sponus/sponusbe/global/config/SecurityConfig.java b/api/src/main/java/com/sponus/sponusbe/global/config/SecurityConfig.java
index c0c7c0df..5cab4e7d 100644
--- a/api/src/main/java/com/sponus/sponusbe/global/config/SecurityConfig.java
+++ b/api/src/main/java/com/sponus/sponusbe/global/config/SecurityConfig.java
@@ -16,6 +16,7 @@
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import com.sponus.coreinfraredis.util.RedisUtil;
import com.sponus.sponusbe.auth.jwt.exception.JwtAccessDeniedHandler;
import com.sponus.sponusbe.auth.jwt.exception.JwtAuthenticationEntryPoint;
import com.sponus.sponusbe.auth.jwt.filter.CustomLoginFilter;
@@ -24,7 +25,6 @@
import com.sponus.sponusbe.auth.jwt.filter.JwtExceptionFilter;
import com.sponus.sponusbe.auth.jwt.util.HttpResponseUtil;
import com.sponus.sponusbe.auth.jwt.util.JwtUtil;
-import com.sponus.sponusbe.auth.jwt.util.RedisUtil;
import lombok.RequiredArgsConstructor;
diff --git a/api/src/main/resources/application-prod.yml b/api/src/main/resources/application-prod.yml
index 8dcd5ffd..a0da6eef 100644
--- a/api/src/main/resources/application-prod.yml
+++ b/api/src/main/resources/application-prod.yml
@@ -8,11 +8,6 @@ spring:
access-expiration-time: ${JWT_ACCESS_EXPIRATION_TIME}
refresh-expiration-time: ${JWT_REFRESH_EXPIRATION_TIME}
- data:
- redis:
- host: ${REDIS_HOST}
- port: ${REDIS_PORT}
-
mail:
smtp:
port: ${EMAIL_PORT}
diff --git a/api/src/main/resources/application.yml b/api/src/main/resources/application.yml
index 0a6b6276..91850ab6 100644
--- a/api/src/main/resources/application.yml
+++ b/api/src/main/resources/application.yml
@@ -5,7 +5,7 @@ spring:
profiles:
group:
"local": "db, s3, secret"
- "prod": "db, s3"
+ "prod": "db, s3, redis"
default: local
servlet:
diff --git a/core/core-domain/build.gradle b/core/core-domain/build.gradle
index 2c3a4816..6f912178 100644
--- a/core/core-domain/build.gradle
+++ b/core/core-domain/build.gradle
@@ -1,10 +1,6 @@
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
- // Redis
- implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '3.2.0'
- implementation 'org.springframework.session:spring-session-data-redis:3.1.1'
-
//querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
diff --git a/core/core-domain/src/main/java/com/sponus/CoreDomainConfig.java b/core/core-domain/src/main/java/com/sponus/CoreDomainConfig.java
index b642c494..8589e7bd 100644
--- a/core/core-domain/src/main/java/com/sponus/CoreDomainConfig.java
+++ b/core/core-domain/src/main/java/com/sponus/CoreDomainConfig.java
@@ -4,14 +4,12 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@EntityScan("com.sponus.coredomain")
@EnableJpaRepositories("com.sponus.coredomain")
-@EnableRedisRepositories("com.sponus.coredomain")
@EnableJpaAuditing
public class CoreDomainConfig {
}
diff --git a/core/core-infra-db/build.gradle b/core/core-infra-db/build.gradle
index 4540b6ec..f88a42bc 100644
--- a/core/core-infra-db/build.gradle
+++ b/core/core-infra-db/build.gradle
@@ -1,7 +1,16 @@
dependencies {
+
+ implementation project(':core:core-domain');
+
// Database
runtimeOnly 'org.postgresql:postgresql'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+
+ //querydsl
+ implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
+ annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
+ annotationProcessor "jakarta.annotation:jakarta.annotation-api"
+ annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
bootJar { enabled = false }
diff --git a/core/core-infra-db/out/production/resources/application-db.yml b/core/core-infra-db/out/production/resources/application-db.yml
new file mode 100644
index 00000000..e126dc4f
--- /dev/null
+++ b/core/core-infra-db/out/production/resources/application-db.yml
@@ -0,0 +1,41 @@
+spring:
+ config:
+ activate:
+ on-profile: local
+ datasource:
+ driver-class-name: org.postgresql.Driver
+ url: jdbc:postgresql://localhost:5432/postgres
+ username: postgres
+ password: postgres!
+ jpa:
+ database: postgresql
+ hibernate:
+ ddl-auto: create-drop
+ open-in-view: false
+ show-sql: true
+ generate-ddl: true
+ defer-datasource-initialization: true
+
+ sql:
+ init:
+ mode: always
+
+---
+
+spring:
+ config:
+ activate:
+ on-profile: prod
+ datasource:
+ driver-class-name: org.postgresql.Driver
+ url: ${DB_URL}
+ username: ${DB_USERNAME}
+ password: ${DB_PW}
+
+ jpa:
+ database: postgresql
+ hibernate:
+ ddl-auto: update
+ open-in-view: false
+ show-sql: true
+ generate-ddl: true
diff --git a/core/core-infra-db/out/production/resources/data.sql b/core/core-infra-db/out/production/resources/data.sql
new file mode 100644
index 00000000..ccb5a27b
--- /dev/null
+++ b/core/core-infra-db/out/production/resources/data.sql
@@ -0,0 +1,62 @@
+INSERT INTO organization (organization_name,
+ organization_email,
+ organization_password,
+ organization_location,
+ organization_type,
+ suborganization_type,
+ manager_name,
+ manager_position,
+ manager_email,
+ manager_phone,
+ manager_available_day,
+ manager_available_hour,
+ manager_contact_preference,
+ organization_status,
+ organization_image_url)
+VALUES ('팀 스포너스',
+ 'sponus@gmail.com',
+ '$2a$10$tzrzG/BSFrrye7Kbm4qPYuP6jaQcj5TX5ER1.X/THqkudiSjtEmWW',
+ '서울특별시 강남구 테헤란로 427',
+ 'STUDENT',
+ 'STUDENT_COUNCIL',
+ '이가은',
+ 'Project Manager',
+ 'test@gmail.com',
+ '01012345678',
+ '월-금',
+ '09:00-18:00',
+ 'EMAIL',
+ 'ACTIVE',
+ 'https://sponus.s3.ap-northeast-2.amazonaws.com/images/sponus.png');
+
+INSERT INTO announcement (announcement_title,
+ announcement_type,
+ announcement_category,
+ announcement_content,
+ announcement_status,
+ view_count,
+ organization_id,
+ created_at,
+ updated_at)
+VALUES ('무신사 스폰서십',
+ 'SPONSORSHIP',
+ 'MARKETING',
+ '무신사 스폰서십을 진행할 대학교 학생회를 모집합니다.',
+ 'OPENED',
+ 0,
+ 1,
+ '2024-02-12 15:29:19.000000',
+ '2024-02-12 15:29:19.000000');
+
+INSERT INTO tag (organization_id, tag_name)
+VALUES (1, '#무신사'),
+ (1, '#스폰서쉽');
+
+
+
+INSERT INTO announcement_image (image_name,
+ image_url,
+ announcement_id)
+VALUES ('무신사 스폰서십',
+ 'https://sponus.s3.ap-northeast-2.amazonaws.com/images/sponus.png',
+ 1);
diff --git a/core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/repository/ProposeCustomRepository.java b/core/core-infra-db/src/main/java/com/sponus/coreinfradb/propose/ProposeCustomRepository.java
similarity index 82%
rename from core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/repository/ProposeCustomRepository.java
rename to core/core-infra-db/src/main/java/com/sponus/coreinfradb/propose/ProposeCustomRepository.java
index 61e9ba37..68262a2e 100644
--- a/core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/repository/ProposeCustomRepository.java
+++ b/core/core-infra-db/src/main/java/com/sponus/coreinfradb/propose/ProposeCustomRepository.java
@@ -1,4 +1,4 @@
-package com.sponus.coredomain.domain.propose.repository;
+package com.sponus.coreinfradb.propose;
import java.util.List;
diff --git a/core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/repository/ProposeCustomRepositoryImpl.java b/core/core-infra-db/src/main/java/com/sponus/coreinfradb/propose/ProposeCustomRepositoryImpl.java
similarity index 96%
rename from core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/repository/ProposeCustomRepositoryImpl.java
rename to core/core-infra-db/src/main/java/com/sponus/coreinfradb/propose/ProposeCustomRepositoryImpl.java
index 93b84c68..b8079de9 100644
--- a/core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/repository/ProposeCustomRepositoryImpl.java
+++ b/core/core-infra-db/src/main/java/com/sponus/coreinfradb/propose/ProposeCustomRepositoryImpl.java
@@ -1,4 +1,4 @@
-package com.sponus.coredomain.domain.propose.repository;
+package com.sponus.coreinfradb.propose;
import java.util.List;
diff --git a/core/core-infra-redis/build.gradle b/core/core-infra-redis/build.gradle
new file mode 100644
index 00000000..ee614bbc
--- /dev/null
+++ b/core/core-infra-redis/build.gradle
@@ -0,0 +1,7 @@
+dependencies {
+ // Redis
+ implementation 'org.springframework.boot:spring-boot-starter-data-redis'
+}
+
+bootJar { enabled = false }
+jar { enabled = true }
diff --git a/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/CoreRedisConfig.java b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/CoreRedisConfig.java
new file mode 100644
index 00000000..9c0286b8
--- /dev/null
+++ b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/CoreRedisConfig.java
@@ -0,0 +1,9 @@
+package com.sponus.coreinfraredis;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
+
+@Configuration
+@EnableRedisRepositories("com.sponus.coreinfraredis")
+public class CoreRedisConfig {
+}
diff --git a/api/src/main/java/com/sponus/sponusbe/global/config/RedisConfig.java b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/config/RedisConfig.java
similarity index 96%
rename from api/src/main/java/com/sponus/sponusbe/global/config/RedisConfig.java
rename to core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/config/RedisConfig.java
index 534a6b4c..59931911 100644
--- a/api/src/main/java/com/sponus/sponusbe/global/config/RedisConfig.java
+++ b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/config/RedisConfig.java
@@ -1,4 +1,4 @@
-package com.sponus.sponusbe.global.config;
+package com.sponus.coreinfraredis.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
diff --git a/core/core-domain/src/main/java/com/sponus/coredomain/domain/announcement/AnnouncementView.java b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/entity/AnnouncementView.java
similarity index 94%
rename from core/core-domain/src/main/java/com/sponus/coredomain/domain/announcement/AnnouncementView.java
rename to core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/entity/AnnouncementView.java
index 98fb678c..4329966a 100644
--- a/core/core-domain/src/main/java/com/sponus/coredomain/domain/announcement/AnnouncementView.java
+++ b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/entity/AnnouncementView.java
@@ -1,4 +1,4 @@
-package com.sponus.coredomain.domain.announcement;
+package com.sponus.coreinfraredis.entity;
import java.time.Duration;
import java.time.LocalDate;
diff --git a/core/core-domain/src/main/java/com/sponus/coredomain/domain/announcement/repository/AnnouncementViewRepository.java b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/repository/AnnouncementViewRepository.java
similarity index 55%
rename from core/core-domain/src/main/java/com/sponus/coredomain/domain/announcement/repository/AnnouncementViewRepository.java
rename to core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/repository/AnnouncementViewRepository.java
index 480d2d65..3538334d 100644
--- a/core/core-domain/src/main/java/com/sponus/coredomain/domain/announcement/repository/AnnouncementViewRepository.java
+++ b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/repository/AnnouncementViewRepository.java
@@ -1,8 +1,8 @@
-package com.sponus.coredomain.domain.announcement.repository;
+package com.sponus.coreinfraredis.repository;
import org.springframework.data.repository.CrudRepository;
-import com.sponus.coredomain.domain.announcement.AnnouncementView;
+import com.sponus.coreinfraredis.entity.AnnouncementView;
public interface AnnouncementViewRepository extends CrudRepository {
diff --git a/api/src/main/java/com/sponus/sponusbe/auth/jwt/util/RedisUtil.java b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/util/RedisUtil.java
similarity index 97%
rename from api/src/main/java/com/sponus/sponusbe/auth/jwt/util/RedisUtil.java
rename to core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/util/RedisUtil.java
index 6ec4899e..f22c3d65 100644
--- a/api/src/main/java/com/sponus/sponusbe/auth/jwt/util/RedisUtil.java
+++ b/core/core-infra-redis/src/main/java/com/sponus/coreinfraredis/util/RedisUtil.java
@@ -1,4 +1,4 @@
-package com.sponus.sponusbe.auth.jwt.util;
+package com.sponus.coreinfraredis.util;
import java.util.List;
import java.util.Objects;
diff --git a/core/core-infra-redis/src/main/resources/application-redis.yml b/core/core-infra-redis/src/main/resources/application-redis.yml
new file mode 100644
index 00000000..15079fdb
--- /dev/null
+++ b/core/core-infra-redis/src/main/resources/application-redis.yml
@@ -0,0 +1,5 @@
+spring:
+ data:
+ redis:
+ host: ${REDIS_HOST}
+ port: ${REDIS_PORT}
diff --git a/core/core-infra-s3/out/production/resources/application-s3.yml b/core/core-infra-s3/out/production/resources/application-s3.yml
new file mode 100644
index 00000000..4266c83d
--- /dev/null
+++ b/core/core-infra-s3/out/production/resources/application-s3.yml
@@ -0,0 +1,13 @@
+# S3
+cloud:
+ aws:
+ s3:
+ bucket: ${BUCKET}
+ folder: images/
+ stack:
+ auto: false
+ region:
+ static: ${REGION}
+ credentials:
+ accessKey: ${S3_ACCESS_KEY}
+ secretKey: ${S3_SECRET_KEY}
diff --git a/settings.gradle b/settings.gradle
index 17a97d04..4c44e610 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -3,3 +3,4 @@ include 'api'
include 'core:core-domain'
include 'core:core-infra-db'
include 'core:core-infra-s3'
+include 'core:core-infra-redis'