Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 0 additions & 78 deletions .github/workflows/ci-cd-test.yml

This file was deleted.

5 changes: 5 additions & 0 deletions .idea/codeStyles/codeStyleConfig.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions .idea/dataSources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

124 changes: 124 additions & 0 deletions .idea/uiDesigner.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 23 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ ext {
log4j2Version = '2.20.0'
jacksonVersion = '2.15.3'
aspectjVersion = '1.9.20'
springKafkaVersion = '2.9.10'
}

java {
Expand Down Expand Up @@ -74,7 +75,7 @@ dependencies {
implementation "org.apache.logging.log4j:log4j-api:${log4j2Version}"
implementation "org.apache.logging.log4j:log4j-core:${log4j2Version}"
implementation "org.apache.logging.log4j:log4j-slf4j-impl:${log4j2Version}"
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16'
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

// xml내 한글 처리
implementation 'xerces:xercesImpl:2.12.2'
Expand Down Expand Up @@ -113,6 +114,27 @@ dependencies {
implementation 'org.flywaydb:flyway-core:10.19.0'
implementation 'org.flywaydb:flyway-mysql:10.19.0' // MySQL 8.4 지원

//KAFKA
implementation "org.springframework.kafka:spring-kafka:${springKafkaVersion}"

// 스프링 시큐리티
implementation 'org.springframework.security:spring-security-config:5.8.10'
implementation 'org.springframework.security:spring-security-web:5.8.10'
implementation 'org.springframework.security:spring-security-core:5.8.10'

// JWT (JJWT)
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// Redis (Lettuce 기반 클라이언트)
implementation 'org.springframework.data:spring-data-redis:2.7.18'
implementation 'io.lettuce:lettuce-core:6.3.1.RELEASE'

// Bean Validation (JSR-380)
implementation 'javax.validation:validation-api:2.0.1.Final'
implementation 'org.hibernate.validator:hibernate-validator:6.0.20.Final'
implementation 'org.glassfish:javax.el:3.0.0'

}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.scoula.domain.codef.controller;

import javax.servlet.http.HttpServletRequest;

import org.scoula.domain.codef.dto.request.StayExpirationRequest;
import org.scoula.domain.codef.dto.response.StayExpirationResponse;
import org.scoula.domain.codef.service.CodefApiClient;
import org.scoula.domain.codef.service.CodefAuthService;
import org.scoula.global.response.SuccessResponse;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.core.JsonProcessingException;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;

@Api(tags = "Codef API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/codef")
public class CodefController {

private final CodefAuthService codefAuthService;
private final CodefApiClient codefApiClient;

@ApiOperation(value = "Codef 토큰 발급 API", notes = "Codef 토큰을 발급한 후 레디스에 저장합니다.")
@PostMapping("/token")
public SuccessResponse<Void> getCodefToken(HttpServletRequest request) {
codefAuthService.issueCodefToken(request);
return SuccessResponse.noContent();
}

@ApiOperation(value = "Codef 체류 기간 조회 API", notes = "체류 기간을 조회합니다.")
@PostMapping("/stay")
public SuccessResponse<StayExpirationResponse> getCodef(
@RequestBody StayExpirationRequest stayExpirationRequest, HttpServletRequest request) throws
JsonProcessingException {
StayExpirationResponse stayExpiration = codefApiClient.getStayExpiration(stayExpirationRequest, request);
return SuccessResponse.ok(stayExpiration);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.scoula.domain.codef.dto.common;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel(description = "Codef API 공통 응답 구조")
public record CodefCommonResponse<T>(
@ApiModelProperty(notes = "API 호출 결과 상세", required = true)
CodefResult result,
@ApiModelProperty(notes = "API 상품별 데이터 페이로드")
T data
) {
}
17 changes: 17 additions & 0 deletions src/main/java/org/scoula/domain/codef/dto/common/CodefResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.scoula.domain.codef.dto.common;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel(description = "Codef API 공통 결과 응답 객체")
public record CodefResult(
@ApiModelProperty(notes = "API 호출 결과 코드", example = "CF-00000", required = true)
String code,
@ApiModelProperty(notes = "API 호출 결과 메시지", example = "성공", required = true)
String message,
@ApiModelProperty(notes = "API 호출 추가 메시지 (선택 사항)", example = "passportNo", required = false)
String extraMessage,
@ApiModelProperty(notes = "API 호출 트랜잭션 아이디", example = "f41d087dd6314", required = true)
String transactionId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.scoula.domain.codef.dto.request;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;

@ApiModel(description = "체류 만료 기간 조회 요청 객체")
@Builder
public record StayExpirationRequest(
@ApiModelProperty(notes = "기관코드 (고정 값 '0001')", example = "0001", required = true)
String organization,
@ApiModelProperty(notes = "여권번호", example = "E12345678", required = true)
String passportNo,
@ApiModelProperty(notes = "국적 코드 (0:러시아, 1:몽골, ..., 99:기타)", example = "2", required = true)
String nationality,
@ApiModelProperty(notes = "국적 '99'일 때 국가명", example = "가나", required = false)
String country,
@ApiModelProperty(notes = "생년월일 (YYYYMMDD)", example = "19900101", required = true)
String birthDate
) {
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.scoula.domain.codef.dto.response;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel(description = "Codef Access Token 응답 객체")
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public record CodefTokenResponse(
@ApiModelProperty(notes = "Access Token", example = "eyJhbGciOiJIUzI1Ni...", required = true)
String accessToken,
@ApiModelProperty(notes = "토큰 타입", example = "bearer", required = true)
String tokenType,
@ApiModelProperty(notes = "만료 시간", example = "3600", required = true)
Integer expiresIn,
@ApiModelProperty(notes = "스코프", example = "read", required = true)
String scope
) {
}
Loading
Loading