Dart 백엔드
Dart 로 백엔드를 구성해보자는 생각을 했고 처음에는 Shelf를 시도했습니다.
Shelf 는 정말 코어에 가깝고 대부분을 직접 구현해야 합니다.
장점으로는 자유롭다이고 단점으로는 아무것도 없다 입니다.
하나의 핸들러 클래스를 만들고 거기에 어떤 라우팅을 넣을것인지 정의하고
라우팅 넣을때 미들웨어를 하나하나씩 정의 해야 합니다.
Router get userRouter {
final router = Router();
router.get('/profile', (Request request) {
return Response.ok('사용자 프로필 정보입니다.');
});
return router;
}
// --- System Router ---
Router get systemRouter {
final router = Router();
router.get('/health', (Request request) {
return Response.ok('서버 상태 양호 (OK)');
});
return router;
}
final mainRouter = Router();
mainRouter.mount('/users/', userRouter.call);
mainRouter.mount('/system/', systemRouter.call);
...
}
계층구조에 따라 여러개의 핸들러를 쓰고 (예:userRouter, systemRouter) 그것을 메인 라우터에 합쳐서 통일 시키는 등의 방법을 쓸 수 있습니다.
void main() {
final router = Router();
final basePipeline = const Pipeline().addMiddleware(logRequests());
router.get('/test', basePipeline.addHandler((req) => Response.ok('Test!')));
final authPipeline = basePipeline.addMiddleware(_authMiddleware());
router.get('/profile', authPipeline.addHandler((req) => Response.ok('Profile!')));
}
이렇게 미들웨어가 끼기 시작하면 어디까지 뭘 붙이는지 꼬이게 됩니다.
A, B, C, D 의 미들웨어가 있다고 했을때 A, AB, ABC 순서라면 상관없지만 AB와 AC가 있는 순간 미들웨어 배치 코드가 조금 지저분해 지기는 합니다.
물론 잘 쪼개고 정리하면 되겠지만 저에게는 약간 지저분해 보였습니다.
DartFrog에서는 계층으로 처리됩니다.

routes 하위에 폴더를 만들면 그게 바로 라우팅 경로가 됩니다.
만일 routes 에 _middleware.dart 파일을 만들면 그것은 미들웨어로 동작하게 되고 그 하위 경로는 모두 해당 미들웨어를 지나가게 됩니다.
계층이 직관적으로 미들웨어가 동작하는 순서가 됩니다.
또한 index.dart를 만들면 해당 경로에서 동작하는 내용이 됩니다.
routes 에 로그 미들웨어 두고 auth 에 인증 미들웨어 두게되면 routes 바로 밑에 index.dart를 두게 되면 인증 미들웨어가 동작하지 않는것이지요.
저에게는 이 방식이 좀 더 와닿았고 조금 더 직관적이었습니다.

다만 문제는 파일이름이 같다보니 위와 같이 죄다 _middleware.dart 아니면 index.dart가 됩니다.
그래서 저는 snippet으로 현재 경로를 찍는 snippet을 만들어 놧습니다.
"Dart Frog Route Header": {
"prefix": "route",
"body": [
"import 'package:dart_frog/dart_frog.dart';",
"",
"// ${RELATIVE_FILEPATH/routes\\/(.*)\\.dart/\\/$1/}",
"Future<Response> onRequest(RequestContext context) async {",
" final data = await context.postJson();",
" $0",
" return Response.json(body: {'message': ''});",
"}"
],
"description": "현재 경로를 주석으로 포함하는 Dart Frog onRequest 생성"
}
DartFrog도 Shelf위에 동작하는 것이라고 하는데 제 느낌에는 DartFrog가 조금 더 정리되어 있는 것 같습니다.
특히나 미들웨어 개념이 정말 잘 짜여진거 같습니다.
물론 여기서 Shelf에서 말한 AB, AC 와 같은 미들웨어 문제가 없는것은 아니라서 중복된 내용을 피할수 없습니다.
그렇지만 잘개 쪼개져 있고 해당 내용만 표시하고 있어서 관리의 용이성이 있다고 생각합니다.
좀 더 많은 자유를 원하신다면 Shelf를
파일구조로 체계화를 원하신다면 DartFrog를 사용하시면 될것 같습니다.
어디서 뭐가 되고 뭐가 안되고는 없습니다.