diff --git a/pom.xml b/pom.xml index 2d5ef13a..6d734d1e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,127 +1,133 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.3.0 - - - com.interplug - qcast - 0.0.1-SNAPSHOT - qcast - qcast - - 17 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-devtools - runtime - true - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-aop - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 3.0.3 - - - - - org.bgee.log4jdbc-log4j2 - log4jdbc-log4j2-jdbc4.1 - 1.16 - - - - - com.github.ulisesbocchio - jasypt-spring-boot-starter - 3.0.5 - - - - com.microsoft.sqlserver - mssql-jdbc - runtime - - - org.projectlombok - lombok - true - - - - org.springdoc - springdoc-openapi-starter-webmvc-ui - 2.6.0 - - - - - org.apache.commons - commons-lang3 - 3.16.0 - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.0 + + + com.interplug + qcast + 0.0.1-SNAPSHOT + qcast + qcast + + 17 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 3.0.3 + + + + + org.bgee.log4jdbc-log4j2 + log4jdbc-log4j2-jdbc4.1 + 1.16 + + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 3.0.5 + + + + com.microsoft.sqlserver + mssql-jdbc + runtime + + + org.projectlombok + lombok + true + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.6.0 + + + + + org.apache.commons + commons-lang3 + 3.16.0 + + + + + com.fasterxml.jackson.core + jackson-databind + 2.18.0-rc1 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/interplug/qcast/biz/login/LoginController.java b/src/main/java/com/interplug/qcast/biz/login/LoginController.java index 90b60ee2..77ff4313 100644 --- a/src/main/java/com/interplug/qcast/biz/login/LoginController.java +++ b/src/main/java/com/interplug/qcast/biz/login/LoginController.java @@ -1,34 +1,58 @@ -package com.interplug.qcast.biz.login; - -import com.interplug.qcast.biz.login.dto.LoginUser; -import com.interplug.qcast.biz.login.dto.UserResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; - -@Slf4j -@RestController -@RequestMapping("/api/login") -@RequiredArgsConstructor -public class LoginController { - // @Autowired private LoginService loginService; - private final LoginService loginService; - - @PostMapping("/v1.0/login") - @ResponseStatus(HttpStatus.OK) - public void login(@RequestBody LoginUser loginUser) { - log.warn(String.valueOf(log.isDebugEnabled())); - if (log.isDebugEnabled()) { - log.debug("Login username : " + loginUser.getUsername()); - log.debug("Login password : " + loginUser.getPassword()); - log.debug("isLogin : " + loginService.getLogin(loginUser)); - } - } - - @PostMapping("/v1.0/user") - @ResponseStatus(HttpStatus.CREATED) - public UserResponse getUser(@RequestBody LoginUser loginUser) { - return loginService.getUser(loginUser); - } -} +package com.interplug.qcast.biz.login; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PatchMapping; +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.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; +import com.interplug.qcast.biz.login.dto.JoinUser; +import com.interplug.qcast.biz.login.dto.LoginUser; +import com.interplug.qcast.biz.login.dto.UserLoginResponse; +import com.interplug.qcast.biz.login.dto.UserPassword; +import com.interplug.qcast.biz.login.dto.UserResponse; +import com.interplug.qcast.util.DefaultResponse; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequestMapping("/api/login") +@RequiredArgsConstructor +public class LoginController { + // @Autowired private LoginService loginService; + private final LoginService loginService; + + @Operation(description = "Q.CAST III에 로그인하여 사용자 정보를 획득한다.") + @PostMapping("/v1.0/login") + public UserLoginResponse login(@RequestBody LoginUser loginUser) throws Exception { + return loginService.getLogin(loginUser); + } + + @PostMapping("/v1.0/user") + @ResponseStatus(HttpStatus.CREATED) + public UserResponse getUser(@RequestBody LoginUser loginUser) { + return loginService.getUser(loginUser); + } + + @Operation(description = "가입 신청 정보를 등록한다.") + @PostMapping("/v1.0/user/join") + @ResponseStatus(HttpStatus.CREATED) + public DefaultResponse joinUser(@RequestBody JoinUser joinUser) throws Exception { + return loginService.joinUser(joinUser); + } + + @Operation(description = "비밀번호를 초기화한다.") + @PatchMapping("/v1.0/user/init-password") + public DefaultResponse initPassword(@RequestBody UserPassword userPassword) throws Exception { + return loginService.initPassword(userPassword); + } + + @Operation(description = "비밀번호를 변경한다.") + @PatchMapping("/v1.0/user/change-password") + public DefaultResponse changePassword(@RequestBody UserPassword userPassword) throws Exception { + return loginService.changePassword(userPassword); + } +} diff --git a/src/main/java/com/interplug/qcast/biz/login/LoginService.java b/src/main/java/com/interplug/qcast/biz/login/LoginService.java index c6824de4..1ece5434 100644 --- a/src/main/java/com/interplug/qcast/biz/login/LoginService.java +++ b/src/main/java/com/interplug/qcast/biz/login/LoginService.java @@ -1,24 +1,200 @@ -package com.interplug.qcast.biz.login; - -import com.interplug.qcast.biz.login.dto.LoginUser; -import com.interplug.qcast.biz.login.dto.UserResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Slf4j -@Service -@RequiredArgsConstructor -public class LoginService { - // @Autowired LoginMapper loginMapper; - private final LoginMapper loginMapper; - - public boolean getLogin(LoginUser loginUser) { - return loginMapper.getLogin(loginUser); - } - - public UserResponse getUser(LoginUser loginUser) { - log.info("Build Test"); - return loginMapper.getUser(loginUser); - } -} +package com.interplug.qcast.biz.login; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.interplug.qcast.biz.login.dto.JoinUser; +import com.interplug.qcast.biz.login.dto.LoginUser; +import com.interplug.qcast.biz.login.dto.UserLoginResponse; +import com.interplug.qcast.biz.login.dto.UserPassword; +import com.interplug.qcast.biz.login.dto.UserResponse; +import com.interplug.qcast.util.DefaultResponse; +import com.interplug.qcast.util.InterfaceQsp; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class LoginService { + // @Autowired LoginMapper loginMapper; + private final LoginMapper loginMapper; + private final InterfaceQsp interfaceQsp; + + @Value("${qsp.url}") + private String qspUrl; + + // 로그인 처리 + public UserLoginResponse getLogin(LoginUser loginUser) throws Exception { + if (loginUser == null) + throw new IllegalArgumentException("DTO 설정이 필요합니다."); + + if (loginUser.getLangCd() == null || "".equals(loginUser.getLangCd())) + throw new IllegalArgumentException("Language Code" + "은(는) 필수값입니다."); + + if (loginUser.getLastEditUser() == null || "".equals(loginUser.getLastEditUser())) + throw new IllegalArgumentException("Last Edit User Id" + "은(는) 필수값입니다."); + + if (loginUser.getLoginId() == null || "".equals(loginUser.getLoginId())) + throw new IllegalArgumentException("Login Id" + "은(는) 필수값입니다."); + + if (loginUser.getPwd() == null || "".equals(loginUser.getPwd())) + throw new IllegalArgumentException("Password" + "은(는) 필수값입니다."); + + UserLoginResponse userLoginResponse = null; + + // QSP API Call.. + // Q.CAST 로그인 + // post + // /api/user/login + String strResponse = + interfaceQsp.callApi(HttpMethod.POST, qspUrl + "/api/user/login", loginUser); + if (!"".equals(strResponse)) { + ObjectMapper om = + new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + userLoginResponse = om.readValue(strResponse, UserLoginResponse.class); + } + + return userLoginResponse; + } + + public UserResponse getUser(LoginUser loginUser) { + log.info("Build Test"); + return loginMapper.getUser(loginUser); + } + + // 가입 신청 등록 + public DefaultResponse joinUser(JoinUser joinUser) throws Exception { + if (joinUser == null) + throw new IllegalArgumentException("DTO 설정이 필요합니다."); + + if (joinUser.getLangCd() == null || "".equals(joinUser.getLangCd())) + throw new IllegalArgumentException("Language Code" + "은(는) 필수값입니다."); + + if (joinUser.getLastEditUser() == null || "".equals(joinUser.getLastEditUser())) + throw new IllegalArgumentException("Last Edit User Id" + "은(는) 필수값입니다."); + + if (joinUser.getStoreQcastNm() == null || "".equals(joinUser.getStoreQcastNm())) + throw new IllegalArgumentException("Store QCast Name" + "은(는) 필수값입니다."); + + if (joinUser.getStoreQcastNmKana() == null || "".equals(joinUser.getStoreQcastNmKana())) + throw new IllegalArgumentException("Store QCast Name Kana" + "은(는) 필수값입니다."); + + if (joinUser.getPostCd() == null || "".equals(joinUser.getPostCd())) + throw new IllegalArgumentException("Postal Code" + "은(는) 필수값입니다."); + + if (joinUser.getAddr() == null || "".equals(joinUser.getAddr())) + throw new IllegalArgumentException("Address" + "은(는) 필수값입니다."); + + if (joinUser.getTelNo() == null || "".equals(joinUser.getTelNo())) + throw new IllegalArgumentException("Telephone" + "은(는) 필수값입니다."); + + if (joinUser.getFax() == null || "".equals(joinUser.getFax())) + throw new IllegalArgumentException("Fax" + "은(는) 필수값입니다."); + + if (joinUser.getUserInfo() == null) + throw new IllegalArgumentException("사용자 정보 DTO 설정이 필요합니다."); + + if (joinUser.getUserInfo().getUserId() == null || "".equals(joinUser.getUserInfo().getUserId())) + throw new IllegalArgumentException("User Id" + "은(는) 필수값입니다."); + + if (joinUser.getUserInfo().getUserNm() == null || "".equals(joinUser.getUserInfo().getUserNm())) + throw new IllegalArgumentException("Name" + "은(는) 필수값입니다."); + + if (joinUser.getUserInfo().getUserNmKana() == null + || "".equals(joinUser.getUserInfo().getUserNmKana())) + throw new IllegalArgumentException("Name_Kana" + "은(는) 필수값입니다."); + + if (joinUser.getUserInfo().getTelNo() == null || "".equals(joinUser.getUserInfo().getTelNo())) + throw new IllegalArgumentException("Telephone" + "은(는) 필수값입니다."); + + if (joinUser.getUserInfo().getFax() == null || "".equals(joinUser.getUserInfo().getFax())) + throw new IllegalArgumentException("Fax" + "은(는) 필수값입니다."); + + if (joinUser.getUserInfo().getEmail() == null || "".equals(joinUser.getUserInfo().getEmail())) + throw new IllegalArgumentException("E-Mail" + "은(는) 필수값입니다."); + + // QSP API Call.. + // Q.CAST 신규 사용자 요청 + // post + // /api/user/newUserIdReq + DefaultResponse defaultResponse = null; + String strResponse = + interfaceQsp.callApi(HttpMethod.POST, qspUrl + "/api/user/newUserIdReq", joinUser); + if (!"".equals(strResponse)) { + ObjectMapper om = + new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + defaultResponse = om.readValue(strResponse, DefaultResponse.class); + } + + return defaultResponse; + } + + // 비밀번호 초기화 + public DefaultResponse initPassword(UserPassword userPassword) throws Exception { + if (userPassword == null) + throw new IllegalArgumentException("DTO 설정이 필요합니다."); + + if (userPassword.getLangCd() == null || "".equals(userPassword.getLangCd())) + throw new IllegalArgumentException("Language Code" + "은(는) 필수값입니다."); + + if (userPassword.getLastEditUser() == null || "".equals(userPassword.getLastEditUser())) + throw new IllegalArgumentException("Last Edit User Id" + "은(는) 필수값입니다."); + + if (userPassword.getLoginId() == null || "".equals(userPassword.getLoginId())) + throw new IllegalArgumentException("Login Id" + "은(는) 필수값입니다."); + + if (userPassword.getEmail() == null || "".equals(userPassword.getEmail())) + throw new IllegalArgumentException("E-Mail" + "은(는) 필수값입니다."); + + // QSP API Call.. + // Q.CAST 비밀번호 초기화 + // post + // /api/user/initUserPwd + DefaultResponse defaultResponse = null; + String strResponse = + interfaceQsp.callApi(HttpMethod.POST, qspUrl + "/api/user/initUserPwd", userPassword); + if (!"".equals(strResponse)) { + ObjectMapper om = + new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + defaultResponse = om.readValue(strResponse, DefaultResponse.class); + } + + return defaultResponse; + } + + // 비밀번호 변경 + public DefaultResponse changePassword(UserPassword userPassword) throws Exception { + if (userPassword == null) + throw new IllegalArgumentException("DTO 설정이 필요합니다."); + + if (userPassword.getLangCd() == null || "".equals(userPassword.getLangCd())) + throw new IllegalArgumentException("Language Code" + "은(는) 필수값입니다."); + + if (userPassword.getLastEditUser() == null || "".equals(userPassword.getLastEditUser())) + throw new IllegalArgumentException("Last Edit User Id" + "은(는) 필수값입니다."); + + if (userPassword.getPwd() == null || "".equals(userPassword.getPwd())) + throw new IllegalArgumentException("Now Password" + "은(는) 필수값입니다."); + + if (userPassword.getChgPwd() == null || "".equals(userPassword.getChgPwd())) + throw new IllegalArgumentException("Change Password" + "은(는) 필수값입니다."); + + // QSP API Call.. + // Q.CAST 비밀번호 변경 + // post + // /api/user/userPwdChg + DefaultResponse defaultResponse = null; + String strResponse = + interfaceQsp.callApi(HttpMethod.POST, qspUrl + "/api/user/userPwdChg", userPassword); + if (!"".equals(strResponse)) { + ObjectMapper om = + new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + defaultResponse = om.readValue(strResponse, DefaultResponse.class); + } + + return defaultResponse; + } +} diff --git a/src/main/java/com/interplug/qcast/biz/login/dto/JoinUser.java b/src/main/java/com/interplug/qcast/biz/login/dto/JoinUser.java new file mode 100644 index 00000000..ee4bb49a --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/login/dto/JoinUser.java @@ -0,0 +1,26 @@ +package com.interplug.qcast.biz.login.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class JoinUser { + private String langCd; // Language Code + private String lastEditUser; // Last Edit User Id + private String storeQcastNm; // Store QCast Name + private String storeQcastNmKana; // Store QCast Name Kana + private String postCd; // Postal Code + private String addr; // Address + private String telNo; // Telephone + private String fax; // Fax + private String payTermsCd; // Pay Terms Code + private String kamId; // Kam Id + private String qtCompNm; // Quotation Company name + private String qtPostCd; // Quotation Postal Code + private String qtAddr; // Quotation Address + private String qtTelNo; // Quotation Telephone + private String qtFax; // Quotation Fax + private String qtEmail; // Quotation E-Mail + private UserInfo userInfo; // user information +} diff --git a/src/main/java/com/interplug/qcast/biz/login/dto/LoginUser.java b/src/main/java/com/interplug/qcast/biz/login/dto/LoginUser.java index a0c05120..d78ec590 100644 --- a/src/main/java/com/interplug/qcast/biz/login/dto/LoginUser.java +++ b/src/main/java/com/interplug/qcast/biz/login/dto/LoginUser.java @@ -1,9 +1,11 @@ -package com.interplug.qcast.biz.login.dto; - -import lombok.Data; - -@Data -public class LoginUser { - private String username; - private String password; -} +package com.interplug.qcast.biz.login.dto; + +import lombok.Data; + +@Data +public class LoginUser { + private String langCd; // Language Code + private String lastEditUser; // Last Edit User Id + private String loginId; // Login Id + private String pwd; // Password +} diff --git a/src/main/java/com/interplug/qcast/biz/login/dto/UserInfo.java b/src/main/java/com/interplug/qcast/biz/login/dto/UserInfo.java new file mode 100644 index 00000000..8ae1f309 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/login/dto/UserInfo.java @@ -0,0 +1,16 @@ +package com.interplug.qcast.biz.login.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserInfo { + private String userId; // User Id + private String userNm; // Name + private String userNmKana; // Name_Kana + private String telNo; // Telephone + private String fax; // Fax + private String email; // E-Mail + private String category; // Category +} diff --git a/src/main/java/com/interplug/qcast/biz/login/dto/UserLoginResponse.java b/src/main/java/com/interplug/qcast/biz/login/dto/UserLoginResponse.java new file mode 100644 index 00000000..52cf8d1e --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/login/dto/UserLoginResponse.java @@ -0,0 +1,11 @@ +package com.interplug.qcast.biz.login.dto; + +import com.interplug.qcast.util.DefaultResponse; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserLoginResponse extends DefaultResponse { + private UserResponse data; +} diff --git a/src/main/java/com/interplug/qcast/biz/login/dto/UserPassword.java b/src/main/java/com/interplug/qcast/biz/login/dto/UserPassword.java new file mode 100644 index 00000000..4cef1900 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/login/dto/UserPassword.java @@ -0,0 +1,15 @@ +package com.interplug.qcast.biz.login.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserPassword { + private String langCd; // Language Code + private String lastEditUser; // Last Edit User Id + private String loginId; // Login Id + private String email; // Email + private String pwd; // Now Password + private String chgPwd; // Change Password +} diff --git a/src/main/java/com/interplug/qcast/biz/login/dto/UserResponse.java b/src/main/java/com/interplug/qcast/biz/login/dto/UserResponse.java index 8bb3f9a0..e17ae25f 100644 --- a/src/main/java/com/interplug/qcast/biz/login/dto/UserResponse.java +++ b/src/main/java/com/interplug/qcast/biz/login/dto/UserResponse.java @@ -1,15 +1,26 @@ -package com.interplug.qcast.biz.login.dto; - -import lombok.Getter; -import lombok.Setter; - -//@Data -@Getter -@Setter -public class UserResponse { - private String userId; - private String saleStoreId; - private String name; - private String mail; - private String tel; -} +package com.interplug.qcast.biz.login.dto; + +import lombok.Getter; +import lombok.Setter; + +// @Data +@Getter +@Setter +public class UserResponse { + private String userId; + private String saleStoreId; + private String name; + private String mail; + private String tel; + + private String storeId; // Store Id + // private String userId; // User Id + private String userNm; // Name + private String userNmKana; // Name_Kana + private String category; // Category + private String telNo; // Telephone + private String fax; // Fax + private String email; // E-Mail + private String pwdInitYn; // Password Init Yn + +} diff --git a/src/main/java/com/interplug/qcast/util/DefaultResponse.java b/src/main/java/com/interplug/qcast/util/DefaultResponse.java new file mode 100644 index 00000000..7f1c66fa --- /dev/null +++ b/src/main/java/com/interplug/qcast/util/DefaultResponse.java @@ -0,0 +1,10 @@ +package com.interplug.qcast.util; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class DefaultResponse { + private DefaultResponseResult result; +} diff --git a/src/main/java/com/interplug/qcast/util/DefaultResponseResult.java b/src/main/java/com/interplug/qcast/util/DefaultResponseResult.java new file mode 100644 index 00000000..b075dbfc --- /dev/null +++ b/src/main/java/com/interplug/qcast/util/DefaultResponseResult.java @@ -0,0 +1,13 @@ +package com.interplug.qcast.util; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class DefaultResponseResult { + private int code; // Result Code(success : 200, error : 400) + private String message; // Result Message + private String resultCode; // Result Code2(success : S, error : E) + private String resultMsg; // Result Message2 +} diff --git a/src/main/java/com/interplug/qcast/util/InterfaceQsp.java b/src/main/java/com/interplug/qcast/util/InterfaceQsp.java new file mode 100644 index 00000000..26bee66e --- /dev/null +++ b/src/main/java/com/interplug/qcast/util/InterfaceQsp.java @@ -0,0 +1,76 @@ +package com.interplug.qcast.util; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@RequiredArgsConstructor +public class InterfaceQsp { + /** + * API Call + * + * @param apiPath + * @param requestObject + * @return String + * @throws Exception + */ + public String callApi(HttpMethod httpMethod, String apiPath, Object requestObject) + throws Exception { + + URL url = null; + HttpURLConnection con = null; + OutputStreamWriter osw = null; + BufferedReader br = null; + StringBuilder sb = null; + + try { + url = new URL(apiPath); + con = (HttpURLConnection) url.openConnection(); + con.setConnectTimeout(5000); // 서버에 연결되는 Timeout 시간 설정 + con.setReadTimeout(5000); // InputStream 읽어 오는 Timeout 시간 설정 + con.setRequestMethod(httpMethod.toString()); + con.setRequestProperty("Content-Type", "application/json"); + con.setDoInput(true); + con.setDoOutput(true); // POST 데이터를 OutputStream으로 넘겨 주겠다는 설정 + con.setUseCaches(false); + con.setDefaultUseCaches(false); + + ObjectMapper om = new ObjectMapper(); + osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(om.writeValueAsString(requestObject)); // json 형식의 message 전달 + osw.flush(); + + sb = new StringBuilder(); + if (con.getResponseCode() == HttpURLConnection.HTTP_OK) { + br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8")); + + String line; + while ((line = br.readLine()) != null) { + sb.append(line); + } + } + } catch (Exception e) { + throw e; + } finally { + try { + if (osw != null) + osw.close(); + if (br != null) + br.close(); + } catch (Exception e) { + throw e; + } + } + + return sb != null ? sb.toString() : null; + } +} diff --git a/src/main/java/com/interplug/qcast/util/ZipFileManager.java b/src/main/java/com/interplug/qcast/util/ZipFileManager.java new file mode 100644 index 00000000..9cbce912 --- /dev/null +++ b/src/main/java/com/interplug/qcast/util/ZipFileManager.java @@ -0,0 +1,86 @@ +package com.interplug.qcast.util; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import org.springframework.stereotype.Component; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ZipFileManager { + + /** + * zip file을 생성하여 ZipOutputStream를 반환하는 method + * + * @param response HttpServletResponse + * @param strCreateFileName 생성할 file 이름 + * @param listFilePath 파일 경로 목록 + */ + public void createZipFile(HttpServletResponse response, String strCreateFileName, + List listFilePath) throws Exception { + // 압축될 파일명이 존재하지 않을 경우 + if (strCreateFileName == null || "".equals(strCreateFileName)) + throw new IllegalArgumentException("파일명이 존재하지 않습니다."); + + // 파일이 존재하지 않을 경우 + if (listFilePath == null || listFilePath.size() == 0) + throw new IllegalArgumentException("파일이 존재하지 않습니다."); + + // zip 파일명 + String strZipName = strCreateFileName + ".zip"; + + // response 설정 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=" + strZipName + ";"); + response.setStatus(HttpServletResponse.SC_OK); + + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + for (String strSourceFile : listFilePath) { + Path path = Path.of(strSourceFile); + + try (FileInputStream fis = new FileInputStream(path.toFile())) { + // 압축될 파일명을 ZipEntry에 담아준다 + ZipEntry zipEntry = new ZipEntry(path.getFileName().toString()); + + // 압축될 파일명을 ZipOutputStream 에 담아준다 + zos.putNextEntry(zipEntry); + byte[] buffer = new byte[1024]; + int length; + + while ((length = fis.read(buffer)) >= 0) { + zos.write(buffer, 0, length); + } + } catch (FileNotFoundException e) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + throw new IllegalArgumentException("파일 변환 작업중, [ " + strZipName + " ] 파일을 찾을 수 없습니다."); + } catch (IOException e) { + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + throw new IllegalArgumentException( + "파일 변환 작업중, [ " + strZipName + " ] 파일을 다운로드 할 수 없습니다."); + } finally { + // ZipOutputStream 에 담아둔 압축될 파일명을 flush 시켜준다 + zos.flush(); + // ZipOutputStream 에 담아둔 압축될 파일명을 close 시켜준다 + zos.closeEntry(); + } + } + } catch (Exception e) { + throw e; + } finally { + try { + // response 에 담아둔 파일을 flush 시켜준다 + response.flushBuffer(); + } catch (IOException e) { + throw e; + } + } + } +} diff --git a/src/main/resources/config/application-dev.yml b/src/main/resources/config/application-dev.yml index e14b16b1..83559155 100644 --- a/src/main/resources/config/application-dev.yml +++ b/src/main/resources/config/application-dev.yml @@ -1,24 +1,28 @@ -#server -server: - port: 8080 - -#spring -spring: - datasource: - datasource: - master: - driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true - username: pvDBuser - password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) - maximum-pool-size: 4 - pool-name: Master-HikariPool - read: - driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true - username: pvDBuser - password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) - maximum-pool-size: 4 - pool-name: Read-HikariPool - jackson: - time-zone: Asia/Seoul \ No newline at end of file +#server +server: + port: 8080 + +#spring +spring: + datasource: + datasource: + master: + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy + jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true + username: pvDBuser + password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) + maximum-pool-size: 4 + pool-name: Master-HikariPool + read: + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy + jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true + username: pvDBuser + password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) + maximum-pool-size: 4 + pool-name: Read-HikariPool + jackson: + time-zone: Asia/Seoul + +#QSP +qsp: + url: http://172.23.4.129:8120 diff --git a/src/main/resources/config/application-local.yml b/src/main/resources/config/application-local.yml index ef07cd0b..5b7d4bf9 100644 --- a/src/main/resources/config/application-local.yml +++ b/src/main/resources/config/application-local.yml @@ -1,25 +1,28 @@ -#server -server: - port: 8080 - -#spring -spring: - datasource: - datasource: - master: - driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true - username: pvDBuser - password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) - maximum-pool-size: 4 - pool-name: Master-HikariPool - read: - driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true - username: pvDBuser - password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) - maximum-pool-size: 4 - pool-name: Read-HikariPool - jackson: - time-zone: Asia/Seoul - +#server +server: + port: 8080 + +#spring +spring: + datasource: + datasource: + master: + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy + jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true + username: pvDBuser + password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) + maximum-pool-size: 4 + pool-name: Master-HikariPool + read: + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy + jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true + username: pvDBuser + password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) + maximum-pool-size: 4 + pool-name: Read-HikariPool + jackson: + time-zone: Asia/Seoul + +#QSP +qsp: + url: http://localhost:8120 diff --git a/src/main/resources/config/application-prd.yml b/src/main/resources/config/application-prd.yml index a3b56077..c148d027 100644 --- a/src/main/resources/config/application-prd.yml +++ b/src/main/resources/config/application-prd.yml @@ -1,24 +1,28 @@ -#server -server: - port: 80 - -#spring -spring: - datasource: - datasource: - master: - driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true - username: pvDBuser - password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) - maximum-pool-size: 4 - pool-name: Master-HikariPool - read: - driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true - username: pvDBuser - password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) - maximum-pool-size: 4 - pool-name: Read-HikariPool - jackson: - time-zone: Asia/Seoul \ No newline at end of file +#server +server: + port: 80 + +#spring +spring: + datasource: + datasource: + master: + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy + jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true + username: pvDBuser + password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) + maximum-pool-size: 4 + pool-name: Master-HikariPool + read: + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy + jdbc-url: jdbc:log4jdbc:sqlserver://1.248.227.176:1433;databaseName=NEWPVCAD;encrypt=true;trustServerCertificate=true + username: pvDBuser + password: ENC(W7owprYnvf7vqwO6Piw4dHfVBCSxE4Ck) + maximum-pool-size: 4 + pool-name: Read-HikariPool + jackson: + time-zone: Asia/Seoul + +#QSP +qsp: + url: http://jp.qsalesplatform.com