코어데이터(Core Data) 한줄로 데이터 불러오기

코어 데이터는 익숙해지면 매우 편리한 기능을 제공해주지만 한번 사용하려고 할 때 마다 셋업해줘야 할 것들이 매우 많아서 처음 접해보는 개발자들에게 문턱이 높은 편이다.

애플의 Core Data Programming Guide에서 데이터를 불러오기(fetch)위해 사용하는 코드는 다음과 같다.

NSManagedObjectContext *moc = [self managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
    entityForName:@"Employee" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];

// Set example predicate and sort orderings...
NSNumber *minimumSalary = ...;
NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"(lastName LIKE[c] 'Worsley') AND (salary > %@)", minimumSalary];
[request setPredicate:predicate];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
    initWithKey:@"firstName" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

NSError *error = nil;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil)
{
    // Deal with error...
}

단순히 데이터를 불러오기 위해 13줄이나 코드를 쓰는 것은 고역이다.

NSManagedObjectContext에 대해 카테고리를 사용한 함수(OnelineFetch 다운로드)를 추가하면 동일 효과를 지닌 코드를 을 다음과같은 한줄의 메서드로 줄여서 사용할 수 있다.

[[self managedObjectContext] fetchObjectsForEntityName:@"Employee" withPredicate:
    @"(lastName LIKE[c] 'Worsley') AND (salary > %@)", minimumSalary];

위 메서드는 매우 잘 동작하지만, 코드를 호출할 때 마다 매번 NSPredicate 생성하기 때문에 최적화된 속도를 내지는 못하며 NSFetchRequest의 기본값만을 사용하므로 상세한 옵션설정이 불가능하다. 하지만 특별히 속도 최적화가 필요한 핵심구문이 아니라면, 대부분 이렇게 한줄로 간단하게 코딩하는 편이 훨씬 간단명료하다.

해당 one line fetch 메서드 내부에 정렬 기능을 제외했기 때문에 객체들이 특별히 순서없이 리턴될 것이라 NSSet이 리턴타입으로 지정되어 있다. 물론 NSSetNSArray보다 생성시 오버헤드가 약간 더 크지만, 앞서 말했듯이 대부분의 경우 최적화가 필요한 부분이 아닌곳에 간편하게 쓰는 용도로 사용하면 된다.

출처 및 저작권 관련 정보

이 글의 저작권은 CocoaWithLove.com을 운영중인 Matt Gallagher 에게 있고, 저자의 동의하에 한국어로 번역되었습니다. 원본 글은 다음 링크를 통해 접근 가능합니다.
Link to original article