$resource는 $http에 리소스 주소를 설정하여 추상화해 놓은 앵귤러 서비스다. 이것을 한번더 앵귤러 Service()로 감싸면 백엔드 자원에 대해 한단계 더 추상화 할 수 있다. 결과만 놓고 보면 User 서비스로 간단하게 백엔드 자원을 다룰 수있다.
$scope.user = User.get({ userId: 123 }); // 유저 데이터를 얻는다.
$scope.user.name = "Edited Username"; // 유저 데이터를 수정한다.
$scope.user.$save(); // 수정한 유저 데이터를 저장한다.
위와 같은 User 서비스를 구현해 보자. service()함수로 User 서비스를 만드는데 $resource를 통해 백엔드 리소스 주소와 파라메터(userId)를 설정한 뒤 $resource 객체를 반환한다. 이제 어디에서건 User 서비스를 주입하여 백엔드 자원에 접근할 수 있다.
angular.module('myApp')
.service('User', function ($resource) {
// 리소스 객체를 반환한다.
return $resource(
'/user/:userId
{
userId: '@userId'
}
);
});
$resource 객체를 서비스로 감싸면 $resource 객체 생성시 추가 설정을 User 서비스에서 설정할 수 있는 장점이 있다. 만약 그렇지 않고 $resource 객체 생성시마다 설정한다면 코드 중복이 상당할 수 있기 때문이다. 아래 코드를 보자. $resourece 객체는 메소드 별로 요청 데이터나 응답데이터를 수정할 수 있고 캐쉬를 설정하거나 해제할 수 있다. 이런 복잡한 정보들을 User서비스에서 한번만 설정하고 다른 컨트롤러나 서비스에서 User 서비스만 호출하여 간단히 사용할 수 있다.
angular.module('myApp')
.service('User', function ($resource, $cacheFactory) {
return $resource(
'/user/:userId',
{
userId: '@userId'
},
{
get: {
isArray: false,
cache: true, // 캐쉬 설정
// get 메소드 응답 데이터를 수정할 한다.
transformResponse: function(data) {
data = angular.fromJson(data); // 문자열 데이터를 객체화 한다.
// 프론트앤드에서 사용하기 적합한 형태로 data 객체를 수정한다.
return data; // 수정한 data 객체를 반환한다.
}
},
update: {
method: 'PUT',
isArray: false,
transformResponse: function(data) {
$cacheFactory.get('$http').removeAll(); // 캐쉬데이터를 삭제한다.
data = angular.fromJson(data);
// 프론트앤드에서 사용하기 적합한 형태로 data 객체를 수정한다.
return data;
}
}
});
});