개발 기록/도서관 관리 시스템

[Library Management System] 25.08.28 (30일)

dev.jelee 2025. 8. 28. 16:51

[ 작업한 내용 ]

1. 관리자 권한 수정 기능 추가

1-1) user 테이블과 User 엔티티

- 수정날짜 컬럼과 필드가 없어서 DB와 엔티티에 각각 updatedAt추가.

- DB에는 updated_at 컬럼 추가.

- User 엔티티에는 updatedAt 필드 추가.


1-2) messages.properties

- 메시지 추가.

success.user.role_update=권한이 성공적으로 변경되었습니다.

1-3) UserSuccessCode

- 성공 코드 추가.

USER_ROLE_UPDATE(HttpStatus.OK, "USER_205", "success.user.role_update");

1-4) BaseException

- 사용자 권한 수정시 성공 응답으로 사용자의 ID도 응답해주기 위해 메시지와 userId를 파라미터로 받는 생성자 함수를 추가.

public BaseException(ErrorCode errorCode, String message) {
    super(errorCode.getCode() + ": " + message);
    this.errorCode = errorCode;
}

1-5) UserRoleUpdatedReqDTO, UserRoleUpdatedResDTO

- 사용자 권한 수정을 수행하는 요청과 응답 DTO를 관리하는 파일 생성.


1-6) AdminUserController

- id와 role을 파라미터로 받아 service 계층으로 처리 요청 후 가져온 데이터를 성공 메시지와 함께 응답.

@PatchMapping("/{userId}/role")
  public ResponseEntity<?> updateUserRole(
    @PathVariable Long userId,
    @RequestBody UserAdminDTO.RoleUpdateReqDTO roleUpdateDTO) {
    
    UserAdminDTO.RoleUpdateResDTO responseDTO = userService.updateUserRole(userId, roleUpdateDTO);

    String message = messageProvider.getMessage(UserSuccessCode.USER_ROLE_UPDATE.getMessage());

    return ResponseEntity
              .status(UserSuccessCode.USER_ROLE_UPDATE.getHttpStatus())
              .body(ApiResponse.success(
                UserSuccessCode.USER_ROLE_UPDATE, 
                message, 
                responseDTO));
  }

1-7) UserService

- controller 계층으로 전달받은 id로 db에서 사용자를 조회하여 User 객체에 정보 담기. 

- 사용자 없으면 사용자를 찾을 수 없다는 예외 처리하기.

- 변경될 권한과 수정날짜를 user 객체에 저장하여 repository계층을 통해 db에 해당 id에 저장하기.

- .builder()를 사용하여 id, username, role, updatedAt을 controller에 반환.

public UserAdminDTO.RoleUpdateResDTO updateUserRole(Long userId, UserAdminDTO.RoleUpdateReqDTO roleUpdateDTO) {

    // 사용자 정보 확인 + 예외 처리
    User user = userRepository.findById(userId)
        .orElseThrow(() -> new BaseException(UserErrorCode.USER_NOT_FOUND, "userId: " + userId));
    
    // 권한 변경 및 저장
    user.setRole(roleUpdateDTO.getRole());
    user.setUpdatedAt(LocalDateTime.now());
    userRepository.save(user);

    // 응답 반환
    return UserAdminDTO.RoleUpdateResDTO.builder()
      .id(user.getId())
      .username(user.getUsername())
      .role(user.getRole())
      .updatedAt(user.getUpdatedAt())
      .build();
  }

2. 사용자 상태 변경 기능 추가

2-1) messages.properties

- 상태 변경 성공시 메시지.

success.user.status_update=상태가 성공적으로 변경되었습니다.

2-2) UserSuccessCode

- 성공 코드 파일에 상태 변경 성공 코드 추가.

USER_STATUS_UPDATE(HttpStatus.OK, "USER_206", "success.user.status_update");

2-3) 상태 변경 관련 요청, 응답 DTO

@Getter
@Builder
public class UserStatusUpdateReqDTO {
  private Long id;
  private UserStatus status;
}

 

@Getter
@Setter
@Builder
public class UserStatusUpdateResDTO {
  private Long id;
  private String username;
  private UserStatus status;
  private LocalDateTime updatedAt;
}

2-4) AdminUserController

- id와 status을 파라미터로 받아 service 계층으로 처리 요청 후 가져온 데이터를 성공 메시지와 함께 응답.

@PatchMapping("/{userId}/status")
  public ResponseEntity<?> updateUserStatus(
    @PathVariable Long userId, 
    @RequestBody UserStatusUpdateReqDTO statusUpdateDTO) {
    
    UserStatusUpdateResDTO responseDTO = userService.updateUserStatus(userId, statusUpdateDTO);
    
    String message = messageProvider.getMessage(UserSuccessCode.USER_STATUS_UPDATE.getMessage());

    return ResponseEntity
              .status(UserSuccessCode.USER_STATUS_UPDATE.getHttpStatus())
              .body(ApiResponse.success(
                UserSuccessCode.USER_STATUS_UPDATE, 
                message, 
                responseDTO));
  }

2-5) UserService

- controller 계층으로 전달받은 id로 db에서 사용자를 조회하여 User 객체에 정보 담기. 

- 사용자 없으면 사용자를 찾을 수 없다는 예외 처리하기.

- 상태와 수정날짜를 user 객체에 각각 저장하고 마지막에 repository계층을 통해 .save() 메서드를 사용하여 db에 해당 id에 user 객체 저장하기. (덮어씌우기)

- .builder()를 사용하여 id, username, status, updatedAt을 controller에 반환.

public UserStatusUpdateResDTO updateUserStatus(Long userId, UserStatusUpdateReqDTO statusUpdateDTO) {

    // 사용자 정보 확인 + 예외 처리
    User user = userRepository.findById(userId)
        .orElseThrow(() -> new BaseException(UserErrorCode.USER_NOT_FOUND, "userId: " + userId));
    
    // 상태 변경 및 저장
    user.setStatus(statusUpdateDTO.getStatus());
    user.setUpdatedAt(LocalDateTime.now());
    userRepository.save(user);

    // 응답 반환
    return UserStatusUpdateResDTO.builder()
        .id(user.getId())
        .username(user.getUsername())
        .status(user.getStatus())
        .updatedAt(user.getUpdatedAt())
        .build();
  }

commit
postman - api test