From 8882c4c567517bdbac36a230b38c6224bd239d6e Mon Sep 17 00:00:00 2001 From: Yujin1219 Date: Sat, 16 Aug 2025 20:09:35 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Feat:=20=EC=84=9C=EB=B2=84=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC=20=EB=B0=8F=203S=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + Dockerfile | 2 +- build.gradle | 1 + docker-compose.yml | 89 +++++++++++++++---- .../umc/server/aws/s3/AmazonS3Manager.java | 3 +- src/main/resources/application-dev.yml | 39 +++----- src/main/resources/application-local.yml | 52 +++++------ src/main/resources/application.yml | 4 +- 8 files changed, 118 insertions(+), 75 deletions(-) diff --git a/.gitignore b/.gitignore index a281dd4..39de1b2 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ out/ ### VS Code ### .vscode/ .DS_Store + +# Environment variables +.env \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index bafda98..c3db066 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM eclipse-temurin:17-jdk-alpine +FROM eclipse-temurin:17-jdk WORKDIR /app diff --git a/build.gradle b/build.gradle index 81b0644..54e2d26 100644 --- a/build.gradle +++ b/build.gradle @@ -35,6 +35,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'me.paulschwarz:spring-dotenv:4.0.0' } tasks.named('test') { diff --git a/docker-compose.yml b/docker-compose.yml index 40523ca..99473b5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,32 +1,91 @@ -version: '3.8' +version: "3.8" services: db: image: mysql:8.0 - container_name: my-mysql - restart: always + container_name: mysql + command: [ + "--default-authentication-plugin=mysql_native_password", + "--character-set-server=utf8mb4", + "--collation-server=utf8mb4_unicode_ci" + ] environment: - MYSQL_ROOT_PASSWORD: ${SPRING_DATASOURCE_PASSWORD} - MYSQL_DATABASE: mydb + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} ports: - - "3306:3306" + - "3307:3306" # 호스트 3307 -> 컨테이너 3306 volumes: - db_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-p${MYSQL_ROOT_PASSWORD}"] + interval: 5s + timeout: 5s + retries: 20 app: - image: ggamnunq/umc:backend - container_name: spring-app - restart: always + image: yujin1219/umc-backend:dev # Docker Hub 이미지 사용 + container_name: umc-app + restart: always # 재시작 정책 추가 depends_on: - - db + db: + condition: service_healthy + env_file: + - .env environment: - SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb - SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME} - SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD} - AWS_ACCESS_KEY: ${AWS_ACCESS_KEY} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + SPRING_PROFILES_ACTIVE: dev + + # DB 연결 + SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/${MYSQL_DATABASE}?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 + SPRING_DATASOURCE_USERNAME: ${MYSQL_USER} + SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD} + + # SwaggerConfig에서 사용하는 값 + API_SERVER_URL: ${API_SERVER_URL} + + # S3 - 빈 주입 실패 막기 위해 더미 값 넣어둠 + CLOUD_AWS_CREDENTIALS_ACCESSKEY: ${CLOUD_AWS_CREDENTIALS_ACCESSKEY} + CLOUD_AWS_CREDENTIALS_SECRETKEY: ${CLOUD_AWS_CREDENTIALS_SECRETKEY} + CLOUD_AWS_REGION_STATIC: ${CLOUD_AWS_REGION_STATIC} + CLOUD_AWS_S3_BUCKET: ${CLOUD_AWS_S3_BUCKET} + CLOUD_AWS_S3_PATH_PHOTO: ${CLOUD_AWS_S3_PATH_PHOTO} + ports: - "8080:8080" volumes: db_data: + +#version: '3.8' +# +#services: +# db: +# image: mysql:8.0 +# container_name: mysql8 +# restart: always +# environment: +# MYSQL_ROOT_PASSWORD: UmcServerData1234! +# MYSQL_DATABASE: mydb +# ports: +# - "3307:3306" +# volumes: +# - db_data:/var/lib/mysql +# +# app: +# image: yujin1219/umc:backend +# container_name: spring-app +# restart: always +# depends_on: +# - db +# environment: +# SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb +# SPRING_DATASOURCE_USERNAME: root +# SPRING_DATASOURCE_PASSWORD: UmcServerData1234! +# AWS_ACCESS_KEY: ${AWS_ACCESS_KEY} +# AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} +# ports: +# - "8080:8080" +# +#volumes: +# db_data: diff --git a/src/main/java/hsu/umc/server/aws/s3/AmazonS3Manager.java b/src/main/java/hsu/umc/server/aws/s3/AmazonS3Manager.java index 08cf528..2c1f51a 100644 --- a/src/main/java/hsu/umc/server/aws/s3/AmazonS3Manager.java +++ b/src/main/java/hsu/umc/server/aws/s3/AmazonS3Manager.java @@ -23,11 +23,12 @@ public String uploadFile(String keyName, MultipartFile file)throws IOException { System.out.println(keyName); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(file.getSize()); + metadata.setContentType(file.getContentType()); // Content-Type 설정 추가 amazonS3.putObject(new PutObjectRequest(amazonConfig.getBucket(), keyName, file.getInputStream(), metadata)); return amazonS3.getUrl(amazonConfig.getBucket(),keyName).toString(); } public void deleteFile(String photoUrl){ - String s3Key = photoUrl.replace("https://umc-server.s3.ap-northeast-2.amazonaws.com/", ""); + String s3Key = photoUrl.replace("https://hsu-umc-bucket.s3.ap-northeast-2.amazonaws.com/", ""); log.info("삭제할 s3 키 = {}", s3Key); try { amazonS3.deleteObject(new DeleteObjectRequest(amazonConfig.getBucket(), s3Key)); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index dc1dba2..b782652 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,40 +1,29 @@ spring: -# config: -# import: "classpath:.env" # .env 파일을 로드 - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://db:3306/mydb - username: ${SPRING_DATASOURCE_USERNAME} - password: ${SPRING_DATASOURCE_PASSWORD} + url: jdbc:mysql://localhost:3307/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 + username: umc_user + password: umc_password jpa: - database-platform: org.hibernate.dialect.MySQL8Dialect hibernate: ddl-auto: update + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL8Dialect + show_sql: true web: cors: allowed-origins: "http://localhost:5173" - allowed-methods: GET, POST, PATCH, DELETE, PUT - allowed-headers: "*" - allow-credentials: true - - servlet: - multipart: - max-file-size: 20MB - max-request-size: 20MB cloud: aws: + credentials: + accessKey: ${CLOUD_AWS_CREDENTIALS_ACCESSKEY} + secretKey: ${CLOUD_AWS_CREDENTIALS_SECRETKEY} + region: + static: ${CLOUD_AWS_REGION_STATIC} s3: - bucket: umc-server + bucket: ${CLOUD_AWS_S3_BUCKET} path: - photo: photos - region: - static: ap-northeast-2 - stack: - auto: false - credentials: - accessKey: ${AWS_ACCESS_KEY} - secretKey: ${AWS_SECRET_ACCESS_KEY} \ No newline at end of file + photo: ${CLOUD_AWS_S3_PATH_PHOTO} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 402ac78..c1f4cc2 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,39 +1,29 @@ spring: datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/pharamQuest?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true - # url: jdbc:mysql://pharmdb.c3usgo2iex04.ap-northeast-2.rds.amazonaws.com:3306/pharmquest?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true - username: root - password: 53099035 - sql: - init: - mode: never + url: jdbc:mysql://localhost:3307/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 + username: umc_user + password: umc_password + jpa: + hibernate: + ddl-auto: update properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect - show_sql: true - format_sql: true - use_sql_comments: true - hbm2ddl: - auto: update + show_sql: true - servlet: - multipart: - max-file-size: 10MB - max-request-size: 10MB + web: + cors: + allowed-origins: "http://localhost:5173" -#cloud: -# aws: -# s3: -# bucket: umc-7th -# path: -# photo : photos -# region: -# static: ap-northeast-2 -# stack: -# auto: false -# cron: "0 * * * * *" -# credentials: -# accessKey: ${aws.access.key.id} -# secretKey: ${aws.secret.access.key} \ No newline at end of file +cloud: + aws: + credentials: + accessKey: ${CLOUD_AWS_CREDENTIALS_ACCESSKEY} + secretKey: ${CLOUD_AWS_CREDENTIALS_SECRETKEY} + region: + static: ap-northeast-2 + s3: + bucket: ${CLOUD_AWS_S3_BUCKET} + path: + photo: ${CLOUD_AWS_S3_PATH_PHOTO} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fbd4ea7..44113e4 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,7 +1,7 @@ spring: profiles: - active: dev -# active: ${spring.profiles.active} +# active: local + active: ${spring.profiles.active} api: server: From 811a15ac7e27fdf7d5962f6273d0bc2de1b4f3ca Mon Sep 17 00:00:00 2001 From: Yujin1219 Date: Sun, 17 Aug 2025 00:53:53 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Chore:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0=20=EB=B0=8F=20cors=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/hsu/umc/server/config/UMCConfiguration.java | 2 +- src/main/resources/application.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/hsu/umc/server/config/UMCConfiguration.java b/src/main/java/hsu/umc/server/config/UMCConfiguration.java index 30573fd..996854c 100644 --- a/src/main/java/hsu/umc/server/config/UMCConfiguration.java +++ b/src/main/java/hsu/umc/server/config/UMCConfiguration.java @@ -9,7 +9,7 @@ public class UMCConfiguration implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") - .allowedOrigins("http://localhost:5173","https://hansung-umc.netlify.app","https://hsuumc.site", "https://www.hsuumc.site") + .allowedOrigins("http://localhost:5173","https://hansung-umc.netlify.app","https://hsuumc.site", "https://www.hsuumc.site", "https://hsu-server.store") .allowedMethods("GET", "POST", "PATCH", "DELETE", "PUT") .allowedHeaders("*") .allowCredentials(true); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 44113e4..f3c2949 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,4 +5,4 @@ spring: api: server: - url: https://umc.hsuumc.site + url: https://hsu-server.store