* 레포지토리 패턴은 대부분 백엔드 내용이 많은데 프론트에도 쓰일 수 있나 해서 찾아본 글입니다!
듣기로는 백엔드에도 repository-service-controller 3계층으로 나누고 repository 계층에서 data source(DB)에 접근하는것으로 알고 있다.
이 글은 https://medium.com/backenders-club/consuming-apis-using-the-repository-pattern-in-vue-js-e64671b27b09를 개인 공부용으로 요약한 내용이고 틀린 오역이 있을수도 있습니다.
레포지토리 패턴이란?
데이터 출처에 관계없이 동일한 인터페이스로 접속할 수 있는 디자인 패턴
보통 코드를 짜면 네트워크 요청을 할때 fetch/axios와 강한 결합도를 가지고 변경에 유연하지 않은데
중간에 인터페이스를 둬
1. data acess code 재사용
2. (도메인별로 repositiory를 나눴을때) domain logic 사용이 쉬워짐
3. logic의 결합도 감소
4. data access logic 과 business logic이 분리되어 테스트가 더 쉬워짐
5. DI의 개념이 추가됨 -> 테스트가 더 쉬워짐
5개의 장점을 가질 수 있다.
4, 5번은 클린코드에서 말한
아직 존재하지 않는 코드를 사용하기
경계와 관련해 또 다른 유형은 아는 코드와 모르는 코드를 분리하는 경계다.
ex) 저쪽 팀이 아직 API를 설계하지 않았으므로 구체적인 방법은 모를때 구현을 미루고 이쪽 코드를 진행하기 위해 자체적으로 인터페이스를 정의한다. - 경계 part
경계를 구현하다보니 부수적으로 얻어지는 효과인거 같다.
테스트시 or 백엔드에서 아직 구현이 안되었을시엔 프론트에서 mocking api를 사용하다 백엔드에서 구현이 완료되었을경우 손쉽게 갈아치울 수 있을걸로 보인다.
// 03-28 추가
서비스워커에서 api 요청을 가로채서 프론트단에서 dummy data를 구현 안해도 되는 msw 라는걸 알게 되었다.
https://tech.kakao.com/2021/09/29/mocking-fe/
Mocking으로 생산성까지 챙기는 FE 개발
안녕하세요. 카카오엔터프라이즈 검색플랫폼프론트파트의 Lawrence.net입니다. 프론트엔드 개발 업무의 효율성을 높이기 위한 방법의 하나로 고민해 본 Mocking에 대해 설명하고 이를 적용했던 사례
tech.kakao.com
예제 코드
axiosclient.js
import axios from "axios";
const baseDomain = "https://jsonplaceholder.typicode.com";
const baseURL = `${baseDomain}`; // Incase of /api/v1;
// ALL DEFUALT CONFIGURATION HERE
export default axios.create({
baseURL,
headers: {
// "Authorization": "Bearer xxxxx"
}
});
우선 기본 axios를 정의한다.
repository.js
import Client from './Clients/AxiosClient';
const resource = '/posts';
export default class Repository {
constructor({resource}){
this.resource = resource;
}
get() {
return Client.get(`${this.resource}`);
},
getPost(id) {
return Client.get(`${this.resource}/${id}`);
},
create(payload) {
return Client.post(`${this.resource}`, payload);
},
update(payload, id) {
return Client.put(`${this.resource}/${id}`, payload);
},
delete(id) {
return Client.delete(`${this.resource}/${id}`)
},
// MANY OTHER ENDPOINT RELATED STUFFS
};
기본 repository에 CRUD를 구현하고 필요시 상속 or 확장으로 메소드를 추가한다.
예를 들어 /user, /item, /car 등 여러 경로(도메인?)마다 기본 CRUD가 필요하다면 Repository를 상속만으로 각각 UserRepository, ItemRepositoy, CarRepository 를 사용해 기본 CRUD를 빠르게 구현할 수 있고 추가 메소드를 유연하게 붙여줄 수 있다.
repositoryFactory.js
import PostRepository from './PostRepository'; // 만들어서 export?
import UserRepository from './UserRepository';
const repositories = {
'posts': PostRepository,
'users': UserRepository
}
export default {
get: name => repositories[name]
};
레포지토리 생성은 팩토리 메소드 패턴을 이용한다.
각 도메인별로 이름을 붙이면 될 듯 하다.
Posts.js
<template>
<div class="row">
<Post v-for="(post, i) in posts" :key="i" :posts="post" />
<div class="col-lg-8 col-md-10 mx-auto">
<div class="clearfix">
<a class="btn btn-primary float-right" href="#">Older Posts →</a>
</div>
</div>
</div>
</template>
<script>
import Repository from "../repositories/RepositoryFactory";
const PostRepository = Repository.get("posts");
import Post from "./Post";
export default {
name: "Posts",
components: {
Post
},
data() {
return {
posts: []
};
},
created() {
this.getPosts();
},
methods: {
getPosts: async function() {
const { data } = await PostRepository.get();
this.posts = data;
}
}
};
</script>
Vue.js 예제인데 코드 흐름을 이해하는건 어렵진 않다.
사용하는 입장(Posts.js)에서는 레포지토리의 세부 사항을 알 필요가 없으므로 data access logic과 business logic이 분리되었다.
reference
https://blog.hanlee.io/2019/do-front-ends-dream-of-back-ends
프론트엔드는 백엔드의 꿈을 꾸는가?
점점 더 복잡해지는 프론트엔드와 백엔드의 유사점을 알아봅시다
blog.hanlee.io
https://blog.logrocket.com/implementing-repository-pattern-flutter/
Implementing a repository pattern In Flutter - LogRocket Blog
Write more manageable codebases for your Flutter apps by decoupling data access and business logic according to the repository design pattern.
blog.logrocket.com
Consuming APIs Using the Repository Pattern in Vue.js
in this article, we will be discussing how to consume API data with Vue.js using the Repository Pattern.
medium.com
'소프트웨어공학 > 디자인패턴' 카테고리의 다른 글
React Compound Component 패턴 (0) | 2022.06.15 |
---|---|
메모 (0) | 2022.03.25 |
[행위] 책임 연쇄 패턴 (0) | 2022.03.13 |
[행위] 전략 패턴 & 커맨드 패턴 (0) | 2022.03.07 |
[행동] 중재자 패턴 (1) | 2022.03.01 |