From 1fee2d25000198ec6cb11bf518e59c4b147ec617 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Wed, 10 Dec 2025 15:49:48 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EA=B3=B5=ED=86=B5=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EC=A0=95=EB=B3=B4=20=EC=BB=AC=EB=9F=BC=20?= =?UTF-8?q?=ED=8A=B9=EC=88=98=EB=AC=B8=EC=9E=90=20=EB=B3=80=ED=99=98=20ser?= =?UTF-8?q?ializer=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/kamcoback/code/dto/CommonCodeDto.java | 19 ++++++++++++++++++ .../utils/html/HtmlEscapeDeserializer.java | 20 +++++++++++++++++++ .../utils/html/HtmlUnescapeSerializer.java | 20 +++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.java diff --git a/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java b/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java index 2071af47..3827603b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java @@ -1,5 +1,9 @@ package com.kamco.cd.kamcoback.code.dto; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.kamco.cd.kamcoback.common.utils.html.HtmlEscapeDeserializer; +import com.kamco.cd.kamcoback.common.utils.html.HtmlUnescapeSerializer; import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; @@ -27,8 +31,13 @@ public class CommonCodeDto { private boolean used; private Long parentId; + @JsonDeserialize(using = HtmlEscapeDeserializer.class) private String props1; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) private String props2; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) private String props3; } @@ -42,8 +51,13 @@ public class CommonCodeDto { private String description; private boolean used; + @JsonDeserialize(using = HtmlEscapeDeserializer.class) private String props1; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) private String props2; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) private String props3; } @@ -83,8 +97,13 @@ public class CommonCodeDto { @JsonFormatDttm private ZonedDateTime updatedDttm; + @JsonSerialize(using = HtmlUnescapeSerializer.class) private String props1; + + @JsonSerialize(using = HtmlUnescapeSerializer.class) private String props2; + + @JsonSerialize(using = HtmlUnescapeSerializer.class) private String props3; @JsonFormatDttm private ZonedDateTime deletedDttm; diff --git a/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.java b/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.java new file mode 100644 index 00000000..7496a2d8 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.common.utils.html; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import java.io.IOException; +import org.springframework.web.util.HtmlUtils; + +public class HtmlEscapeDeserializer extends JsonDeserializer { + + @Override + public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JacksonException { + String value = jsonParser.getValueAsString(); + System.out.println("πŸ”₯ HtmlEscapeDeserializer 싀행됨: " + value); + System.out.println("convert : " + (value == null ? null : HtmlUtils.htmlEscape(value))); + return value == null ? null : HtmlUtils.htmlEscape(value); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.java b/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.java new file mode 100644 index 00000000..181a0eff --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.common.utils.html; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import java.io.IOException; +import org.springframework.web.util.HtmlUtils; + +public class HtmlUnescapeSerializer extends JsonSerializer { + @Override + public void serialize( + String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) + throws IOException { + if (value == null) { + jsonGenerator.writeNull(); + } else { + jsonGenerator.writeString(HtmlUtils.htmlUnescape(value)); + } + } +} From 0fb715c3ed0e6c82b5aca5e2f47a3f6d748f1853 Mon Sep 17 00:00:00 2001 From: teddy Date: Wed, 10 Dec 2025 15:50:48 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=ED=86=A0=ED=81=B0=20response=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/kamcoback/config/SecurityConfig.java | 33 ++- .../cd/kamcoback/members/AuthController.java | 6 +- .../kamcoback/members/dto/SignInRequest.java | 2 +- .../members/service/MembersService.java | 54 +++-- .../members/MembersRepositoryCustom.java | 15 +- .../members/MembersRepositoryImpl.java | 198 +++++++----------- .../members/MembersRoleRepository.java | 7 - .../members/MembersRoleRepositoryCutom.java | 8 - .../members/MembersRoleRepositoryImpl.java | 30 --- 9 files changed, 132 insertions(+), 221 deletions(-) delete mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepository.java delete mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepositoryCutom.java delete mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepositoryImpl.java diff --git a/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java b/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java index b7fdcbf2..132c053d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java @@ -6,14 +6,12 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @@ -41,21 +39,22 @@ public class SecurityConfig { .authenticationProvider( customAuthenticationProvider) // 둜그인 νŒ¨μŠ€μ›Œλ“œ 비ꡐ방식 μŠ€ν”„λ§ κΈ°λ³Έ Provider μ‚¬μš©μ•ˆν•¨ μ»€μŠ€ν…€ μ‚¬μš© .authorizeHttpRequests( - auth -> - auth.requestMatchers(HttpMethod.OPTIONS, "/**") - .permitAll() // preflight ν—ˆμš© - .requestMatchers( - "/api/auth/signin", - "/api/auth/refresh", - "/swagger-ui/**", - "/v3/api-docs/**") - .permitAll() - .anyRequest() - .authenticated()) - .addFilterBefore( - jwtAuthenticationFilter, - UsernamePasswordAuthenticationFilter - .class) // μš”μ²­ λ“€μ–΄μ˜€λ©΄ λ¨Όμ € JWT 토큰 검사 ν›„ security context 에 μ‚¬μš©μž 정보 μ €μž₯. + auth -> auth.anyRequest().permitAll() + // .requestMatchers(HttpMethod.OPTIONS, "/**") + // .permitAll() // preflight ν—ˆμš© + // .requestMatchers( + // "/api/auth/signin", + // "/api/auth/refresh", + // "/swagger-ui/**", + // "/v3/api-docs/**") + // .permitAll() + // .anyRequest() + // .authenticated() + ) + // .addFilterBefore( + // jwtAuthenticationFilter, + // UsernamePasswordAuthenticationFilter + // .class) // μš”μ²­ λ“€μ–΄μ˜€λ©΄ λ¨Όμ € JWT 토큰 검사 ν›„ security context 에 μ‚¬μš©μž 정보 μ €μž₯. ; return http.build(); diff --git a/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java b/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java index f76ebf0e..2fe356b8 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java @@ -86,7 +86,7 @@ public class AuthController { .build(); response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString()); - return ApiResponseDto.ok(new TokenResponse(accessToken)); + return ApiResponseDto.ok(new TokenResponse(accessToken, refreshToken)); } @PostMapping("/refresh") @@ -133,7 +133,7 @@ public class AuthController { .build(); response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString()); - return ResponseEntity.ok(new TokenResponse(newAccessToken)); + return ResponseEntity.ok(new TokenResponse(newAccessToken, newRefreshToken)); } @PostMapping("/logout") @@ -166,5 +166,5 @@ public class AuthController { return ApiResponseDto.createOK(ResponseEntity.noContent().build()); } - public record TokenResponse(String accessToken) {} + public record TokenResponse(String accessToken, String refreshToken) {} } diff --git a/src/main/java/com/kamco/cd/kamcoback/members/dto/SignInRequest.java b/src/main/java/com/kamco/cd/kamcoback/members/dto/SignInRequest.java index d6c802be..a13992b3 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/dto/SignInRequest.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/dto/SignInRequest.java @@ -11,7 +11,7 @@ import lombok.ToString; @ToString(exclude = "password") public class SignInRequest { - @Schema(description = "μ‚¬λ²ˆ", example = "11111") + @Schema(description = "μ‚¬μš©μž ID", example = "admin") private String username; @Schema(description = "λΉ„λ°€λ²ˆν˜Έ", example = "kamco1234!") diff --git a/src/main/java/com/kamco/cd/kamcoback/members/service/MembersService.java b/src/main/java/com/kamco/cd/kamcoback/members/service/MembersService.java index 383097bd..fe85e06c 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/service/MembersService.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/service/MembersService.java @@ -1,17 +1,11 @@ package com.kamco.cd.kamcoback.members.service; -import com.kamco.cd.kamcoback.auth.BCryptSaltGenerator; -import com.kamco.cd.kamcoback.common.exception.CustomApiException; import com.kamco.cd.kamcoback.members.dto.MembersDto; import com.kamco.cd.kamcoback.members.dto.MembersDto.Basic; import com.kamco.cd.kamcoback.postgres.core.MembersCoreService; -import java.util.UUID; import java.util.regex.Pattern; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.mindrot.jbcrypt.BCrypt; import org.springframework.data.domain.Page; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,7 +23,7 @@ public class MembersService { * @return */ public Page findByMembers(MembersDto.SearchReq searchReq) { - return membersCoreService.findByMembers(searchReq); + return null; // membersCoreService.findByMembers(searchReq); } /** @@ -38,29 +32,29 @@ public class MembersService { * @param uuid * @param updateReq */ - public void updateMember(UUID uuid, MembersDto.UpdateReq updateReq) { - - if (StringUtils.isNotBlank(updateReq.getPassword())) { - - if (!this.isValidPassword(updateReq.getPassword())) { - throw new CustomApiException("WRONG_PASSWORD", HttpStatus.BAD_REQUEST); - } - - if (StringUtils.isBlank(updateReq.getEmployeeNo())) { - throw new CustomApiException("BAD_REQUEST", HttpStatus.BAD_REQUEST); - } - - // salt 생성, μ‚¬λ²ˆμ΄ salt - String salt = - BCryptSaltGenerator.generateSaltWithEmployeeNo(updateReq.getEmployeeNo().trim()); - - // νŒ¨μŠ€μ›Œλ“œ μ•”ν˜Έν™”, 초기 νŒ¨μŠ€μ›Œλ“œ κ³ μ • - String hashedPassword = BCrypt.hashpw(updateReq.getPassword(), salt); - updateReq.setPassword(hashedPassword); - } - - membersCoreService.updateMembers(uuid, updateReq); - } + // public void updateMember(UUID uuid, MembersDto.UpdateReq updateReq) { + // + // if (StringUtils.isNotBlank(updateReq.getPassword())) { + // + // if (!this.isValidPassword(updateReq.getPassword())) { + // throw new CustomApiException("WRONG_PASSWORD", HttpStatus.BAD_REQUEST); + // } + // + // if (StringUtils.isBlank(updateReq.getEmployeeNo())) { + // throw new CustomApiException("BAD_REQUEST", HttpStatus.BAD_REQUEST); + // } + // + // // salt 생성, μ‚¬λ²ˆμ΄ salt + // String salt = + // BCryptSaltGenerator.generateSaltWithEmployeeNo(updateReq.getEmployeeNo().trim()); + // + // // νŒ¨μŠ€μ›Œλ“œ μ•”ν˜Έν™”, 초기 νŒ¨μŠ€μ›Œλ“œ κ³ μ • + // String hashedPassword = BCrypt.hashpw(updateReq.getPassword(), salt); + // updateReq.setPassword(hashedPassword); + // } + // + // membersCoreService.updateMembers(uuid, updateReq); + // } /** * λŒ€λ¬Έμž 1개 이상 μ†Œλ¬Έμž 1개 이상 숫자 1개 이상 특수문자(!@#$) 1개 이상 diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRepositoryCustom.java index 6b6cecc8..17f9ee43 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRepositoryCustom.java @@ -1,21 +1,20 @@ package com.kamco.cd.kamcoback.postgres.repository.members; -import com.kamco.cd.kamcoback.members.dto.MembersDto; -import com.kamco.cd.kamcoback.members.dto.MembersDto.Basic; import com.kamco.cd.kamcoback.postgres.entity.MemberEntity; import java.util.Optional; import java.util.UUID; -import org.springframework.data.domain.Page; public interface MembersRepositoryCustom { - boolean existsByEmployeeNo(String employeeNo); + boolean existsByUserId(String userId); - boolean existsByEmail(String email); - - Page findByMembers(MembersDto.SearchReq searchReq); + Optional findByUserId(String employeeNo); Optional findByUUID(UUID uuid); + // + // Page findByMembers(MembersDto.SearchReq searchReq); + // - Optional findByEmployeeNo(String employeeNo); + // + // Optional findByEmployeeNo(String employeeNo); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRepositoryImpl.java index 8ab7e713..c428c639 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRepositoryImpl.java @@ -1,23 +1,11 @@ package com.kamco.cd.kamcoback.postgres.repository.members; -import com.kamco.cd.kamcoback.common.enums.RoleType; -import com.kamco.cd.kamcoback.members.dto.MembersDto; -import com.kamco.cd.kamcoback.members.dto.MembersDto.Basic; import com.kamco.cd.kamcoback.postgres.entity.MemberEntity; import com.kamco.cd.kamcoback.postgres.entity.QMemberEntity; -import com.kamco.cd.kamcoback.postgres.entity.QMemberRoleEntity; -import com.querydsl.core.BooleanBuilder; -import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; -import java.util.ArrayList; -import java.util.List; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; @Repository @@ -26,130 +14,106 @@ public class MembersRepositoryImpl implements MembersRepositoryCustom { private final JPAQueryFactory queryFactory; private final QMemberEntity memberEntity = QMemberEntity.memberEntity; - private final QMemberRoleEntity memberRoleEntity = QMemberRoleEntity.memberRoleEntity; /** - * μ‚¬μ›λ²ˆν˜Έ 쑰회 + * μ‚¬μš©μž ID 쑰회 * - * @param employeeNo + * @param userId * @return */ @Override - public boolean existsByEmployeeNo(String employeeNo) { + public boolean existsByUserId(String userId) { return queryFactory .selectOne() .from(memberEntity) - .where(memberEntity.employeeNo.eq(employeeNo)) + .where(memberEntity.userId.eq(userId)) .fetchFirst() != null; } - /** - * 이메일 쑰회 - * - * @param email - * @return - */ @Override - public boolean existsByEmail(String email) { - return queryFactory - .selectOne() - .from(memberEntity) - .where(memberEntity.email.eq(email)) - .fetchFirst() - != null; - } - - /** - * νšŒμ›μ •λ³΄ λͺ©λ‘ 쑰회 - * - * @param searchReq - * @return - */ - @Override - public Page findByMembers(MembersDto.SearchReq searchReq) { - Pageable pageable = searchReq.toPageable(); - BooleanBuilder builder = new BooleanBuilder(); - BooleanBuilder leftBuilder = new BooleanBuilder(); - - if (StringUtils.isNotBlank(searchReq.getField())) { - switch (searchReq.getField()) { - case "name" -> - builder.and(memberEntity.name.containsIgnoreCase(searchReq.getKeyword().trim())); - case "email" -> - builder.and(memberEntity.email.containsIgnoreCase(searchReq.getKeyword().trim())); - case "employeeNo" -> - builder.and(memberEntity.employeeNo.containsIgnoreCase(searchReq.getKeyword().trim())); - } - } - - List roles = new ArrayList<>(); - // 라벨러 - if (searchReq.isLabeler()) { - roles.add(RoleType.ROLE_LABELER.getId()); - } - - // μ‹œμŠ€ν…œ 전체 κ΄€λ¦¬μž - if (searchReq.isAdmin()) { - roles.add(RoleType.ROLE_ADMIN.getId()); - } - - // κ²€μˆ˜μž - if (searchReq.isReviewer()) { - roles.add(RoleType.ROLE_REVIEWER.getId()); - } - - // μ—­ν•  in 쑰건 μΆ”κ°€ - if (!roles.isEmpty()) { - leftBuilder.and(memberRoleEntity.id.roleName.in(roles)); - } - - List content = - queryFactory - .select( - Projections.constructor( - MembersDto.Basic.class, - memberEntity.id, - memberEntity.uuid, - memberEntity.employeeNo, - memberEntity.name, - memberEntity.email, - memberEntity.status, - memberRoleEntity.id.roleName, - memberEntity.createdDttm, - memberEntity.updatedDttm)) - .from(memberEntity) - .leftJoin(memberRoleEntity) - .on(memberRoleEntity.memberUuid.uuid.eq(memberEntity.uuid).and(leftBuilder)) - .where(builder) - .offset(pageable.getOffset()) - .limit(pageable.getPageSize()) - .orderBy(memberEntity.createdDttm.desc()) - .fetch(); - - long total = - queryFactory - .select(memberEntity) - .from(memberEntity) - .leftJoin(memberRoleEntity) - .on(memberRoleEntity.memberUuid.uuid.eq(memberEntity.uuid).and(leftBuilder)) - .fetchCount(); - - return new PageImpl<>(content, pageable, total); + public Optional findByUserId(String userId) { + return Optional.ofNullable( + queryFactory.selectFrom(memberEntity).where(memberEntity.userId.eq(userId)).fetchOne()); } + // /** + // * νšŒμ›μ •λ³΄ λͺ©λ‘ 쑰회 + // * + // * @param searchReq + // * @return + // */ + // @Override + // public Page findByMembers(MembersDto.SearchReq searchReq) { + // Pageable pageable = searchReq.toPageable(); + // BooleanBuilder builder = new BooleanBuilder(); + // BooleanBuilder leftBuilder = new BooleanBuilder(); + // + // if (StringUtils.isNotBlank(searchReq.getField())) { + // switch (searchReq.getField()) { + // case "name" -> + // builder.and(memberEntity.name.containsIgnoreCase(searchReq.getKeyword().trim())); + // } + // } + // + // List roles = new ArrayList<>(); + // // 라벨러 + // if (searchReq.isLabeler()) { + // roles.add(RoleType.ROLE_LABELER.getId()); + // } + // + // // μ‹œμŠ€ν…œ 전체 κ΄€λ¦¬μž + // if (searchReq.isAdmin()) { + // roles.add(RoleType.ROLE_ADMIN.getId()); + // } + // + // // κ²€μˆ˜μž + // if (searchReq.isReviewer()) { + // roles.add(RoleType.ROLE_REVIEWER.getId()); + // } + // + // // μ—­ν•  in 쑰건 μΆ”κ°€ + // if (!roles.isEmpty()) { + // leftBuilder.and(memberRoleEntity.id.roleName.in(roles)); + // } + // + // List content = + // queryFactory + // .select( + // Projections.constructor( + // MembersDto.Basic.class, + // memberEntity.id, + // memberEntity.uuid, + // memberEntity.employeeNo, + // memberEntity.name, + // null, + // memberEntity.status, + // memberRoleEntity.id.roleName, + // memberEntity.createdDttm, + // memberEntity.updatedDttm)) + // .from(memberEntity) + // .leftJoin(memberRoleEntity) + // .on(memberRoleEntity.memberUuid.uuid.eq(memberEntity.uuid).and(leftBuilder)) + // .where(builder) + // .offset(pageable.getOffset()) + // .limit(pageable.getPageSize()) + // .orderBy(memberEntity.createdDttm.desc()) + // .fetch(); + // + // long total = + // queryFactory + // .select(memberEntity) + // .from(memberEntity) + // .leftJoin(memberRoleEntity) + // .on(memberRoleEntity.memberUuid.uuid.eq(memberEntity.uuid).and(leftBuilder)) + // .fetchCount(); + // + // return new PageImpl<>(content, pageable, total); + // } + // @Override public Optional findByUUID(UUID uuid) { return Optional.ofNullable( queryFactory.selectFrom(memberEntity).where(memberEntity.uuid.eq(uuid)).fetchOne()); } - - @Override - public Optional findByEmployeeNo(String employeeNo) { - return Optional.ofNullable( - queryFactory - .selectFrom(memberEntity) - .where(memberEntity.employeeNo.eq(employeeNo)) - .fetchOne()); - } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepository.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepository.java deleted file mode 100644 index 172cb312..00000000 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.kamco.cd.kamcoback.postgres.repository.members; - -import com.kamco.cd.kamcoback.postgres.entity.MemberRoleEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MembersRoleRepository - extends JpaRepository, MembersRoleRepositoryCutom {} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepositoryCutom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepositoryCutom.java deleted file mode 100644 index fd13d1d8..00000000 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepositoryCutom.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.kamco.cd.kamcoback.postgres.repository.members; - -import com.kamco.cd.kamcoback.members.dto.MembersDto; - -public interface MembersRoleRepositoryCutom { - - boolean findByUuidAndRoleName(MembersDto.RolesDto rolesDto); -} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepositoryImpl.java deleted file mode 100644 index 571f41c7..00000000 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MembersRoleRepositoryImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.kamco.cd.kamcoback.postgres.repository.members; - -import com.kamco.cd.kamcoback.members.dto.MembersDto; -import com.kamco.cd.kamcoback.postgres.entity.QMemberRoleEntity; -import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@RequiredArgsConstructor -@Repository -public class MembersRoleRepositoryImpl implements MembersRoleRepositoryCutom { - - private final JPAQueryFactory queryFactory; - private final QMemberRoleEntity memberRoleEntity = QMemberRoleEntity.memberRoleEntity; - - @Override - public boolean findByUuidAndRoleName(MembersDto.RolesDto rolesDto) { - return queryFactory - .select(memberRoleEntity) - .from(memberRoleEntity) - .where( - memberRoleEntity - .id - .memberUuid - .eq(rolesDto.getUuid()) - .and(memberRoleEntity.id.roleName.eq(rolesDto.getRoleName()))) - .fetchOne() - != null; - } -} From 9fbefda9d5c7c857e38d4d86d7c37af92cc773ee Mon Sep 17 00:00:00 2001 From: teddy Date: Wed, 10 Dec 2025 15:53:25 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=ED=86=A0=ED=81=B0=20response=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/kamcoback/config/SecurityConfig.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java b/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java index 132c053d..b7fdcbf2 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java @@ -6,12 +6,14 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @@ -39,22 +41,21 @@ public class SecurityConfig { .authenticationProvider( customAuthenticationProvider) // 둜그인 νŒ¨μŠ€μ›Œλ“œ 비ꡐ방식 μŠ€ν”„λ§ κΈ°λ³Έ Provider μ‚¬μš©μ•ˆν•¨ μ»€μŠ€ν…€ μ‚¬μš© .authorizeHttpRequests( - auth -> auth.anyRequest().permitAll() - // .requestMatchers(HttpMethod.OPTIONS, "/**") - // .permitAll() // preflight ν—ˆμš© - // .requestMatchers( - // "/api/auth/signin", - // "/api/auth/refresh", - // "/swagger-ui/**", - // "/v3/api-docs/**") - // .permitAll() - // .anyRequest() - // .authenticated() - ) - // .addFilterBefore( - // jwtAuthenticationFilter, - // UsernamePasswordAuthenticationFilter - // .class) // μš”μ²­ λ“€μ–΄μ˜€λ©΄ λ¨Όμ € JWT 토큰 검사 ν›„ security context 에 μ‚¬μš©μž 정보 μ €μž₯. + auth -> + auth.requestMatchers(HttpMethod.OPTIONS, "/**") + .permitAll() // preflight ν—ˆμš© + .requestMatchers( + "/api/auth/signin", + "/api/auth/refresh", + "/swagger-ui/**", + "/v3/api-docs/**") + .permitAll() + .anyRequest() + .authenticated()) + .addFilterBefore( + jwtAuthenticationFilter, + UsernamePasswordAuthenticationFilter + .class) // μš”μ²­ λ“€μ–΄μ˜€λ©΄ λ¨Όμ € JWT 토큰 검사 ν›„ security context 에 μ‚¬μš©μž 정보 μ €μž₯. ; return http.build(); From b3903fbb575c869d526169da561678cfb71ca2d2 Mon Sep 17 00:00:00 2001 From: teddy Date: Wed, 10 Dec 2025 15:54:40 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=A4=91,=20=ED=86=A0=ED=81=B0=20response=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/CustomAuthenticationProvider.java | 2 +- .../cd/kamcoback/auth/CustomUserDetails.java | 1 - .../config/GlobalExceptionHandler.java | 7 +- .../kamcoback/members/AdminApiController.java | 89 +----- .../members/MembersApiController.java | 2 +- .../kamcoback/members/dto/MemberDetails.java | 2 +- .../cd/kamcoback/members/dto/MembersDto.java | 39 +-- .../members/exception/MemberException.java | 3 +- .../members/service/AdminService.java | 24 +- .../postgres/core/MembersCoreService.java | 301 +++++++++--------- .../postgres/entity/MemberEntity.java | 45 ++- .../postgres/entity/MemberRoleEntity.java | 37 --- .../postgres/entity/MemberRoleEntityId.java | 47 --- src/main/resources/application-dev.yml | 2 - src/main/resources/application-local.yml | 6 +- src/main/resources/application-prod.yml | 2 - 16 files changed, 225 insertions(+), 384 deletions(-) delete mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberRoleEntity.java delete mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberRoleEntityId.java diff --git a/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java b/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java index 33b440ad..c89f793e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java +++ b/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java @@ -25,7 +25,7 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { // 1. μœ μ € 쑰회 MemberEntity member = membersRepository - .findByEmployeeNo(username) + .findByUserId(username) .orElseThrow(() -> new BadCredentialsException("ID λ˜λŠ” λΉ„λ°€λ²ˆν˜Έκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")); // 2. jBCrypt + μ»€μŠ€ν…€ salt 둜 μ €μž₯된 νŒ¨μŠ€μ›Œλ“œ 비ꡐ diff --git a/src/main/java/com/kamco/cd/kamcoback/auth/CustomUserDetails.java b/src/main/java/com/kamco/cd/kamcoback/auth/CustomUserDetails.java index deac82c7..b65be3f0 100644 --- a/src/main/java/com/kamco/cd/kamcoback/auth/CustomUserDetails.java +++ b/src/main/java/com/kamco/cd/kamcoback/auth/CustomUserDetails.java @@ -16,7 +16,6 @@ public class CustomUserDetails implements UserDetails { @Override public Collection getAuthorities() { - // κΆŒν•œμ„ Memberμ—μ„œ κ°€μ Έμ˜€λŠ” 경우 λ°”κΎΈλ©΄ λ©λ‹ˆλ‹€ β€” 일단 κΈ°λ³Έκ°’ return Collections.emptyList(); } diff --git a/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java b/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java index 9133902a..a30842d5 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java @@ -241,11 +241,8 @@ public class GlobalExceptionHandler { String codeName = ""; switch (e.getField()) { - case EMPLOYEE_NO -> { - codeName = "DUPLICATE_EMPLOYEEID"; - } - case EMAIL -> { - codeName = "DUPLICATE_EMAIL"; + case USER_ID -> { + codeName = "DUPLICATE_DATA"; } default -> { codeName = "DUPLICATE_DATA"; diff --git a/src/main/java/com/kamco/cd/kamcoback/members/AdminApiController.java b/src/main/java/com/kamco/cd/kamcoback/members/AdminApiController.java index 72131dae..6839e605 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/AdminApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/AdminApiController.java @@ -16,11 +16,12 @@ import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -@Tag(name = "νšŒμ›μ •λ³΄ κ΄€λ¦¬μž 관리", description = "νšŒμ›μ •λ³΄ κ΄€λ¦¬μž 관리 API") +@Tag(name = "κ΄€λ¦¬μž 관리", description = "κ΄€λ¦¬μž 관리 API") @RestController @RequestMapping("/api/admin/members") @RequiredArgsConstructor @@ -28,12 +29,12 @@ public class AdminApiController { private final AdminService adminService; - @Operation(summary = "νšŒμ›κ°€μž…", description = "νšŒμ›κ°€μž…") + @Operation(summary = "κ΄€λ¦¬μž 계정 등둝", description = "κ΄€λ¦¬μž 계정 등둝") @ApiResponses( value = { @ApiResponse( responseCode = "201", - description = "νšŒμ›κ°€μž… 성곡", + description = "등둝 성곡", content = @Content( mediaType = "application/json", @@ -45,7 +46,7 @@ public class AdminApiController { @PostMapping("/join") public ApiResponseDto saveMember( @io.swagger.v3.oas.annotations.parameters.RequestBody( - description = "νšŒμ›κ°€μž…", + description = "κ΄€λ¦¬μž 계정 등둝", required = true, content = @Content( @@ -58,94 +59,34 @@ public class AdminApiController { return ApiResponseDto.createOK(adminService.saveMember(addReq)); } - @Operation(summary = "μ—­ν•  μΆ”κ°€", description = "uuid κΈ°μ€€μœΌλ‘œ μ—­ν•  μΆ”κ°€") + @Operation(summary = "κ΄€λ¦¬μž 계정 μˆ˜μ •", description = "κ΄€λ¦¬μž 계정 μˆ˜μ •") @ApiResponses( value = { @ApiResponse( responseCode = "201", - description = "μ—­ν•  μΆ”κ°€", + description = "μˆ˜μ • 성곡", content = @Content( mediaType = "application/json", - schema = @Schema(implementation = UUID.class))), + schema = @Schema(implementation = Long.class))), @ApiResponse(responseCode = "400", description = "잘λͺ»λœ μš”μ²­ 데이터", content = @Content), @ApiResponse(responseCode = "404", description = "μ½”λ“œλ₯Ό 찾을 수 μ—†μŒ", content = @Content), @ApiResponse(responseCode = "500", description = "μ„œλ²„ 였λ₯˜", content = @Content) }) - @PostMapping("/roles/add") - public ApiResponseDto saveRoles( + @PutMapping("/{uuid}") + public ApiResponseDto updateMembers( @io.swagger.v3.oas.annotations.parameters.RequestBody( - description = "μ—­ν•  μΆ”κ°€", + description = "κ΄€λ¦¬μž 계정 μˆ˜μ •", required = true, content = @Content( mediaType = "application/json", - schema = @Schema(implementation = MembersDto.RolesDto.class))) - @RequestBody - @Valid - MembersDto.RolesDto rolesDto) { - adminService.saveRoles(rolesDto); - return ApiResponseDto.createOK(rolesDto.getUuid()); - } - - @Operation(summary = "μ—­ν•  μ‚­μ œ", description = "uuid κΈ°μ€€μœΌλ‘œ μ—­ν•  μ‚­μ œ") - @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "μ—­ν•  μ‚­μ œ", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = UUID.class))), - @ApiResponse(responseCode = "400", description = "잘λͺ»λœ μš”μ²­ 데이터", content = @Content), - @ApiResponse(responseCode = "404", description = "μ½”λ“œλ₯Ό 찾을 수 μ—†μŒ", content = @Content), - @ApiResponse(responseCode = "500", description = "μ„œλ²„ 였λ₯˜", content = @Content) - }) - @DeleteMapping("/roles/rm") - public ApiResponseDto deleteRoles( - @io.swagger.v3.oas.annotations.parameters.RequestBody( - description = "μ—­ν•  μ‚­μ œ", - required = true, - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = MembersDto.RolesDto.class))) - @RequestBody - @Valid - MembersDto.RolesDto rolesDto) { - adminService.deleteRoles(rolesDto); - return ApiResponseDto.createOK(rolesDto.getUuid()); - } - - @Operation(summary = "μƒνƒœ μˆ˜μ •", description = "μƒνƒœ μˆ˜μ •") - @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "μƒνƒœ μˆ˜μ •", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = UUID.class))), - @ApiResponse(responseCode = "400", description = "잘λͺ»λœ μš”μ²­ 데이터", content = @Content), - @ApiResponse(responseCode = "404", description = "μ½”λ“œλ₯Ό 찾을 수 μ—†μŒ", content = @Content), - @ApiResponse(responseCode = "500", description = "μ„œλ²„ 였λ₯˜", content = @Content) - }) - @PatchMapping("{uuid}/status") - public ApiResponseDto updateStatus( - @io.swagger.v3.oas.annotations.parameters.RequestBody( - description = "μƒνƒœ μˆ˜μ •", - required = true, - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = MembersDto.StatusDto.class))) + schema = @Schema(implementation = MembersDto.UpdateReq.class))) @PathVariable UUID uuid, - @RequestBody @Valid MembersDto.StatusDto statusDto) { - adminService.updateStatus(uuid, statusDto); - return ApiResponseDto.createOK(uuid); + @RequestBody MembersDto.UpdateReq updateReq) { + adminService.updateMembers(uuid, updateReq); + return ApiResponseDto.createOK(UUID.randomUUID()); } @Operation(summary = "νšŒμ› νƒˆν‡΄", description = "νšŒμ› νƒˆν‡΄") diff --git a/src/main/java/com/kamco/cd/kamcoback/members/MembersApiController.java b/src/main/java/com/kamco/cd/kamcoback/members/MembersApiController.java index 1da4a74f..08114c6f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/MembersApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/MembersApiController.java @@ -65,7 +65,7 @@ public class MembersApiController { @PutMapping("/{uuid}") public ApiResponseDto updateMember( @PathVariable UUID uuid, @RequestBody MembersDto.UpdateReq updateReq) { - membersService.updateMember(uuid, updateReq); + // membersService.updateMember(uuid, updateReq); return ApiResponseDto.createOK(uuid); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/members/dto/MemberDetails.java b/src/main/java/com/kamco/cd/kamcoback/members/dto/MemberDetails.java index ad945dc9..9c1b06f4 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/dto/MemberDetails.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/dto/MemberDetails.java @@ -32,7 +32,7 @@ public class MemberDetails implements UserDetails { public String getUsername() { // 둜그인 ID 둜 무엇을 μ“Έμ§€ 선택 // 1) 이메일 둜그인: - return member.getEmail(); + return member.getUserId(); // 2) μ‚¬λ²ˆμœΌλ‘œ λ‘œκ·ΈμΈν•˜κ³  μ‹ΆμœΌλ©΄: // return member.getEmployeeNo(); diff --git a/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java b/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java index 4997a12d..b42c1d5e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java @@ -90,28 +90,34 @@ public class MembersDto { @Setter public static class AddReq { - @Schema(description = "μ‚¬λ²ˆ", example = "11111") + @Schema(description = "κ΄€λ¦¬μž μœ ν˜•", example = "ROLE_ADMIN") @NotBlank @Size(max = 50) - private String employeeNo; + private String userRole; @Schema(description = "이름", example = "홍길동") @NotBlank @Size(min = 2, max = 100) private String name; - @Schema(hidden = true) - private String password; + @Schema(description = "ID", example = "gildong") + @NotBlank + @Size(min = 2, max = 50) + private String userId; - @Schema(description = "이메일", example = "gildong@daum.net") - @Size(max = 100) - private String email; + @Schema(description = "μž„μ‹œ λΉ„λ°€λ²ˆν˜Έ", example = "q!w@e#r4") + private String tempPassword; - public AddReq(String employeeNo, String name, String password, String email) { - this.employeeNo = employeeNo; + @Schema(description = "μ‚¬λ²ˆ", example = "123456") + private String employeeNo; + + public AddReq( + String userRole, String name, String userId, String tempPassword, String employeeNo) { + this.userRole = userRole; this.name = name; - this.password = password; - this.email = email; + this.userId = userId; + this.tempPassword = tempPassword; + this.employeeNo = employeeNo; } } @@ -129,17 +135,12 @@ public class MembersDto { @Schema(description = "νŒ¨μŠ€μ›Œλ“œ", example = "") @Size(max = 255) - private String password; + private String tempPassword; - @Schema(description = "이메일", example = "gildong@daum.net") - @Size(max = 100) - private String email; - - public UpdateReq(String employeeNo, String name, String password, String email) { + public UpdateReq(String employeeNo, String name, String tempPassword) { this.employeeNo = employeeNo; this.name = name; - this.password = password; - this.email = email; + this.tempPassword = tempPassword; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/members/exception/MemberException.java b/src/main/java/com/kamco/cd/kamcoback/members/exception/MemberException.java index 55c83419..b8dce363 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/exception/MemberException.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/exception/MemberException.java @@ -10,8 +10,7 @@ public class MemberException { public static class DuplicateMemberException extends RuntimeException { public enum Field { - EMPLOYEE_NO, - EMAIL, + USER_ID, DEFAULT } diff --git a/src/main/java/com/kamco/cd/kamcoback/members/service/AdminService.java b/src/main/java/com/kamco/cd/kamcoback/members/service/AdminService.java index 7174d9b5..948d2454 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/service/AdminService.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/service/AdminService.java @@ -6,7 +6,6 @@ import com.kamco.cd.kamcoback.postgres.core.MembersCoreService; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.mindrot.jbcrypt.BCrypt; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,9 +16,6 @@ public class AdminService { private final MembersCoreService membersCoreService; - @Value("${member.init_password}") - private String password; - /** * νšŒμ›κ°€μž… * @@ -29,14 +25,18 @@ public class AdminService { @Transactional public Long saveMember(MembersDto.AddReq addReq) { // salt 생성, μ‚¬λ²ˆμ΄ salt - String salt = BCryptSaltGenerator.generateSaltWithEmployeeNo(addReq.getEmployeeNo().trim()); + String salt = BCryptSaltGenerator.generateSaltWithEmployeeNo(addReq.getUserId().trim()); // νŒ¨μŠ€μ›Œλ“œ μ•”ν˜Έν™”, 초기 νŒ¨μŠ€μ›Œλ“œ κ³ μ • - String hashedPassword = BCrypt.hashpw(password, salt); - addReq.setPassword(hashedPassword); + String hashedPassword = BCrypt.hashpw(addReq.getTempPassword(), salt); + addReq.setTempPassword(hashedPassword); return membersCoreService.saveMembers(addReq); } + public void updateMembers(UUID uuid, MembersDto.UpdateReq updateReq) { + membersCoreService.updateMembers(uuid, updateReq); + } + /** * μ—­ν•  μΆ”κ°€ * @@ -44,7 +44,7 @@ public class AdminService { */ @Transactional public void saveRoles(MembersDto.RolesDto rolesDto) { - membersCoreService.saveRoles(rolesDto); + // membersCoreService.saveRoles(rolesDto); } /** @@ -53,7 +53,7 @@ public class AdminService { * @param rolesDto */ public void deleteRoles(MembersDto.RolesDto rolesDto) { - membersCoreService.deleteRoles(rolesDto); + // membersCoreService.deleteRoles(rolesDto); } /** @@ -62,7 +62,7 @@ public class AdminService { * @param statusDto */ public void updateStatus(UUID uuid, MembersDto.StatusDto statusDto) { - membersCoreService.updateStatus(uuid, statusDto); + // membersCoreService.updateStatus(uuid, statusDto); } /** @@ -71,7 +71,7 @@ public class AdminService { * @param uuid */ public void deleteAccount(UUID uuid) { - membersCoreService.deleteAccount(uuid); + // membersCoreService.deleteAccount(uuid); } /** @@ -80,6 +80,6 @@ public class AdminService { * @param id */ public void resetPassword(Long id) { - membersCoreService.resetPassword(id); + // membersCoreService.resetPassword(id); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java index e58e8764..d6acd8a9 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java @@ -1,24 +1,16 @@ package com.kamco.cd.kamcoback.postgres.core; -import com.kamco.cd.kamcoback.auth.BCryptSaltGenerator; import com.kamco.cd.kamcoback.members.dto.MembersDto; -import com.kamco.cd.kamcoback.members.exception.MemberException; +import com.kamco.cd.kamcoback.members.dto.MembersDto.AddReq; +import com.kamco.cd.kamcoback.members.exception.MemberException.DuplicateMemberException; +import com.kamco.cd.kamcoback.members.exception.MemberException.DuplicateMemberException.Field; import com.kamco.cd.kamcoback.members.exception.MemberException.MemberNotFoundException; -import com.kamco.cd.kamcoback.postgres.entity.MemberArchivedEntity; -import com.kamco.cd.kamcoback.postgres.entity.MemberArchivedEntityId; import com.kamco.cd.kamcoback.postgres.entity.MemberEntity; -import com.kamco.cd.kamcoback.postgres.entity.MemberRoleEntity; -import com.kamco.cd.kamcoback.postgres.entity.MemberRoleEntityId; import com.kamco.cd.kamcoback.postgres.repository.members.MembersArchivedRepository; import com.kamco.cd.kamcoback.postgres.repository.members.MembersRepository; -import com.kamco.cd.kamcoback.postgres.repository.members.MembersRoleRepository; -import java.time.ZonedDateTime; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; -import org.mindrot.jbcrypt.BCrypt; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; @Service @@ -26,34 +18,25 @@ import org.springframework.stereotype.Service; public class MembersCoreService { private final MembersRepository membersRepository; - private final MembersRoleRepository memberRoleRepository; private final MembersArchivedRepository memberArchivedRepository; - @Value("${member.init_password}") - private String password; - /** * νšŒμ›κ°€μž… * * @param addReq * @return */ - public Long saveMembers(MembersDto.AddReq addReq) { - if (membersRepository.existsByEmployeeNo(addReq.getEmployeeNo())) { - throw new MemberException.DuplicateMemberException( - MemberException.DuplicateMemberException.Field.EMPLOYEE_NO, addReq.getEmployeeNo()); + public Long saveMembers(AddReq addReq) { + if (membersRepository.existsByUserId(addReq.getUserId())) { + throw new DuplicateMemberException(Field.USER_ID, addReq.getUserId()); } - - if (membersRepository.existsByEmail(addReq.getEmail())) { - throw new MemberException.DuplicateMemberException( - MemberException.DuplicateMemberException.Field.EMAIL, addReq.getEmail()); - } - MemberEntity memberEntity = new MemberEntity(); - memberEntity.setEmployeeNo(addReq.getEmployeeNo()); + memberEntity.setUserId(addReq.getUserId()); + memberEntity.setUserRole(addReq.getUserRole()); + memberEntity.setTempPassword(addReq.getTempPassword()); + memberEntity.setPassword(addReq.getTempPassword()); memberEntity.setName(addReq.getName()); - memberEntity.setPassword(addReq.getPassword()); - memberEntity.setEmail(addReq.getEmail()); + memberEntity.setEmployeeNo(addReq.getEmployeeNo()); return membersRepository.save(memberEntity).getId(); } @@ -66,141 +49,141 @@ public class MembersCoreService { */ public void updateMembers(UUID uuid, MembersDto.UpdateReq updateReq) { MemberEntity memberEntity = - membersRepository.findByUUID(uuid).orElseThrow(() -> new MemberNotFoundException()); + membersRepository.findByUUID(uuid).orElseThrow(MemberNotFoundException::new); + + if (StringUtils.isNotBlank(updateReq.getName())) { + memberEntity.setName(updateReq.getName()); + } + + if (StringUtils.isNotBlank(updateReq.getTempPassword())) { + memberEntity.setTempPassword(updateReq.getTempPassword()); + memberEntity.setPassword(updateReq.getTempPassword()); + } if (StringUtils.isNotBlank(memberEntity.getEmployeeNo())) { memberEntity.setEmployeeNo(updateReq.getEmployeeNo()); } - if (StringUtils.isNotBlank(updateReq.getName())) { - memberEntity.setName(updateReq.getName()); - } - if (StringUtils.isNotBlank(updateReq.getPassword())) { - memberEntity.setPassword(updateReq.getPassword()); - } - if (StringUtils.isNotBlank(updateReq.getEmail())) { - memberEntity.setEmail(updateReq.getEmail()); - } - - membersRepository.save(memberEntity); - } - - /** - * μ—­ν•  μΆ”κ°€ - * - * @param rolesDto - */ - public void saveRoles(MembersDto.RolesDto rolesDto) { - - MemberEntity memberEntity = - membersRepository - .findByUUID(rolesDto.getUuid()) - .orElseThrow(() -> new MemberNotFoundException()); - - if (memberRoleRepository.findByUuidAndRoleName(rolesDto)) { - throw new MemberException.DuplicateMemberException( - MemberException.DuplicateMemberException.Field.DEFAULT, "μ€‘λ³΅λœ 역할이 μžˆμŠ΅λ‹ˆλ‹€."); - } - - MemberRoleEntityId memberRoleEntityId = new MemberRoleEntityId(); - memberRoleEntityId.setMemberUuid(rolesDto.getUuid()); - memberRoleEntityId.setRoleName(rolesDto.getRoleName()); - - MemberRoleEntity memberRoleEntity = new MemberRoleEntity(); - memberRoleEntity.setId(memberRoleEntityId); - memberRoleEntity.setMemberUuid(memberEntity); - memberRoleEntity.setCreatedDttm(ZonedDateTime.now()); - memberRoleRepository.save(memberRoleEntity); - } - - /** - * μ—­ν•  μ‚­μ œ - * - * @param rolesDto - */ - public void deleteRoles(MembersDto.RolesDto rolesDto) { - MemberEntity memberEntity = - membersRepository - .findByUUID(rolesDto.getUuid()) - .orElseThrow(() -> new MemberNotFoundException()); - - MemberRoleEntityId memberRoleEntityId = new MemberRoleEntityId(); - memberRoleEntityId.setMemberUuid(rolesDto.getUuid()); - memberRoleEntityId.setRoleName(rolesDto.getRoleName()); - - MemberRoleEntity memberRoleEntity = new MemberRoleEntity(); - memberRoleEntity.setId(memberRoleEntityId); - memberRoleEntity.setMemberUuid(memberEntity); - - memberRoleRepository.delete(memberRoleEntity); - } - - /** - * μƒνƒœ μˆ˜μ • - * - * @param statusDto - */ - public void updateStatus(UUID uuid, MembersDto.StatusDto statusDto) { - MemberEntity memberEntity = - membersRepository.findByUUID(uuid).orElseThrow(() -> new MemberNotFoundException()); - - memberEntity.setStatus(statusDto.getStatus()); - memberEntity.setUpdatedDttm(ZonedDateTime.now()); - membersRepository.save(memberEntity); - } - - /** - * νšŒμ› νƒˆν‡΄ - * - * @param uuid - */ - public void deleteAccount(UUID uuid) { - MemberEntity memberEntity = - membersRepository.findByUUID(uuid).orElseThrow(() -> new MemberNotFoundException()); - - MemberArchivedEntityId memberArchivedEntityId = new MemberArchivedEntityId(); - memberArchivedEntityId.setUserId(memberEntity.getId()); - memberArchivedEntityId.setUuid(memberEntity.getUuid()); - - MemberArchivedEntity memberArchivedEntity = new MemberArchivedEntity(); - memberArchivedEntity.setId(memberArchivedEntityId); - memberArchivedEntity.setEmployeeNo(memberEntity.getEmployeeNo()); - memberArchivedEntity.setName(memberEntity.getName()); - memberArchivedEntity.setPassword(memberEntity.getPassword()); - memberArchivedEntity.setEmail(memberEntity.getEmail()); - memberArchivedEntity.setStatus(memberEntity.getStatus()); - memberArchivedEntity.setCreatedDttm(memberEntity.getCreatedDttm()); - memberArchivedEntity.setArchivedDttm(ZonedDateTime.now()); - memberArchivedRepository.save(memberArchivedEntity); - - memberEntity.setStatus("ARCHIVED"); - memberEntity.setName("**********"); - memberEntity.setEmployeeNo("**********"); - memberEntity.setPassword("**********"); - memberEntity.setEmail("**********"); - memberEntity.setUpdatedDttm(ZonedDateTime.now()); - membersRepository.save(memberEntity); - } - - /** - * νŒ¨μŠ€μ›Œλ“œ μ΄ˆκΈ°ν™” - * - * @param id - */ - public void resetPassword(Long id) { - MemberEntity memberEntity = - membersRepository.findById(id).orElseThrow(() -> new MemberNotFoundException()); - - String salt = - BCryptSaltGenerator.generateSaltWithEmployeeNo(memberEntity.getEmployeeNo().trim()); - // νŒ¨μŠ€μ›Œλ“œ μ•”ν˜Έν™”, 초기 νŒ¨μŠ€μ›Œλ“œ κ³ μ • - String hashedPassword = BCrypt.hashpw(password, salt); - - memberEntity.setPassword(hashedPassword); - memberEntity.setStatus("INACTIVE"); - memberEntity.setUpdatedDttm(ZonedDateTime.now()); membersRepository.save(memberEntity); } + // + // /** + // * μ—­ν•  μΆ”κ°€ + // * + // * @param rolesDto + // */ + // public void saveRoles(MembersDto.RolesDto rolesDto) { + // + // MemberEntity memberEntity = + // membersRepository + // .findByUUID(rolesDto.getUuid()) + // .orElseThrow(() -> new MemberNotFoundException()); + // + // if (memberRoleRepository.findByUuidAndRoleName(rolesDto)) { + // throw new MemberException.DuplicateMemberException( + // MemberException.DuplicateMemberException.Field.DEFAULT, "μ€‘λ³΅λœ 역할이 μžˆμŠ΅λ‹ˆλ‹€."); + // } + // + // MemberRoleEntityId memberRoleEntityId = new MemberRoleEntityId(); + // memberRoleEntityId.setMemberUuid(rolesDto.getUuid()); + // memberRoleEntityId.setRoleName(rolesDto.getRoleName()); + // + // MemberRoleEntity memberRoleEntity = new MemberRoleEntity(); + // memberRoleEntity.setId(memberRoleEntityId); + // memberRoleEntity.setMemberUuid(memberEntity); + // memberRoleEntity.setCreatedDttm(ZonedDateTime.now()); + // memberRoleRepository.save(memberRoleEntity); + // } + // + // /** + // * μ—­ν•  μ‚­μ œ + // * + // * @param rolesDto + // */ + // public void deleteRoles(MembersDto.RolesDto rolesDto) { + // MemberEntity memberEntity = + // membersRepository + // .findByUUID(rolesDto.getUuid()) + // .orElseThrow(() -> new MemberNotFoundException()); + // + // MemberRoleEntityId memberRoleEntityId = new MemberRoleEntityId(); + // memberRoleEntityId.setMemberUuid(rolesDto.getUuid()); + // memberRoleEntityId.setRoleName(rolesDto.getRoleName()); + // + // MemberRoleEntity memberRoleEntity = new MemberRoleEntity(); + // memberRoleEntity.setId(memberRoleEntityId); + // memberRoleEntity.setMemberUuid(memberEntity); + // + // memberRoleRepository.delete(memberRoleEntity); + // } + // + // /** + // * μƒνƒœ μˆ˜μ • + // * + // * @param statusDto + // */ + // public void updateStatus(UUID uuid, MembersDto.StatusDto statusDto) { + // MemberEntity memberEntity = + // membersRepository.findByUUID(uuid).orElseThrow(() -> new MemberNotFoundException()); + // + // memberEntity.setStatus(statusDto.getStatus()); + // memberEntity.setUpdatedDttm(ZonedDateTime.now()); + // membersRepository.save(memberEntity); + // } + // + // /** + // * νšŒμ› νƒˆν‡΄ + // * + // * @param uuid + // */ + // public void deleteAccount(UUID uuid) { + // MemberEntity memberEntity = + // membersRepository.findByUUID(uuid).orElseThrow(() -> new MemberNotFoundException()); + // + // MemberArchivedEntityId memberArchivedEntityId = new MemberArchivedEntityId(); + // memberArchivedEntityId.setUserId(memberEntity.getId()); + // memberArchivedEntityId.setUuid(memberEntity.getUuid()); + // + // MemberArchivedEntity memberArchivedEntity = new MemberArchivedEntity(); + // memberArchivedEntity.setId(memberArchivedEntityId); + // memberArchivedEntity.setEmployeeNo(memberEntity.getEmployeeNo()); + // memberArchivedEntity.setName(memberEntity.getName()); + // memberArchivedEntity.setPassword(memberEntity.getPassword()); + // memberArchivedEntity.setEmail(memberEntity.getEmail()); + // memberArchivedEntity.setStatus(memberEntity.getStatus()); + // memberArchivedEntity.setCreatedDttm(memberEntity.getCreatedDttm()); + // memberArchivedEntity.setArchivedDttm(ZonedDateTime.now()); + // memberArchivedRepository.save(memberArchivedEntity); + // + // memberEntity.setStatus("ARCHIVED"); + // memberEntity.setName("**********"); + // memberEntity.setEmployeeNo("**********"); + // memberEntity.setPassword("**********"); + // memberEntity.setEmail("**********"); + // memberEntity.setUpdatedDttm(ZonedDateTime.now()); + // membersRepository.save(memberEntity); + // } + // + // /** + // * νŒ¨μŠ€μ›Œλ“œ μ΄ˆκΈ°ν™” + // * + // * @param id + // */ + // public void resetPassword(Long id) { + // MemberEntity memberEntity = + // membersRepository.findById(id).orElseThrow(() -> new MemberNotFoundException()); + // + // String salt = + // BCryptSaltGenerator.generateSaltWithEmployeeNo(memberEntity.getEmployeeNo().trim()); + // // νŒ¨μŠ€μ›Œλ“œ μ•”ν˜Έν™”, 초기 νŒ¨μŠ€μ›Œλ“œ κ³ μ • + // String hashedPassword = BCrypt.hashpw(password, salt); + // + // memberEntity.setPassword(hashedPassword); + // memberEntity.setStatus("INACTIVE"); + // memberEntity.setUpdatedDttm(ZonedDateTime.now()); + // membersRepository.save(memberEntity); + // } + // /** * νšŒμ›λͺ©λ‘ 쑰회 @@ -208,7 +191,7 @@ public class MembersCoreService { * @param searchReq * @return */ - public Page findByMembers(MembersDto.SearchReq searchReq) { - return membersRepository.findByMembers(searchReq); - } + // public Page findByMembers(MembersDto.SearchReq searchReq) { + // return membersRepository.findByMembers(searchReq); + // } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberEntity.java index 744bd78b..f9cf9ef8 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberEntity.java @@ -5,13 +5,10 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import java.time.ZonedDateTime; -import java.util.LinkedHashSet; -import java.util.Set; import java.util.UUID; import lombok.Getter; import lombok.Setter; @@ -28,11 +25,24 @@ public class MemberEntity { @Column(name = "id", nullable = false) private Long id; - @Column(name = "uuid", nullable = false, insertable = false) - private UUID uuid; + @NotNull + @ColumnDefault("gen_random_uuid()") + @Column(name = "uuid", nullable = false) + private UUID uuid = UUID.randomUUID(); @Size(max = 50) - @Column(name = "employee_no", length = 50) + @NotNull + @Column(name = "user_role", nullable = false, length = 50) + private String userRole; + + @Size(max = 50) + @NotNull + @Column(name = "user_id", nullable = false, length = 50) + private String userId; + + @Size(max = 50) + @NotNull + @Column(name = "employee_no", nullable = false, length = 50) private String employeeNo; @Size(max = 100) @@ -40,26 +50,27 @@ public class MemberEntity { @Column(name = "name", nullable = false, length = 100) private String name; + @Size(max = 255) + @NotNull + @Column(name = "temp_password", nullable = false) + private String tempPassword; + @Size(max = 255) @NotNull @Column(name = "password", nullable = false) private String password; - @Size(max = 100) - @Column(name = "email", length = 100) - private String email; - @Size(max = 20) @ColumnDefault("'INACTIVE'") @Column(name = "status", length = 20) private String status = "INACTIVE"; - @Column(name = "created_dttm", nullable = false, insertable = false) - private ZonedDateTime createdDttm; + @NotNull + @ColumnDefault("now()") + @Column(name = "created_dttm", nullable = false) + private ZonedDateTime createdDttm = ZonedDateTime.now(); - @Column(name = "updated_dttm", nullable = false, insertable = false) - private ZonedDateTime updatedDttm; - - @OneToMany(mappedBy = "memberUuid") - private Set tbMemberRoles = new LinkedHashSet<>(); + @ColumnDefault("now()") + @Column(name = "updated_dttm") + private ZonedDateTime updatedDttm = ZonedDateTime.now(); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberRoleEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberRoleEntity.java deleted file mode 100644 index 8f5e98af..00000000 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberRoleEntity.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.kamco.cd.kamcoback.postgres.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.EmbeddedId; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import java.time.ZonedDateTime; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.ColumnDefault; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; - -@Getter -@Setter -@Entity -@Table(name = "tb_member_role") -public class MemberRoleEntity { - - @EmbeddedId private MemberRoleEntityId id; - - @ManyToOne(fetch = FetchType.LAZY, optional = false) - @OnDelete(action = OnDeleteAction.CASCADE) - @JoinColumn( - name = "member_uuid", - referencedColumnName = "uuid", - insertable = false, - updatable = false) - private MemberEntity memberUuid; - - @ColumnDefault("now()") - @Column(name = "created_dttm") - private ZonedDateTime createdDttm; -} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberRoleEntityId.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberRoleEntityId.java deleted file mode 100644 index 9d23c936..00000000 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MemberRoleEntityId.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.kamco.cd.kamcoback.postgres.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Embeddable; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import java.io.Serializable; -import java.util.Objects; -import java.util.UUID; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.Hibernate; - -@Getter -@Setter -@Embeddable -public class MemberRoleEntityId implements Serializable { - - private static final long serialVersionUID = 9130416001060414347L; - - @NotNull - @Column(name = "member_uuid", nullable = false) - private UUID memberUuid; - - @Size(max = 50) - @NotNull - @Column(name = "role_name", nullable = false, length = 50) - private String roleName; - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) { - return false; - } - MemberRoleEntityId entity = (MemberRoleEntityId) o; - return Objects.equals(this.memberUuid, entity.memberUuid) - && Objects.equals(this.roleName, entity.roleName); - } - - @Override - public int hashCode() { - return Objects.hash(memberUuid, roleName); - } -} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 4126fe32..0b2d19f6 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -45,5 +45,3 @@ token: refresh-cookie-name: kamco-dev # 개발용 μΏ ν‚€ 이름 refresh-cookie-secure: false # 둜컬 http ν…ŒμŠ€νŠΈλ©΄ false -member: - init_password: kamco1234! diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index e8c5785b..2a12c9cb 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -15,8 +15,8 @@ spring: format_sql: true # ⚠️ 선택 - SQL ν¬λ§·νŒ… (가독성) datasource: - url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - #url: jdbc:postgresql://localhost:5432/kamco_cds + #url: jdbc:postgresql://192.168.2.127:15432/kamco_cds + url: jdbc:postgresql://localhost:5432/kamco_cds username: kamco_cds password: kamco_cds_Q!W@E#R$ hikari: @@ -38,6 +38,4 @@ token: refresh-cookie-name: kamco-local # 개발용 μΏ ν‚€ 이름 refresh-cookie-secure: false # 둜컬 http ν…ŒμŠ€νŠΈλ©΄ false -member: - init_password: kamco1234! diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index d2655044..b330d1d8 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -30,7 +30,5 @@ token: refresh-cookie-name: kamco # 개발용 μΏ ν‚€ 이름 refresh-cookie-secure: true # 둜컬 http ν…ŒμŠ€νŠΈλ©΄ false -member: - init_password: kamco1234! From f4f490d9b7ce4f7461c5e595120e409def1f5d8e Mon Sep 17 00:00:00 2001 From: teddy Date: Wed, 10 Dec 2025 15:55:16 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=A4=91,=20=ED=86=A0=ED=81=B0=20response=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-local.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 2a12c9cb..6e8788dc 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -15,8 +15,8 @@ spring: format_sql: true # ⚠️ 선택 - SQL ν¬λ§·νŒ… (가독성) datasource: - #url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - url: jdbc:postgresql://localhost:5432/kamco_cds + url: jdbc:postgresql://192.168.2.127:15432/kamco_cds + #url: jdbc:postgresql://localhost:5432/kamco_cds username: kamco_cds password: kamco_cds_Q!W@E#R$ hikari: