AUTOLOAD는 패키지 내에서 존재하지 않는 메서드나 함수의 호출을 동적으로 처리할 수 있게 해줍니다. 이는 프록시 객체 생성, 동적으로 생성된 메서드(ORM), 지연 로딩 로직 도입 등에 유용합니다.
AUTOLOAD 사용 예:package MyAuto; sub AUTOLOAD { our $AUTOLOAD; my ($self, @args) = @_; my ($method) = $AUTOLOAD =~ /::(\w+)$/; print "호출된 $method c @args "; } package main; my $obj = bless {}, 'MyAuto'; $obj->any_method(1,2,3); # AUTOLOAD 호출
new, DESTROY 호출을 잡지 않습니다.질문: 존재하지 않는 생성자 new를 호출하려고 할 때 AUTOLOAD가 호출됩니까?
답변: 아닙니다. Perl은 생성자 new를 패키지에서 직접 검색하며, 발견되지 않을 경우 AUTOLOAD를 호출하지 않습니다. AUTOLOAD는 일반 메서드 호출 시에만 호출됩니다.
package Foo; sub AUTOLOAD { print "AUTOLOAD! "; } # $obj = Foo->new(); # 오류: Can't locate object method "new" ...
이야기 암호 서비스에서 AUTOLOAD를 통해 다수의 유사한 메서드를 프록시화 했습니다. 어느 날 DESTROY 메서드 처리를 잊어버려 객체 종료 시 무한 재귀 호출이 발생하여 스크립트가 종료되었습니다.
이야기 ORM에서 AUTOLOAD를 사용해 필드 접근 마법을 구현했으나, 메서드가 실제로 없을 경우 올바른 값 반환을 구현하지 않았습니다. 이로 인해 perl이 "Can't locate..." 대신 혼란스러운 메시지를 출력했고, 버그는 프로덕션에서만 나타났습니다.
이야기 리팩토링 중 실제 메서드의 일부를 제거하여 모든 호출이 AUTOLOAD를 통해 이루어졌습니다. 이로 인해 대규모 작업의 성능이 급격히 저하되었습니다(백만 개 객체 배열 처리가 리팩토링 이전보다 10~15배 더 오래 걸리게 되었습니다).