[회원 목록 조회 기능 추가] 회원 목록을 조회하는 API를 구현하고, GetMemberResponseDto를 추가하여 민감 정보를 제외한 회원 정보를 안전하게 반환하도록 수정. MemberService 및 MemberMapper에 관련 메서드를 추가하여 기능을 완성함.

This commit is contained in:
2025-09-02 15:00:13 +09:00
parent 470a5c8add
commit 51fe350c6d
5 changed files with 80 additions and 4 deletions

View File

@@ -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<ApiResponseDto<List<GetMemberResponseDto>>> getMembers() {
try {
List<GetMemberResponseDto> members = memberService.selectMemberListForDisplay(new HashMap<>());
ApiResponseDto<List<GetMemberResponseDto>> 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<ApiResponseDto<Void>> 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));

View File

@@ -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;
}

View File

@@ -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<GetMemberResponseDto> toGetMemberResponseDtoList(List<Member> members);
}

View File

@@ -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<MemberDto> selectMemberList(Map<String, String> params);
/**
* 회원 목록 조회 (민감한 정보 제외)
* @param params 검색 파라미터
* @return GetMemberResponseDto 리스트
*/
List<GetMemberResponseDto> selectMemberListForDisplay(Map<String, String> params);
}

View File

@@ -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<GetMemberResponseDto> selectMemberListForDisplay(Map<String, String> params) {
List<Member> members = memberRepository.findByUseFlagTrue();
return memberMapper.toGetMemberResponseDtoList(members);
}
}