2024 12 30
2024-12-30¶
ActionBuilder vs ActionTransformer¶
- 개요
- Play에서 커스텀 Action을 만들때 두가지 경우로 만듦
ActionBuilder[UserRequest, AnyContent]를 직접 상속하여 만드는 방식ActionTransformer[Request, UserRequest]를 활용해 이미 존재하는 Action에 요청 변환만 추가
- 둘 다 타고 올라가면
ActionFunction을 사용
- Play에서 커스텀 Action을 만들때 두가지 경우로 만듦
-
ActionBuilder
- 최종적인 Action을 만들어서 컨트롤러와 바로 연결하는 큰 틀을 제공한다.
- 요청(Request) -> 커스텀 요청(UserRequest) + 바디 파싱(BodyParser) -> 결과
- 새로운 Action을 직접 만들어내는 뿌리 역할
invokeBlock을 통해 실제 요청을 어떻게 처리할 지 결정 가능- 어떤 BodyParser를 쓸지도 결정 가능
object LoginUserAction extends ActionBuilder[UserRequest, AnyRequest] { override def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]): Future[Result] = { request.headers.get("userId") match { // 인증/인가, DB 연결, 바디 파싱 등의 로직 case _ => block(UserRequest(request)) } } override def parser: BodyParser[AnyContent] = bodyParsers.defaultBodyParser }
내가 원하는 대로 새로운 Action을 만드는 목적- BodyParser가 필요하거나, 새로운 Request 타입을 정의하여 처음~끝 까지 조정하고자 할 때 많이 사용
-
ActionTransformer
- 이미 존재하는 ActionFunction 체인에 추가 변환 로직을 삽입한다. (중간 단계)
- 요청(Request) -> 추가/변환된 요청(UserRequest)
- 기존의
ActionFunction(ex.ActionBuilder)의 파이프라인 중간에 끼워, Request를 부분적으로 변환하는 "특화" 기능 - BodyParser를 새로 지정하거나 건드리지 않음.
- 단순히 Request
객체 자체에 데이터를 더 넣어주는/가공하는 용도로 많이 쓰임 - ex. 헤더에서 토큰을 넣어 User 정보를 설정
- 단순히 Request
- 특징
Action,ActionBuilder를 확장하여 요청 변환만 추가하면ActionTransformer가 적합- Body 파싱 자체는 원래
ActionBuilder가 맡고, 여기서는 단순히 Request의 타입 바꿔치기만 할 수도 있음
- 권장
- 필요에 따라
ActionBuilder를 만들고,ActionTransformer를 중간에 끼워 확장해 사용하는 구조 권장.
- 필요에 따라