From 0fb715c3ed0e6c82b5aca5e2f47a3f6d748f1853 Mon Sep 17 00:00:00 2001 From: teddy Date: Wed, 10 Dec 2025 15:50:48 +0900 Subject: [PATCH] =?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; - } -}