사용자 인증 및 계정 관리 | 정보 관리 API 구현

Faithful Dev·2025년 3월 15일

매장 예약 서비스

목록 보기
4/15

구현한 기능

  • 일반 사용자(User) 정보 조회 API
  • 일반 사용자(User) 정보 수정 API
  • 파트너(Partner) 정보 조회 API
  • 파트너(Partner) 정보 수정 API
  • API 보안을 위한 인증 유틸리티 추가

코드 스냅샷

AuthenticationUtil 클래스

인증된 사용자 확인 및 권한 검증을 위한 유틸리티 클래스.

@Component
public class AuthenticationUtil {
    /**
     * 현재 인증된 사용자의 이메일 반환
     *
     * @return 인증된 사용자 이메일
     */
    public String getCurrentUserEmail() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || !authentication.isAuthenticated()) {
            throw new CustomException(ErrorCode.UNAUTHORIZED);
        }
        return authentication.getName();
    }

    /**
     * 현재 인증된 사용자가 해당 ID의 소유자인지 확인
     * 자신의 정보만 수정할 수 있도록 권한 체크
     *
     * @param id 확인할 ID
     * @param email 비교할 이메일
     */
    public void validateOwnership(Long id, String email) {
        String currentUserEmail = getCurrentUserEmail();
        if (!currentUserEmail.equals(email)) {
            throw new CustomException(ErrorCode.FORBIDDEN);
        }
    }
}

사용자 정보 수정 메서드

@Transactional
public UserDto.UpdateResponse updateUserInfo(Long userId, UserDto.UpdateRequest request) {
    User user = userRepository.findById(userId)
            .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND));
    
    // 전화번호 중복 확인 (본인의 기존 전화번호는 제외)
    if (!user.getPhone().equals(request.getPhone()) && userRepository.existsByPhone(request.getPhone())) {
        throw new CustomException(ErrorCode.PHONE_ALREADY_EXISTS);
    }
    
    user.setName(request.getName());
    user.setPhone(request.getPhone());
    
    User updatedUser = userRepository.save(user);
    
    return UserDto.UpdateResponse.builder()
            .userId(updatedUser.getId())
            .email(updatedUser.getEmail())
            .name(updatedUser.getName())
            .phone(updatedUser.getPhone())
            .role(updatedUser.getRole())
            .updatedAt(updatedUser.getUpdatedAt())
            .build();
}

파트너 정보 조회 API

@GetMapping("/{partnerId}")
public ResponseEntity<ApiResponse<PartnerDto.PartnerInfoResponse>> getPartnerInfo(
        @PathVariable Long partnerId
) {
    PartnerDto.PartnerInfoResponse partnerInfo = partnerService.getPartnerInfo(partnerId);
    
    // 본인 정보만 조회 가능하도록 권한 체크
    authenticationUtil.validateOwnership(partnerId, partnerInfo.getEmail());
    
    return ResponseEntity.ok(ApiResponse.success("파트너 정보를 성공적으로 조회했습니다.", partnerInfo));
}

Postman 테스트





구현 예정

  • 매장 등록 API(파트너 전용)
  • 매장 정보 조회 API
  • 매장 정보 수정/삭제 API(파트너 전용)
  • 매장 목록 조회 API(정렬: 가나다순, 별점순, 거리순)
profile
Turning Vision into Reality.

0개의 댓글