diff --git a/src/main/java/com/bio/bio_backend/domain/base/member/controller/MemberController.java b/src/main/java/com/bio/bio_backend/domain/base/member/controller/MemberController.java index 9fcc38a..ab42e1a 100644 --- a/src/main/java/com/bio/bio_backend/domain/base/member/controller/MemberController.java +++ b/src/main/java/com/bio/bio_backend/domain/base/member/controller/MemberController.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.*; import jakarta.validation.Valid; import com.bio.bio_backend.domain.base.member.dto.MemberDto; +import com.bio.bio_backend.domain.base.member.dto.GetMemberResponseDto; import com.bio.bio_backend.domain.base.member.dto.CreateMemberRequestDto; import com.bio.bio_backend.domain.base.member.dto.CreateMemberResponseDto; import com.bio.bio_backend.domain.base.member.service.MemberService; @@ -25,6 +26,9 @@ import com.bio.bio_backend.global.utils.SecurityUtils; import com.bio.bio_backend.global.utils.JwtUtils; import jakarta.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + @Tag(name = "Member", description = "회원 관련 API") @RestController @@ -53,21 +57,38 @@ public class MemberController { return ResponseEntity.status(HttpStatus.CREATED).body(apiResponse); } + @LogExecution("회원 목록 조회") + @Operation(summary = "회원 목록 조회", description = "활성화된 모든 회원의 목록을 조회합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "회원 목록 조회 성공") + }) + @GetMapping + public ResponseEntity>> getMembers() { + try { + List members = memberService.selectMemberListForDisplay(new HashMap<>()); + ApiResponseDto> apiResponse = ApiResponseDto.success(ApiResponseCode.COMMON_SUCCESS, members); + log.info("전체 회원 목록 조회 완료: {}명", members.size()); + + return ResponseEntity.ok(apiResponse); + } catch (Exception e) { + log.error("회원 목록 조회 중 오류 발생: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponseDto.fail(ApiResponseCode.COMMON_INTERNAL_SERVER_ERROR)); + } + } + @LogExecution("로그아웃") @Operation(summary = "로그아웃", description = "사용자 로그아웃을 처리합니다.") @ApiResponses({ - @ApiResponse(responseCode = "200", description = "로그아웃 성공"), - @ApiResponse(responseCode = "401", description = "인증 실패", content = @Content(schema = @Schema(implementation = ApiResponseDto.class))) + @ApiResponse(responseCode = "200", description = "로그아웃 성공") }) @PostMapping("/logout") public ResponseEntity> logout(HttpServletResponse response) { try { String userId = SecurityUtils.getCurrentUserId(); memberService.deleteRefreshToken(userId); - // 모든 토큰 쿠키 삭제 jwtUtils.deleteAllTokenCookies(response); - log.info("사용자 로그아웃 완료: {}", userId); return ResponseEntity.ok(ApiResponseDto.success(ApiResponseCode.COMMON_SUCCESS)); diff --git a/src/main/java/com/bio/bio_backend/domain/base/member/dto/GetMemberResponseDto.java b/src/main/java/com/bio/bio_backend/domain/base/member/dto/GetMemberResponseDto.java new file mode 100644 index 0000000..15f1fe9 --- /dev/null +++ b/src/main/java/com/bio/bio_backend/domain/base/member/dto/GetMemberResponseDto.java @@ -0,0 +1,28 @@ +package com.bio.bio_backend.domain.base.member.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 회원 조회용 Response DTO + * 민감한 정보(password, refreshToken, loginIp)는 제외하고 안전한 정보만 포함 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GetMemberResponseDto { + + private Long oid; + private String userId; + private String name; + private String email; + private Boolean useFlag; + private LocalDateTime lastLoginAt; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/src/main/java/com/bio/bio_backend/domain/base/member/mapper/MemberMapper.java b/src/main/java/com/bio/bio_backend/domain/base/member/mapper/MemberMapper.java index 886ec32..e43f904 100644 --- a/src/main/java/com/bio/bio_backend/domain/base/member/mapper/MemberMapper.java +++ b/src/main/java/com/bio/bio_backend/domain/base/member/mapper/MemberMapper.java @@ -4,6 +4,7 @@ import com.bio.bio_backend.domain.base.member.dto.CreateMemberRequestDto; import com.bio.bio_backend.domain.base.member.dto.CreateMemberResponseDto; import com.bio.bio_backend.domain.base.member.dto.LoginResponseDto; import com.bio.bio_backend.domain.base.member.dto.MemberDto; +import com.bio.bio_backend.domain.base.member.dto.GetMemberResponseDto; import com.bio.bio_backend.domain.base.member.entity.Member; import com.bio.bio_backend.global.annotation.IgnoreBaseEntityMapping; import com.bio.bio_backend.global.config.GlobalMapperConfig; @@ -57,4 +58,14 @@ public interface MemberMapper { * MemberDto를 LoginResponseDto로 변환 */ LoginResponseDto toLoginResponseDto(MemberDto memberDto); + + /** + * Member 엔티티를 GetMemberResponseDto로 변환 (민감한 정보 제외) + */ + GetMemberResponseDto toGetMemberResponseDto(Member member); + + /** + * Member 엔티티 리스트를 GetMemberResponseDto 리스트로 변환 (민감한 정보 제외) + */ + List toGetMemberResponseDtoList(List members); } diff --git a/src/main/java/com/bio/bio_backend/domain/base/member/service/MemberService.java b/src/main/java/com/bio/bio_backend/domain/base/member/service/MemberService.java index 39440fa..3b4faef 100644 --- a/src/main/java/com/bio/bio_backend/domain/base/member/service/MemberService.java +++ b/src/main/java/com/bio/bio_backend/domain/base/member/service/MemberService.java @@ -4,6 +4,7 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import com.bio.bio_backend.domain.base.member.dto.MemberDto; +import com.bio.bio_backend.domain.base.member.dto.GetMemberResponseDto; import java.util.List; import java.util.Map; @@ -21,4 +22,11 @@ public interface MemberService extends UserDetailsService { void updateMember(MemberDto member); List selectMemberList(Map params); + + /** + * 회원 목록 조회 (민감한 정보 제외) + * @param params 검색 파라미터 + * @return GetMemberResponseDto 리스트 + */ + List selectMemberListForDisplay(Map params); } diff --git a/src/main/java/com/bio/bio_backend/domain/base/member/service/MemberServiceImpl.java b/src/main/java/com/bio/bio_backend/domain/base/member/service/MemberServiceImpl.java index 928feb6..8d88672 100644 --- a/src/main/java/com/bio/bio_backend/domain/base/member/service/MemberServiceImpl.java +++ b/src/main/java/com/bio/bio_backend/domain/base/member/service/MemberServiceImpl.java @@ -1,6 +1,7 @@ package com.bio.bio_backend.domain.base.member.service; import com.bio.bio_backend.domain.base.member.dto.MemberDto; +import com.bio.bio_backend.domain.base.member.dto.GetMemberResponseDto; import com.bio.bio_backend.domain.base.member.entity.Member; import com.bio.bio_backend.domain.base.member.mapper.MemberMapper; import com.bio.bio_backend.domain.base.member.repository.MemberRepository; @@ -95,4 +96,11 @@ public class MemberServiceImpl implements MemberService { return memberMapper.toMemberDtoList(members); } + + @Override + public List selectMemberListForDisplay(Map params) { + List members = memberRepository.findByUseFlagTrue(); + + return memberMapper.toGetMemberResponseDtoList(members); + } }