Skip to content

Commit 203c570

Browse files
authored
Merge pull request #68 from cloudcomputinginha/dev
CHORE: Release v1.6
2 parents edfebc6 + 51a6a7f commit 203c570

36 files changed

+467
-161
lines changed

build.gradle

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ plugins {
44
id 'io.spring.dependency-management' version '1.1.7'
55
}
66

7+
ext {
8+
set('springCloudVersion', "2024.0.1")
9+
}
10+
711
group = 'cloudcomputinginha'
812
version = '0.0.1-SNAPSHOT'
913

@@ -26,19 +30,18 @@ repositories {
2630
dependencies {
2731
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2832
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
29-
//implementation 'org.springframework.boot:spring-boot-starter-security'
3033
implementation 'org.springframework.boot:spring-boot-starter-validation'
3134
implementation 'org.springframework.boot:spring-boot-starter-web'
3235
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
3336
implementation 'software.amazon.awssdk:s3:2.21.5'
3437

35-
//implementation 'org.springframework.boot:spring-boot-starter-actuator'
3638
compileOnly 'org.projectlombok:lombok'
3739
runtimeOnly 'com.mysql:mysql-connector-j'
3840
annotationProcessor 'org.projectlombok:lombok'
3941

4042
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
4143

44+
//querydsl
4245
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
4346
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
4447
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
@@ -74,6 +77,8 @@ dependencies {
7477
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
7578
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
7679

80+
// OpenFeign AI 서버와 통신을 위한 의존성
81+
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.2.1'
7782
}
7883

7984
tasks.named('test') {

src/main/java/cloudcomputinginha/demo/DemoApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.cloud.openfeign.EnableFeignClients;
56
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
67
import org.springframework.scheduling.annotation.EnableAsync;
78
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -10,6 +11,7 @@
1011
@EnableJpaAuditing
1112
@EnableAsync
1213
@EnableScheduling
14+
@EnableFeignClients
1315
public class DemoApplication {
1416

1517
public static void main(String[] args) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package cloudcomputinginha.demo.apiPayload.code.handler;
2+
3+
import cloudcomputinginha.demo.apiPayload.code.BaseErrorCode;
4+
import cloudcomputinginha.demo.apiPayload.exception.GeneralException;
5+
6+
public class AiHandler extends GeneralException {
7+
public AiHandler(BaseErrorCode errorCode) {
8+
super(errorCode);
9+
}
10+
}

src/main/java/cloudcomputinginha/demo/apiPayload/code/status/ErrorStatus.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public enum ErrorStatus implements BaseErrorCode {
3636
INTERVIEW_NOT_ACCEPTING_MEMBERS(HttpStatus.BAD_REQUEST, "INTERVIEW4002", "현재 인터뷰는 참여자를 받지 않습니다."),
3737
INTERVIEW_END_TIME_INVALID(HttpStatus.CONFLICT, "INTERVIEW4003", "인터뷰의 종료 시간이 시작 시간보다 빠릅니다."),
3838
INTERVIEW_ALREADY_TERMINATED(HttpStatus.CONFLICT, "INTERVIEW4004", "해당하는 인터뷰는 이미 종료되었습니다."),
39-
INTERVIEW_NO_PERMISSION(HttpStatus.FORBIDDEN, "INTERVIEW4005", "해당 인터뷰 수정 권한이 없습니다."),
39+
INTERVIEW_NO_PERMISSION(HttpStatus.FORBIDDEN, "INTERVIEW4005", "해당 인터뷰에 대한 권한이 없습니다."),
4040
INTERVIEW_DOCUMENTS_NOT_FOUND(HttpStatus.BAD_REQUEST, "INTERVIEW4006", "이력서와 자기소개서는 필수입니다."),
4141

4242
// 멤버 인터뷰 관련 에러,
@@ -61,7 +61,13 @@ public enum ErrorStatus implements BaseErrorCode {
6161
INTERVIEW_SCHEDULE_CHECK_FAIL(HttpStatus.INTERNAL_SERVER_ERROR, "SCHEDULER5004", "Job 존재 여부 확인에 실패했습니다."),
6262
INTERVIEW_SCHEDULE_ALREADY_EXISTS(HttpStatus.CONFLICT, "SCHEDULER4001", "해당 면접 스케줄은 이미 존재합니다."),
6363
INTERVIEW_REMINDER_TIME_INVALID(HttpStatus.BAD_REQUEST, "SCHEDULER4002", "면접 리마인더 시간이 유효하지 않습니다."),
64-
INTERVIEW_SCHEDULE_INVALID_ARGUMENT(HttpStatus.BAD_REQUEST, "SCHEDULER4003", "면접 ID 또는 시간이 유효하지 않습니다.");
64+
INTERVIEW_SCHEDULE_INVALID_ARGUMENT(HttpStatus.BAD_REQUEST, "SCHEDULER4003", "면접 ID 또는 시간이 유효하지 않습니다."),
65+
66+
// AI 관련 에러
67+
AI_RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND, "AI4001", "AI 서비스에서 리소스를 찾을 수 없습니다."),
68+
AI_BAD_REQUEST(HttpStatus.BAD_REQUEST, "AI4002", "AI 서비스에 잘못된 요청을 보냈습니다."),
69+
AI_INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "AI5001", "AI 서비스에서 내부 서버 에러가 발생했습니다."),
70+
;
6571

6672
private final HttpStatus httpStatus;
6773
private final String code;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package cloudcomputinginha.demo.config;
2+
3+
import cloudcomputinginha.demo.infra.ai.AiServiceErrorDecoder;
4+
import feign.Request;
5+
import feign.Retryer;
6+
import feign.codec.ErrorDecoder;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
11+
/**
12+
* Feign 클라이언트 설정
13+
* - 타임아웃 설정
14+
* - 에러 디코더 설정
15+
* - 재시도 설정
16+
*/
17+
@Configuration
18+
@RequiredArgsConstructor
19+
public class AiFeignConfig {
20+
21+
private final AiServiceErrorDecoder customErrorDecoder;
22+
23+
@Bean
24+
public Request.Options feignRequestOptions() {
25+
return new Request.Options(5000, 15000);
26+
// 5s 연결 타임아웃, 15s 읽기(응답대기) 타임아웃
27+
}
28+
29+
@Bean
30+
public ErrorDecoder errorDecoder() {
31+
return customErrorDecoder;
32+
}
33+
34+
@Bean
35+
public Retryer retryer() {
36+
return new Retryer.Default(100, 1000, 3);
37+
}
38+
}

src/main/java/cloudcomputinginha/demo/config/DomainInfo.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/main/java/cloudcomputinginha/demo/config/S3Config.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cloudcomputinginha.demo.config;
22

3-
import org.springframework.beans.factory.annotation.Value;
3+
import cloudcomputinginha.demo.config.properties.CloudProperties;
4+
import lombok.RequiredArgsConstructor;
45
import org.springframework.context.annotation.Bean;
56
import org.springframework.context.annotation.Configuration;
67
import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider;
@@ -11,26 +12,22 @@
1112
// EC2의 Instance Metadata Service (IMDS)에서 IAM Role의 자격 증명을 가져옴.
1213
// => EC2 인스턴스의 IAM Role을 사용하여 자동 인증
1314
@Configuration
15+
@RequiredArgsConstructor
1416
public class S3Config {
15-
16-
@Value("${cloud.aws.s3.region}")
17-
private String region;
18-
19-
@Value("${cloud.aws.auth}")
20-
private String authType;
17+
private final CloudProperties cloudProperties;
2118

2219
@Bean
2320
public S3Client s3Client() {
2421
return S3Client.builder()
25-
.region(Region.of(region))
22+
.region(Region.of(cloudProperties.getS3().getRegion())) // 변경된 부분
2623
.credentialsProvider(InstanceProfileCredentialsProvider.create())
2724
.build();
2825
}
2926

3027
@Bean
3128
public S3Presigner s3Presigner() {
3229
return S3Presigner.builder()
33-
.region(Region.of(region))
30+
.region(Region.of(cloudProperties.getS3().getRegion())) // 변경된 부분
3431
.credentialsProvider(InstanceProfileCredentialsProvider.create())
3532
.build();
3633
}

src/main/java/cloudcomputinginha/demo/config/auth/SecurityConfig.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package cloudcomputinginha.demo.config.auth;
22

3+
import cloudcomputinginha.demo.config.properties.DomainProperties;
34
import jakarta.servlet.http.HttpServletRequest;
45
import lombok.RequiredArgsConstructor;
5-
import org.springframework.beans.factory.annotation.Value;
66
import org.springframework.context.annotation.Bean;
77
import org.springframework.context.annotation.Configuration;
88
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -20,12 +20,8 @@
2020
@EnableWebSecurity
2121
@RequiredArgsConstructor
2222
public class SecurityConfig {
23-
23+
private final DomainProperties domainProperties;
2424
private final JwtProvider jwtProvider;
25-
@Value("${notification.domain.interview}")
26-
private String interviewDomain;
27-
@Value("${notification.domain.interview-ai}")
28-
private String interviewAiDomain;
2925

3026
@Bean
3127
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
@@ -40,8 +36,8 @@ public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
4036
"http://localhost:3000",
4137
"https://cloud-computing-fe-two.vercel.app",
4238
"http://127.0.0.1:5500",
43-
interviewDomain,
44-
interviewAiDomain
39+
domainProperties.getAi(),
40+
domainProperties.getBackend()
4541
));
4642

4743
configuration.setAllowedMethods(
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cloudcomputinginha.demo.config.properties;
2+
3+
import jakarta.validation.Valid;
4+
import jakarta.validation.constraints.NotBlank;
5+
import lombok.Getter;
6+
import lombok.Setter;
7+
import org.springframework.boot.context.properties.ConfigurationProperties;
8+
import org.springframework.stereotype.Component;
9+
10+
@Getter
11+
@Setter
12+
@Component
13+
@ConfigurationProperties(prefix = "cloud.aws")
14+
public class CloudProperties {
15+
16+
@NotBlank(message = "AWS 인증 방식은 필수입니다.")
17+
private String auth;
18+
19+
@Valid
20+
private S3 s3 = new S3();
21+
22+
@Getter
23+
@Setter
24+
public static class S3 {
25+
@NotBlank(message = "S3 버킷 이름은 필수입니다.")
26+
private String bucket;
27+
28+
@NotBlank(message = "AWS 리전은 필수입니다.")
29+
private String region;
30+
}
31+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cloudcomputinginha.demo.config.properties;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
import org.springframework.boot.context.properties.ConfigurationProperties;
7+
import org.springframework.stereotype.Component;
8+
9+
@Getter
10+
@Setter
11+
@Component
12+
@ConfigurationProperties(prefix = "domain")
13+
public class DomainProperties {
14+
@NotBlank(message = "백엔드 도메인은 필수입니다.")
15+
private String backend;
16+
17+
@NotBlank(message = "AI 도메인은 필수입니다.")
18+
private String ai;
19+
}

0 commit comments

Comments
 (0)