Vue 3 Composition API에서 라우터 사용하기

Vue 3의 Composition API(setup)에서는 this를 사용할 수 없어 라우터 접근 방식이 다릅니다. useRouter와 useRoute 컴포저블을 활용하는 방법을 알아봅니다.

1. 기본 설정

import { useRouter, useRoute } from "vue-router";

export default {
  setup() {
    const router = useRouter();  // 라우터 인스턴스
    const route = useRoute();    // 현재 라우트 정보
    
    return { router, route };
  }
}

2. 프로그래밍 방식 네비게이션

import { useRouter } from "vue-router";

export default {
  setup() {
    const router = useRouter();
    
    // 경로로 이동
    const goToHome = () => {
      router.push("/");
    };
    
    // 이름으로 이동
    const goToUser = (id) => {
      router.push({ name: "User", params: { id } });
    };
    
    // 쿼리 파라미터 포함
    const search = (keyword) => {
      router.push({ 
        path: "/search", 
        query: { q: keyword } 
      });
    };
    
    // 히스토리 교체 (뒤로가기 불가)
    const replaceRoute = () => {
      router.replace("/new-page");
    };
    
    // 뒤로가기
    const goBack = () => {
      router.go(-1);
    };
    
    return { goToHome, goToUser, search, goBack };
  }
}

3. 현재 라우트 정보 접근

import { useRoute } from "vue-router";
import { computed } from "vue";

export default {
  setup() {
    const route = useRoute();
    
    // 현재 경로
    console.log(route.path);      // "/user/123"
    
    // URL 파라미터
    console.log(route.params.id); // "123"
    
    // 쿼리 스트링
    console.log(route.query.tab); // "profile"
    
    // 라우트 이름
    console.log(route.name);      // "UserDetail"
    
    // 반응형으로 감시
    const userId = computed(() => route.params.id);
    
    return { userId };
  }
}

4. 네비게이션 가드

import { onBeforeRouteLeave, onBeforeRouteUpdate } from "vue-router";

export default {
  setup() {
    // 페이지 떠나기 전
    onBeforeRouteLeave((to, from) => {
      const answer = window.confirm("저장하지 않고 나가시겠습니까?");
      if (!answer) return false;
    });
    
    // 같은 컴포넌트 내 라우트 변경 시
    onBeforeRouteUpdate((to, from) => {
      console.log("라우트 업데이트:", to.params.id);
    });
  }
}

5. script setup 문법

<script setup>
import { useRouter, useRoute } from "vue-router";

const router = useRouter();
const route = useRoute();

const navigate = () => {
  router.push("/dashboard");
};
</script>

Options API vs Composition API 비교

기능Options APIComposition API
라우터this.$routeruseRouter()
라우트this.$routeuseRoute()
이동this.$router.push()router.push()

주의사항

  • useRouter/useRoute는 반드시 setup() 내부에서 호출
  • route 객체는 반응형이므로 watch 가능
  • params 변경 감지 시 computed나 watch 활용