본문 바로가기

BE,FE(개발)/Java,Python (server)

Minimal APIs vs. Controllers: 무엇이 더 나을까요?

개요

컨트롤러와 Minimal API의 우열을 가리기는 어렵습니다. 상황에 따라 각 접근 방식의 장단점이 다릅니다.

컨트롤러의 문제점

  • 엔드포인트가 늘어나면 복잡성이 증가합니다.
  • 여러 엔드포인트가 서로 다른 서비스를 요구하면 생성자가 복잡해집니다.

Minimal APIs의 장점

  • 메서드 주입 방식으로 필요한 서비스만 주입합니다.
  • 응집력이 높아지고, 성능이 향상되며 메모리 사용량이 적습니다.
  • Vertical Slice Architecture에 적합합니다.

간단하게 설명을 해보겠습니다.

현재 회사에서 사용하는 Fast API (Python) 입니다.

FastAPI (Python)

FastAPI는 기본적으로 Minimal API 스타일을 지원하며, 이는 API 엔드포인트마다 필요한 서비스를 주입할 수 있는 간단하고 직관적인 방식입니다.

Controllers: FastAPI에서는 명확한 Controller 개념은 없지만, 라우터를 이용해 유사하게 구현할 수 있습니다.

from fastapi import APIRouter, Depends

router = APIRouter()

@router.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}


Minimal APIs
: FastAPI는 엔드포인트마다 필요한 서비스를 주입할 수 있습니다.

from fastapi import FastAPI, Depends

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int, db: Session = Depends(get_db)):
    return {"item_id": item_id, "db": db}

 

이제는 spring으로 구현을 해보겠습니다.

 
  • Spring Boot (Java)
    • Controllers: Spring Boot에서 Controller는 엔드포인트가 늘어남에 따라 복잡해질 수 있습니다.
@RestController
public class ItemController {

    @GetMapping("/items/{itemId}")
    public ResponseEntity<Item> getItem(@PathVariable int itemId) {
        return ResponseEntity.ok(new Item(itemId));
    }
}

 

그리고 몰랐는데 @bean으로 minimalAPIs 가 가능했습니다.

@Configuration
public class ItemRoutes {

    @Bean
    public RouterFunction<ServerResponse> route(ItemHandler handler) {
        return RouterFunctions.route(GET("/items/{itemId}"), handler::getItem);
    }
}

@Component
public class ItemHandler {

    public Mono<ServerResponse> getItem(ServerRequest request) {
        String itemId = request.pathVariable("itemId");
        return ServerResponse.ok().body(BodyInserters.fromValue(new Item(itemId)));
    }
}

Minimal APIs: Spring Boot 3.0부터는 @Bean을 사용하여 간단한 API를 정의할 수 있습니다.

 

 

결론

무엇이 더 나은가?

  • Controllers: 많은 엔드포인트와 복잡한 로직을 관리하기에 좋습니다. 그러나 복잡성이 증가할 수 있습니다.
  • Minimal APIs: 더 나은 응집력과 성능을 제공하며, 필요한 서비스만 주입합니다. 새로운 프로젝트에 적합합니다.

모든 컨트롤러를 Minimal API로 전환할 필요는 없습니다. 팀의 경험과 선호도에 따라 적절한 접근 방식을 선택하세요. 새로운 프로젝트에서는 Minimal API를 고려해보세요.