이 둘은 Vue 컴포넌트를 작성하는 두 가지 방식입니다. Options API는 옵션 타입(data, methods, computed)별로 코드를 구성하고, Composition API는 ref, computed, 같은 함수를 사용해 별로 코드를 구성합니다.
setup<script>
export default {
data() { return { count: 0 }; },
computed: { double() { return this.count * 2; } },
methods: { increment() { this.count++; } },
mounted() { console.log("mounted"); },
};
</script>
모든 것이 고정된 버킷(data, methods, computed, 라이프사이클)으로 묶입니다. 단순하고 찾기 쉽지만, 하나의 기능 로직이 이 버킷들에 흩어집니다.
<script setup>
import { ref, computed, onMounted } from "vue";
// "카운터"에 대한 모든 로직이 함께 있음
const count = ref(0);
const double = computed(() => count.value * 2);
function increment() { count.value++; }
onMounted(() => console.log("mounted"));
</script>
하나의 관심사에 대한 상태, computed, 메서드, 라이프사이클이 함께 위치하며, <script setup>은 이를 간결하게 만듭니다(this 없음, return 없음).
Composition API는 상태 기반 로직을 일반 함수(composable)로 추출하고 재사용하게 해줍니다.
// useCounter.js — 어떤 컴포넌트에서든 재사용 가능
export function useCounter() {
const count = ref(0);
const increment = () => count.value++;
return { count, increment };
}
<script setup>
const { count, increment } = useCounter(); // 어디서나 재사용
</script>
이는 Options API에서 어색했던 로직 재사용 문제를 깔끔하게 해결합니다(mixin은 이름 충돌과 불명확한 출처 문제가 있었습니다).
Options API → 단순한 멘탈 모델, 작은 컴포넌트에 적합, 초보자에게 친숙
Composition API → 큰 컴포넌트, TypeScript, 로직 재사용(composable)에 더 적합
Composition API(<script setup>과 함께)는 특히 TypeScript와 함께 새 Vue 3 프로젝트의 권장 기본값입니다.
Composition API는 컴포넌트 로직을 구성하고 재사용하는 것에 대한 Vue 3의 답입니다.
옵션 타입이 아니라 기능별로 코드를 묶고 composable을 가능하게 한다는 점을 이해하면 — Options API의 옵션 기반 버킷과 대비하여 — 현대 Vue 스타일과 복잡한 컴포넌트 및 TypeScript 코드베이스가 그것을 선호하는 이유를 알 수 있습니다.
둘 다 완전히 지원되며, 섞어 쓸 수도 있습니다.