그누5개발일지 REST API 에 코드 일부분에 관련된 질문입니다.
본문
안녕하세요.
$app->group('/v1/boards/{bo_table}', function (RouteCollectorProxy $group) {
$group->get('', [BoardController::class, 'getBoard']);
...중략...
})
->add(BoardMiddleware::class)
->add(ConfigMiddleware::class);
미들웨어에서
Config미들웨어에서 Config DB 접속하여 Config 없거나 에러 발생시 에러처리 되고
있으면 $request = $request->withAttribute('config', $config);
합니다
그리고 Config 미들웨어 실행 후 안쪽 Board미들웨어 실행 될텐데
Board 미들웨어 내용을 보면
class BoardMiddleware
{
private GroupService $group_service;
private BoardService $board_service;
private BoardPermission $board_permission;
private BoardFileService $file_service;
private CommentService $comment_service;
private WriteService $write_service;
public function __construct(
GroupService $group_service,
BoardService $board_service,
BoardPermission $board_permission,
BoardFileService $file_service,
CommentService $comment_service,
WriteService $write_service
) {
$this->group_service = $group_service;
$this->board_service = $board_service;
$this->board_permission = $board_permission;
$this->file_service = $file_service;
$this->comment_service = $comment_service;
$this->write_service = $write_service;
}
public function __invoke(Request $request, RequestHandler $handler): Response
{
$config = ConfigService::getConfig();
// route_context 사용하여 경로 매개변수 가져오기
$route_context = RouteContext::fromRequest($request)->getRoute();
if ($route_context === null) {
throw new HttpNotFoundException($request, 'url 을 찾을 수 없습니다.');
}
$route_arguments = $route_context->getArguments();
$bo_table = $route_arguments['bo_table'] ?? null;
$board = $this->board_service->getBoard($bo_table);
if (!$board) {
throw new HttpNotFoundException($request, '존재하지 않는 게시판입니다.');
}
$group = $this->group_service->fetchGroup($board['gr_id']);
$request = $request->withAttribute('board', $board);
$request = $request->withAttribute('group', $group);
// 의존성 주입 클래스 설정
$this->board_service->setBoard($board);
$this->board_permission->setConfig($config);
$this->board_permission->setBoard($board);
$this->board_permission->setGroup($group);
$this->file_service->setBoard($board);
$this->comment_service->setBoard($board);
$this->write_service->setBoard($board);
return $handler->handle($request);
}
}
public function __invoke(Request $request, RequestHandler $handler): Response
{
$config = ConfigService::getConfig();
이부분에서 config 를 다시 실행 합니다 DB 조회를 두번 하게 되는 것인데
Config미들웨어에서 $request = $request->withAttribute('config', $config); 를 했으니
Board미들웨어에서 getAttribute('config') 로 써도 되는게 아닌가?
이렇게 한 이유가 있으신지 궁금합니다.
아니면 제가 잘못 알고 있는 것인지
두 미들웨어 사이에 Config 내용이 변화가 있을 수도 있기 때문인가?
정말 아무것도 몰라서 다른 이유 있는지가 궁금하여 질문 드립니다.
!-->!-->
답변 2
Slim 프레임워크에서는 ->add()로 미들웨어를 등록할 때 실행 순서는 역순이기 때문에 선생님 이 정확히 옳은생각을 하고잇는것입니다.
또한
현재 구조에서는 $request->getAttribute('config')를 사용하는 게 더 효율적라는 것이지요.
만약에
BoardMiddleware가 ConfigMiddleware보다 항상 뒤에 실행된다는 보장이 있다면, 리팩토링을 통해 중복 호출을 제거하는 게 좋을수도있습니다.
->add(ConfigMiddleware::class); 이부분이랑 ConfigMiddleware 클래스 내부에도 config가 있어서 궁금하단 말씀인가요??
중간에 생각되는 부분이 있어서 헷갈리네요
$request = $request->withAttribute('config', $config); 이게 어딨나요?
아니면 깃헙 소스코드 공유 해주세요...