본문 바로가기
프로그래밍

Spring Boot 관리자 상품 기능 구현 및 테스트 자동화

by 밤이씌 2025. 4. 2.

💻 Spring Boot 관리자 상품 기능 구현 및 테스트 자동화

오늘은 Spring Boot 기반의 웹 애플리케이션에서 관리자 상품 CRUD 기능을 개발하고, 이를 MockMvc로 테스트 자동화한 과정을 정리해봅니다.
사용자 상품 기능과 구조는 유사하지만, 관리자 전용 API인 만큼 권한 인가AOP 적용 여부, 테스트 무력화 방식 등에 차이가 있었습니다.


🛠️ 개발한 기능 요약

다음과 같은 관리자 전용 상품 기능을 개발했습니다:

  • 상품 등록 (POST /api/admin/products)
  • 상품 전체 조회 (GET /api/admin/products)
  • 상품 수정 (PUT /api/admin/products)
  • 상품 삭제 (DELETE /api/admin/products/{id})

이 기능들은 모두 @AdminCheckPermission 어노테이션을 통해 관리자 권한을 확인하도록 설계했습니다.


✅ API Controller 핵심 코드

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/admin/products")
public class AdminProductController {

    private final AdminProductService productService;

    @PostMapping
    @AdminCheckPermission(resource = "PRODUCT_CREATE")
    public ResponseEntity<?> create(@RequestBody ReqAdminProductDto dto) {
        productService.create(dto);
        return ResponseEntity.ok("상품이 등록되었습니다.");
    }

    @GetMapping
    @AdminCheckPermission(resource = "PRODUCT_READ")
    public ResponseEntity<List<ResAdminProductDto>> getAll() {
        return ResponseEntity.ok(productService.getAll());
    }

    @PutMapping
    @AdminCheckPermission(resource = "PRODUCT_UPDATE")
    public ResponseEntity<?> update(@RequestBody ReqAdminProductDto dto) {
        productService.update(dto);
        return ResponseEntity.ok("상품이 수정되었습니다.");
    }

    @DeleteMapping("/{id}")
    @AdminCheckPermission(resource = "PRODUCT_DELETE")
    public ResponseEntity<?> delete(@PathVariable Long id) {
        productService.delete(id);
        return ResponseEntity.ok("상품이 삭제되었습니다.");
    }
}

🧪 테스트 자동화 (MockMvc)

MockMvc를 사용해 관리자 API를 테스트했습니다.
AOP로 구현된 관리자 권한 체크는 @MockBean을 이용해 무력화했습니다.
 
 

@SpringBootTest
@AutoConfigureMockMvc
@Import(TestConfig.class)
public class AdminProductControllerTest {

    @MockBean
    private AdminPermissionAspect adminPermissionAspect; // 권한 체크 무력화

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    @DisplayName("관리자 상품 등록 테스트")
    public void testCreateAdminProduct() throws Exception {
        ReqAdminProductDto dto = ReqAdminProductDto.builder()
                .productCategoryId(1L)
                .productType(1)
                .productCode("P001")
                .productName("관리자 테스트 상품")
                .subtitle("관리자 테스트 상품 부제")
                .price(10000)
                .isPromoted(true)
                .status(1)
                .productLanguageId(1L)
                .productRegisterId(1L)
                .build();

        mockMvc.perform(post("/api/admin/products")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(dto)))
                .andExpect(status().isOk());
    }

    @Test
    @DisplayName("관리자 상품 전체 조회 테스트")
    public void testGetAllAdminProducts() throws Exception {
        mockMvc.perform(get("/api/admin/products"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$").isArray());
    }

    @Test
    @DisplayName("관리자 상품 수정 테스트")
    public void testUpdateAdminProduct() throws Exception {
        ReqAdminProductDto dto = // 기존 데이터 기준 수정 DTO 구성

        mockMvc.perform(put("/api/admin/products")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(dto)))
                .andExpect(status().isOk())
                .andExpect(content().string("상품이 수정되었습니다."));
    }

    @Test
    @DisplayName("관리자 상품 삭제 테스트")
    public void testDeleteAdminProduct() throws Exception {
        mockMvc.perform(delete("/api/admin/products/1"))
                .andExpect(status().isOk())
                .andExpect(content().string("상품이 삭제되었습니다."));
    }
}

 

 

참고: 삭제 테스트는 실제 ID 1번 상품이 DB에 있어야 통과됩니다.
임시로 상품 등록 -> 삭제 순서로 테스트할 수 있습니다.

 


✨ 마무리 및 내일 계획

  • 오늘은 기능 개발과 테스트를 완성했고, 권한 체크는 무력화된 상태에서 진행했습니다.
  • 내일은 AOP 기반 관리자 권한 인가가 실제로 동작하는지 테스트를 작성해볼 예정입니다.
  • 또한, 단건 조회 기능을 상품명 기반으로 변경하는 리팩토링도 계획하고 있습니다.

'프로그래밍' 카테고리의 다른 글

[html]html정의(생활코딩 강의 정리)  (0) 2017.11.15

댓글