diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..ff752ba --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,58 @@ +name: Java CI + CD + +on: + push: + branches: [ "release" ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Build with Gradle + run: ./gradlew build --exclude-task test + + - name: Upload JAR file + uses: actions/upload-artifact@v4 + with: + name: springboot-jar + path: build/libs/${{ secrets.JAR_NAME }} + + deploy: + name: Deploy to EC2 + needs: build + runs-on: ubuntu-latest + steps: + - name: Download JAR file from build + uses: actions/download-artifact@v4 + with: + name: springboot-jar + path: . + + - name: Prepare SSH Key + run: | + echo "${{ secrets.EC2_KEY }}" > private_key.pem + chmod 600 private_key.pem + + - name: Check JAR existence + run: | + ls -l ${{ secrets.JAR_NAME }} + + - name: Copy JAR to EC2 + run: | + scp -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.JAR_NAME }} \ + ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:${{ secrets.DEPLOY_PATH }}/app.jar + + - name: Run JAR on EC2 + run: | + ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << EOF + pkill -f 'java -jar' || true + nohup java -jar ${{ secrets.DEPLOY_PATH }}/app.jar > ${{ secrets.DEPLOY_PATH }}/app.log 2>&1 & + EOF \ No newline at end of file diff --git a/build.gradle b/build.gradle index dab1bc7..29daa1d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.5.4' + id 'org.springframework.boot' version '3.2.5' id 'io.spring.dependency-management' version '1.1.7' } @@ -24,17 +24,14 @@ repositories { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'jakarta.validation:jakarta.validation-api:3.0.2' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'com.google.code.findbugs:jsr305:3.0.2' - implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final' - implementation 'org.glassfish:jakarta.el:4.0.2' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + implementation 'com.google.code.findbugs:jsr305:3.0.2' - annotationProcessor 'org.projectlombok:lombok' - - compileOnly 'org.projectlombok:lombok' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' runtimeOnly 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/src/main/java/com/profect/delivery/config/SwaggerConfig.java b/src/main/java/com/profect/delivery/config/SwaggerConfig.java new file mode 100644 index 0000000..e817530 --- /dev/null +++ b/src/main/java/com/profect/delivery/config/SwaggerConfig.java @@ -0,0 +1,26 @@ +package com.profect.delivery.config; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@Configuration +@EnableWebMvc +public class SwaggerConfig { + + @Bean + public OpenAPI openAPI() { + return new OpenAPI() + .components(new Components()) + .info(apiInfo()); + } + + private Info apiInfo() { + return new Info() + .title("API Title") // API의 제목 + .description("This is my Swagger UI") // API에 대한 설명 + .version("1.0.0"); // API의 버전 + } +} diff --git a/src/main/java/com/profect/delivery/domain/users/controller/UserController.java b/src/main/java/com/profect/delivery/domain/users/controller/UserController.java index 12b81ad..46d989e 100644 --- a/src/main/java/com/profect/delivery/domain/users/controller/UserController.java +++ b/src/main/java/com/profect/delivery/domain/users/controller/UserController.java @@ -26,7 +26,7 @@ public class UserController { @GetMapping public ResponseEntity> getUser() { - String currentUserId = "user002";//인증인가 가져오면 유저 id 추출 + String currentUserId = "U000000001";//인증인가 가져오면 유저 id 추출 return userService.getUserById(currentUserId) .map(UserResponseDto::fromEntity) // Entity를 DTO로 변환 @@ -40,7 +40,7 @@ public ResponseEntity> getUser() { public ResponseEntity> patchUser( @RequestBody UserUpdateRequestDto userUpdateRequestDto) { - String currentUserId = "user001";//인증인가에서 가져온 유저 id + String currentUserId = "U000000001";//인증인가에서 가져온 유저 id String updateby="admin";//인증인가에서 가져온 업데이트한 사람 userService.updateUser(userUpdateRequestDto,currentUserId,updateby); @@ -53,7 +53,7 @@ public ResponseEntity> patchUser( @GetMapping("/addresses") public ResponseEntity>> getUserAddresses() { - String currentUserId = "user001"; + String currentUserId = "U000000001"; List addresses = userAddressService.findByUserId(currentUserId).stream() .map(UserAddressesResponseDto::fromEntity) // 각 엔티티를 DTO로 변환 @@ -68,7 +68,7 @@ public ResponseEntity>> getUserAddres public ResponseEntity> postUserAddressses( @RequestBody UserAddressesRequestDto userAddressesRequestDto) { - String currentUserId = "user001"; + String currentUserId = "U000000001"; userAddressService.CreateUserAddress(userAddressesRequestDto,currentUserId); diff --git a/src/main/java/com/profect/delivery/global/advice/GlobalExceptionalHandler.java b/src/main/java/com/profect/delivery/global/advice/GlobalExceptionalHandler.java index 9cea74f..2608b16 100644 --- a/src/main/java/com/profect/delivery/global/advice/GlobalExceptionalHandler.java +++ b/src/main/java/com/profect/delivery/global/advice/GlobalExceptionalHandler.java @@ -105,8 +105,14 @@ public ResponseEntity> handleValidationExceptions(MethodArgumentN @ExceptionHandler(Exception.class) public ResponseEntity> handleAllUncaughtException(Exception e, HttpServletRequest request) { - ErrorResponse err = ErrorResponse.of(50000, "서버 내부 오류가 발생했습니다.", request.getRequestURI()); - saveErrorLog(e, request, 50000); + + // Swagger 요청이면 예외를 다시 던져 Spring 기본 처리로 넘김 + String path = request.getRequestURI(); + if (path.contains("/v3/api-docs") || path.contains("/swagger-ui")) { + throw new RuntimeException(e); + } + + ErrorResponse err = ErrorResponse.of(50000, "서버 내부 오류가 발생했습니다.", path); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(ApiResponse.failure(err)); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 2008c1e..1183083 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,13 +1,14 @@ +server: + address: 0.0.0.0 + port: 8080 spring: application: name: sample-project datasource: -# url: jdbc:postgresql://localhost:5432/sample -# driver-class-name: org.postgresql.Driver -# username: user -# password: password - url: jdbc:postgresql://43.200.244.12:5432/sample + + url: jdbc:postgresql://43.200.244.12/sample + driver-class-name: org.postgresql.Driver username: postgres password: password