개요
컨트롤러와 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를 고려해보세요.
'BE,FE(개발) > Java,Python (server)' 카테고리의 다른 글
| 이제 와서 정리해보는 파이썬과 자바의 GC(garbage Collector) (0) | 2024.08.16 |
|---|---|
| 파이썬에서 SQL 쿼리 관리: .py 파일 vs YAML 파일 (0) | 2024.07.30 |
| 면접 공부를 하다 DI를 공부하다.(Spring) (0) | 2023.01.14 |
| MVC 패턴 입문 [개발자 면접 준비] for Junior's (0) | 2023.01.08 |
| Spring 에서 알아야 할 기본적인 Annotation 개념 및 예제 (0) | 2023.01.05 |