diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..525ad30 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,56 @@ +# Workflow의 이름을 지정 +name: BackEnd - CI/CD - build + +on: + pull_request: + # main branch, develop branch에 pr 할경우 동작합니다. + branches: [ "main", "develop" ] + push: + # develop branch에 push 하면 동작합니다. + branches: [ "develop" ] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + environment: build + + steps: + - uses: actions/checkout@v3 + # JDK를 21 버전으로 셋팅 + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + java-version: '21' + distribution: 'temurin' + + # Gradle을 캐싱 -> 빌드 속도가 증가하는 효과 + - name: Gradle 캐싱 + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + # 프로젝트 저장소에 업로드하면 안되는 설정 파일들을 생성 + - name: Make application.properties + run: | + cd ./src/main + mkdir resources + cd ./resources + touch ./application.properties + echo "$APPLICATION" > ./application.properties + env: + APPLICATION: ${{ secrets.APPLICATION }} + shell: bash + + - name: Gradle 권한 부여 + run: chmod +x gradlew + + - name: Gradle로 빌드 실행 + run: ./gradlew bootjar \ No newline at end of file diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e3ada91..ee0b7ae 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,5 +1,5 @@ # Workflow의 이름을 지정 -name: BackEnd - CI/CD +name: BackEnd - CI/CD - deploy on: push: @@ -10,8 +10,9 @@ permissions: contents: read jobs: - build: + deploy: runs-on: ubuntu-latest + environment: production steps: - uses: actions/checkout@v3 @@ -20,7 +21,7 @@ jobs: uses: actions/setup-java@v3 with: java-version: '21' - distribution: 'oracle' + distribution: 'temurin' # Gradle을 캐싱 -> 빌드 속도가 증가하는 효과 - name: Gradle 캐싱 diff --git a/README.md b/README.md index 437e26f..3cf212b 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,12 @@ ### Commit Convention -| Commit Type | Description | -|-------------|------------------------------| -| feat | 기능 개발 | -| fix | 버그 수정 | -| docs | 문서 수정 | -| refactor | 코드 리팩토링 | -| test | 테스트 관련 코드 | +| Commit Type | Description | +|-------------|----------------------| +| feat | 기능 개발 | +| fix | 버그 수정 | +| docs | 문서 수정 | +| refactor | 코드 리팩토링 | +| test | 테스트 관련 코드 | | chore | 빌드 업무 수정, 패키지 매니저 수정 | +| cicd | 배포 관련 작업 | \ No newline at end of file diff --git a/src/main/java/com/muji_backend/kw_muji/team/service/TeamService.java b/src/main/java/com/muji_backend/kw_muji/team/service/TeamService.java index 30b1793..e4610f2 100644 --- a/src/main/java/com/muji_backend/kw_muji/team/service/TeamService.java +++ b/src/main/java/com/muji_backend/kw_muji/team/service/TeamService.java @@ -21,6 +21,8 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.*; @@ -38,6 +40,9 @@ public class TeamService { @Value("${cloud.aws.s3.bucket}") private String bucket; + @Value("${cloud.aws.s3.url}") + private String bucketURL; + @Value("${cloud.aws.s3.folder.folderName2}") private String projectImageBucketFolder; // aws에 추가하기 @@ -116,44 +121,50 @@ public void saveParticipation(final ParticipationEntity participation, final Pro } public Map getOnGoingProjects(int page, String search) { - final List onGoingProjects = projectRepo.findAllByIsOnGoing(true, Sort.by(Sort.Direction.DESC, "createdAt")); - final List endedProjects = projectRepo.findAllByIsOnGoing(false, Sort.by(Sort.Direction.DESC, "createdAt")); - - // 두 리스트 합치기 - List projects = new ArrayList<>(); - projects.addAll(onGoingProjects); - projects.addAll(endedProjects); - - // search 값이 비어 있지 않으면 이름으로 필터링 - if (search != null && !search.trim().isEmpty()) { - String lowerCaseSearch = search.toLowerCase(); // 대소문자 구분 없이 검색 - projects = projects.stream() - .filter(project -> project.getName().toLowerCase().contains(lowerCaseSearch)) - .collect(Collectors.toList()); - } - - // 전체 페이지 수 계산 - int totalProjects = projects.size(); - int totalPages = (int) Math.ceil((double) totalProjects / 8); - - // 수동으로 페이지네이션 - int start = Math.min(page * 8, projects.size()); - int end = Math.min((page + 1) * 8, projects.size()); - - List projectDTO = projects.subList(start, end).stream() - .map(project -> ProjectListResponseDTO.builder() - .id(project.getId()) - .name(project.getName()) - .start(project.isStart()) - .deadlineAt(LocalDate.from(project.getDeadlineAt())) - .image(project.getImage()) - .isOnGoing(project.isOnGoing()) - .build()) - .toList(); - - Map response = new HashMap<>(); - response.put("projects", projectDTO); - response.put("totalPages", totalPages); - return response; + final List onGoingProjects = projectRepo.findAllByIsOnGoing(true, Sort.by(Sort.Direction.DESC, "createdAt")); + final List endedProjects = projectRepo.findAllByIsOnGoing(false, Sort.by(Sort.Direction.DESC, "createdAt")); + + // 두 리스트 합치기 + List projects = new ArrayList<>(); + projects.addAll(onGoingProjects); + projects.addAll(endedProjects); + + // search 값이 비어 있지 않으면 이름으로 필터링 + if (search != null && !search.trim().isEmpty()) { + String lowerCaseSearch = search.toLowerCase(); // 대소문자 구분 없이 검색 + projects = projects.stream() + .filter(project -> project.getName().toLowerCase().contains(lowerCaseSearch)) + .collect(Collectors.toList()); + } + + // 전체 페이지 수 계산 + int totalProjects = projects.size(); + int totalPages = (int) Math.ceil((double) totalProjects / 8); + + // 수동으로 페이지네이션 + int start = Math.min(page * 8, projects.size()); + int end = Math.min((page + 1) * 8, projects.size()); + + List projectDTO = projects.subList(start, end).stream() + .map(project -> { + try { + return ProjectListResponseDTO.builder() + .id(project.getId()) + .name(project.getName()) + .start(project.isStart()) + .deadlineAt(LocalDate.from(project.getDeadlineAt())) + .image(project.getImage() != null ? bucketURL + URLEncoder.encode(project.getImage(), "UTF-8") : "") + .isOnGoing(project.isOnGoing()) + .build(); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + }) + .toList(); + + Map response = new HashMap<>(); + response.put("projects", projectDTO); + response.put("totalPages", totalPages); + return response; } }