매장 관리 | 매장 등록 API 구현

Faithful Dev·2025년 3월 15일

매장 예약 서비스

목록 보기
5/15

구현한 기능

  • 매장 엔티티 및 관련 JPA 레포지토리 구현
  • 매장 생성/조회/수정/삭제를 위한 서비스 레이어 구현
  • 파트너 전용 매장 관리 API 컨트롤러 구현
  • 특정 파트너에 속한 매장 목록 조회 기능
  • 매장 상세 정보 조회 기능
  • 파트너 권한 검증을 통한 보안 로직 구현

코드 스냅샷

@RestController
@RequestMapping("/api/stores")
@RequiredArgsConstructor
public class StoreController {

    private final StoreService storeService;
    private final AuthenticationUtil authenticationUtil;

    /**
     * 매장 등록 API (파트너 전용)
     */
    @PostMapping("/partners/{partnerId}")
    @PreAuthorize("hasRole('ROLE_PARTNER')")
    public ResponseEntity<ApiResponse<StoreDto.CreateResponse>> createStore(
            @PathVariable Long partnerId,
            @Valid @RequestBody StoreDto.CreateRequest request
    ) {
        // 현재 인증된 사용자가 해당 파트너인지 확인
        authenticationUtil.validatePartnerOwnership(partnerId);

        // 매장 등록 서비스 호출
        StoreDto.CreateResponse response = storeService.createStore(partnerId, request);

        // 응답 반환
        return ResponseEntity.status(HttpStatus.CREATED)
                .body(ApiResponse.success("매장이 성공적으로 등록되었습니다.", response));
    }
}
@Service
@RequiredArgsConstructor
public class StoreService {

    private final StoreRepository storeRepository;
    private final PartnerRepository partnerRepository;

    /**
     * 매장 등록 메서드
     */
    @Transactional
    public StoreDto.CreateResponse createStore(Long partnerId, StoreDto.CreateRequest request) {
        // 매장 이름 중복 확인
        if (storeRepository.existsByName(request.getName())) {
            throw new CustomException(ErrorCode.STORE_NAME_ALREADY_EXISTS);
        }

        // 파트너 확인
        Partner partner = partnerRepository.findById(partnerId)
                .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND));

        // 매장 엔티티 생성
        Store store = Store.builder()
                .name(request.getName())
                .address(request.getAddress())
                .description(request.getDescription())
                .phoneNumber(request.getPhoneNumber())
                .businessHours(request.getBusinessHours())
                .partner(partner)
                .active(true)
                .build();

        // 매장 저장
        Store savedStore = storeRepository.save(store);

        // 응답 DTO 생성 및 반환
        return StoreDto.CreateResponse.builder()
                .storeId(savedStore.getId())
                .name(savedStore.getName())
                .address(savedStore.getAddress())
                .description(savedStore.getDescription())
                .phoneNumber(savedStore.getPhoneNumber())
                .businessHours(savedStore.getBusinessHours())
                .partnerId(partner.getId())
                .createdAt(savedStore.getCreatedAt())
                .build();
    }
}

Postman 테스트






구현 예정

  • 매장 목록 조회 API (정렬: 가나다순, 별점순, 거리순)
profile
Turning Vision into Reality.

0개의 댓글