콘텐츠로 이동

2024 12 30

2024-12-30

ActionBuilder vs ActionTransformer

  • 개요
    • Play에서 커스텀 Action을 만들때 두가지 경우로 만듦
      1. ActionBuilder[UserRequest, AnyContent]를 직접 상속하여 만드는 방식
      2. ActionTransformer[Request, UserRequest]를 활용해 이미 존재하는 Action에 요청 변환만 추가
    • 둘 다 타고 올라가면 ActionFunction을 사용
  • 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 정보를 설정
        def LoginUserAction(userKey: String) = new ActionTransformer[Request, UserRequest] = {
            override protected def transform[A](request: Request[A]): Future[UserRequest[A]] = Future.successful {
                val userId = request.headers.get("userId")
                new UserRequest(userId, request)
            }
        }
        
    • 특징
      • Action, ActionBuilder를 확장하여 요청 변환만 추가하면 ActionTransformer가 적합
      • Body 파싱 자체는 원래 ActionBuilder가 맡고, 여기서는 단순히 Request의 타입 바꿔치기만 할 수도 있음
  • 권장
    • 필요에 따라 ActionBuilder를 만들고, ActionTransformer를 중간에 끼워 확장해 사용하는 구조 권장.