Vue Composition API란 무엇인가?
Composition API는 Vue 3에서 공식적으로 도입된 새로운 컴포넌트 작성 방식이다. 기존의 Options API 방식이 아닌, setup()
함수 내에서 reactive state, computed, lifecycle 등을 선언하고 조작할 수 있도록 한다.
Composition API는 코드의 응집도를 높이고, 기능별로 관련된 로직을 하나의 함수 블록 안에 묶을 수 있기 때문에, 규모가 큰 애플리케이션에서도 가독성과 유지보수 측면에서 유리한 구조를 제공한다.
Vue 2에서의 사용
Vue 2에서도 Composition API를 사용할 수 있다. 다만 별도의 플러그인 설치가 필요하다. 다음과 같이 패키지를 추가하면 된다.
npm install @vue/composition-api
이후 Vue.use()
를 통해 전역 등록한 뒤, Vue 3에서와 유사한 방식으로 Composition API를 사용할 수 있다.
Options API와의 비교
기존 Options API는 data
, methods
, computed
등 기능 단위로 코드를 분리하여 작성한다. 아래는 Options API 기반의 간단한 예제다.
export default {
data() {
return {
count: 0
};
},
computed: {
double() {
return this.count * 2;
}
},
methods: {
increment() {
this.count++;
}
}
};
반면, Composition API는 관련 로직을 기능별로 묶을 수 있다. 다음은 동일한 기능을 Composition API로 재작성한 예시다.
import { ref, computed } from 'vue';
export default {
setup() {
const count = ref(0);
const double = computed(() => count.value * 2);
const increment = () => {
count.value++;
};
return {
count,
double,
increment
};
}
};
Composition API는 위처럼 상태와 로직을 하나의 컨텍스트로 묶어, 유지보수성과 재사용성을 크게 향상시킨다. 특히, 복잡한 컴포넌트 또는 상태 분기가 많은 대규모 프로젝트에서는 코드 가독성 및 모듈화에 있어서 명확한 이점을 제공한다.
Composition API의 장점
- 기능 기반 코드 구성: 관련된 로직을 하나의 함수 단위로 묶어 구성 가능
- 재사용성 강화: 로직을 별도의 훅(
useXXX
) 형태로 분리하여 재사용 가능 - TypeScript 호환성 우수: 명시적인 타입 정의 및 추론이 용이
- 가독성 향상: 특히 대형 컴포넌트에서 관련 기능을 한 눈에 파악 가능
Composition API가 적합한 경우
Composition API는 모든 컴포넌트에 반드시 도입해야 하는 것은 아니다. 다만 다음과 같은 상황에서는 도입을 적극 고려해볼 수 있다.
- 컴포넌트의 상태(state)나 로직이 복잡한 경우
- 다수의 공통 기능을 여러 컴포넌트에서 재사용해야 하는 경우
- Composition 기반 라이브러리(VueUse 등)를 사용하는 경우
- TypeScript를 사용하는 프로젝트인 경우
마무리
Composition API는 Vue 3를 사용하는 개발자에게 더 큰 유연성과 구조화된 코드 작성을 가능하게 한다. Vue 2에서도 일부 지원되므로, 기존 프로젝트에도 점진적으로 도입해볼 수 있다.
프로젝트의 규모와 복잡도, 팀의 개발 스타일에 따라 적절히 선택하여 사용하는 것이 중요하며, 특히 장기 유지보수가 필요한 서비스라면 Composition 기반으로의 전환은 충분히 고려할 가치가 있다.
'Vue.js' 카테고리의 다른 글
Vue.js 생명주기 훅 정리 – 언제 뭐가 되는지 순서대로 보자 (0) | 2023.02.16 |
---|---|
Vue에서 커스텀 디렉티브 만들기 – 직접 만든 v-detect 예시로 이해해보자 (0) | 2023.01.11 |
Vue.js 상태관리 라이브러리, Vuex (0) | 2022.12.07 |
[Vue.js] Component (0) | 2022.12.05 |
[Vue.js] Instance, directive (0) | 2022.12.05 |