diff --git a/.gitignore b/.gitignore index 113baba..8f7b99d 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,5 @@ hs_err_pid44980.log build/ docker-compose.yaml + +/src/main/resources/ancient-pipe-447417-i4-755ce59fbf03.json diff --git a/Dockerfile b/Dockerfile index cc15b00..9ccc954 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,4 +2,5 @@ FROM openjdk:17 ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} test-app.jar EXPOSE 8080 -CMD ["java", "-Dtest.customName=${CUSTOM_NAME}", "-jar", "test-app.jar"] \ No newline at end of file +CMD ["java", "-Dtest.customName=${CUSTOM_NAME}", "-jar", "test-app.jar"] + diff --git a/build.gradle b/build.gradle index 11d7364..c28bbfd 100644 --- a/build.gradle +++ b/build.gradle @@ -23,13 +23,15 @@ repositories { mavenCentral() } + dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'io.jsonwebtoken:jjwt-api:0.12.3' implementation 'io.jsonwebtoken:jjwt-impl:0.12.3' implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3' - implementation 'io.github.cdimascio:java-dotenv:5.2.2' // .env 파일 + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + //implementation 'io.github.cdimascio:java-dotenv:5.2.2' // .env 파일 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' implementation 'org.springframework.boot:spring-boot-starter-web' @@ -38,6 +40,8 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0' + implementation group: 'com.google.cloud', name: 'spring-cloud-gcp-starter', version: '6.0.0' + implementation group: 'com.google.cloud', name: 'spring-cloud-gcp-storage', version: '6.0.0' } tasks.named('test') { diff --git a/buildDockerWindow.sh b/buildDockerWindow.sh index 1701b13..cbcb728 100755 --- a/buildDockerWindow.sh +++ b/buildDockerWindow.sh @@ -1,4 +1,4 @@ #!/bin/bash -docker buildx build --platform linux/amd64 -t comncheck/spring-backend-oauth:1.0.5 . +docker buildx build --platform linux/amd64 -t comncheck/spring-backend-oauth:1.0.7 . diff --git a/data/refresh-token-data/dump.rdb b/data/refresh-token-data/dump.rdb new file mode 100644 index 0000000..ece464b Binary files /dev/null and b/data/refresh-token-data/dump.rdb differ diff --git a/src/main/java/com/ComNCheck/ComNCheck/domain/majorEvent/service/MajorEventService.java b/src/main/java/com/ComNCheck/ComNCheck/domain/majorEvent/service/MajorEventService.java index 988e017..0052a19 100644 --- a/src/main/java/com/ComNCheck/ComNCheck/domain/majorEvent/service/MajorEventService.java +++ b/src/main/java/com/ComNCheck/ComNCheck/domain/majorEvent/service/MajorEventService.java @@ -4,20 +4,23 @@ import com.ComNCheck.ComNCheck.domain.majorEvent.model.dto.request.EventUpdateRequestDTO; import com.ComNCheck.ComNCheck.domain.majorEvent.model.dto.response.EventListResponseDTO; import com.ComNCheck.ComNCheck.domain.majorEvent.model.dto.response.EventResponseDTO; -import com.ComNCheck.ComNCheck.domain.majorEvent.model.dto.response.PagedEventListResponseDTO; import com.ComNCheck.ComNCheck.domain.majorEvent.model.entity.MajorEvent; import com.ComNCheck.ComNCheck.domain.majorEvent.repository.MajorEventRepository; import com.ComNCheck.ComNCheck.domain.member.model.entity.Member; import com.ComNCheck.ComNCheck.domain.member.model.entity.Role; import com.ComNCheck.ComNCheck.domain.member.repository.MemberRepository; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.BlobInfo; +import java.io.IOException; import java.time.LocalDate; import java.time.LocalTime; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -29,10 +32,12 @@ public class MajorEventService { private final MajorEventRepository majorEventRepository; private final MemberRepository memberRepository; + @Value("${spring.cloud.gcp.storage.bucket}") + private String bucketName; + private final Storage storage; @Transactional public EventResponseDTO createMajorEvent(EventCreateRequestDTO requestDTO, Long writerId) { - System.out.println("서비스 들어옴"); Member writer = memberRepository.findByMemberId(writerId) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다.")); @@ -126,11 +131,27 @@ private List uploadImagesToGcs(List images) { if (images == null || images.isEmpty()) { return new ArrayList<>(); } + List uploadUrls = new ArrayList<>(); - for(MultipartFile file : images) { - // gcs 업로드 호출 - String url = "https://gcs.com" + file.getOriginalFilename(); - uploadUrls.add(url); + for (MultipartFile file : images) { + try { + String uuid = UUID.randomUUID().toString(); + String contentType = file.getContentType(); + if (contentType == null) { + contentType = "application/octet-stream"; + } + BlobInfo blobInfo = storage.create( + BlobInfo.newBuilder(bucketName, uuid) + .setContentType(contentType) + .build(), + file.getInputStream() + ); + String url = "https://storage.googleapis.com/" + bucketName + "/" + uuid; + uploadUrls.add(url); + + } catch (IOException e) { + throw new RuntimeException("이미지 업로드 실패", e); + } } return uploadUrls; } @@ -141,7 +162,6 @@ private boolean isNotPassed(MajorEvent majorEvent, LocalDate today, LocalTime cu } public void isCheckRole(Member member) { - System.out.println("조건문 들어옴"); Role checkRole = member.getRole(); if(checkRole != Role.ROLE_ADMIN && checkRole != Role.ROLE_MAJOR_PRESIDENT && checkRole != Role.ROLE_STUDENT_COUNCIL) { System.out.println("접근 권한이 없음"); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 85b055c..ee1d298 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -32,7 +32,18 @@ spring: scope: - email - profile - + data: + redis: + host: ${REDIS_HOST:localhost} + port: ${REDIS_PORT:6379} + password: ${REDIS_PASSWORD} + cloud: + gcp: + storage: + credentials: + location: classpath:ancient-pipe-447417-i4-755ce59fbf03.json + project-id: ${PROJECT_ID} + bucket: ${BUCKET_ID} jwt: secret: ${JWT_SECRET} expirationMs: ${JWT_EXPIRATIONMS} \ No newline at end of file