반응형

Vue Router는 Vue.js 애플리케이션에서 라우팅을 관리하는 공식 라이브러리입니다.

라우팅이란 사용자가 특정 URL을 요청했을 때, 그 URL에 맞는 페이지나 컴포넌트를 제공하는 기능을 말합니다.

Vue Router를 사용하면 단일 페이지 애플리케이션(SPA)에서 페이지 간 네비게이션을 쉽게 구현할 수 있습니다.



1. Vue Router 설치

 

먼저 Vue Router를 프로젝트에 설치해야 합니다.

 

npm install vue-router@next

이 명령어는 Vue 3용 Vue Router를 설치합니다. 설치가 완료되면 Vue Router를 프로젝트에 추가할 수 있습니다.

 

2. 라우터 설정 (router/index.js)

 

프로젝트의 src 디렉토리 아래에 router 폴더를 만들고, 그 안에 index.js 파일을 생성합니다. 이 파일에서 라우터를 설정합니다.

import { createRouter, createWebHistory } from 'vue-router'
import ToDoList from '../components/ToDoList.vue'
import TodoDetail from '../components/TodoDetail.vue'

const routes = [
  { path: '/', name: 'Home', component: ToDoList },
  { path: '/todo/:id', name: 'TodoDetail', component: TodoDetail, props: true }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

createRouter: Vue 3에서 라우터를 생성하는 함수입니다.

createWebHistory: HTML5의 history 모드를 사용하는 함수로, 브라우저의 URL을 깔끔하게 유지합니다.

routes: 경로와 그에 연결된 컴포넌트를 정의하는 배열입니다.

props: true: 라우트 파라미터를 컴포넌트의 props로 전달할 때 사용합니다.

 

3. 라우터를 Vue 애플리케이션에 추가 (main.js)

 

이제 main.js 파일에서 Vue 애플리케이션에 라우터를 추가해야 합니다.

import { createApp } from 'vue'
import App from './App.vue'
import vuetify from './plugins/vuetify'
import { loadFonts } from './plugins/webfontloader'
import router from './router'  // Vue Router를 가져옵니다.

loadFonts()

createApp(App)
  .use(vuetify)
  .use(router)  // Vue Router를 사용합니다.
  .mount('#app')

여기서 router를 Vue 애플리케이션에 use하여 라우터를 활성화합니다.

 

4. App.vue에서 라우터 뷰 설정

 

App.vue 파일에서 router-view 컴포넌트를 사용하여 현재 라우터에 맞는 컴포넌트를 렌더링할 수 있도록 설정합니다.

<template>
  <v-app>
    <v-container>
      <router-view />  <!-- 라우터가 렌더링할 컴포넌트가 여기에 표시됩니다. -->
    </v-container>
  </v-app>
</template>

<script>
export default {
  name: 'App',
}
</script>

router-view: Vue Router에서 제공하는 컴포넌트로, 현재 라우트에 맞는 컴포넌트를 렌더링합니다.

 

5. 페이지 컴포넌트 작성

 

각 라우트에 연결된 컴포넌트를 작성합니다. 예를 들어, ToDoList.vueTodoDetail.vue 파일을 작성합니다.

 

ToDoList.vue

<template>
  <v-container>
    <v-row>
      <v-col>
        <h1>Vue.js To-Do App</h1>
        <AddTodo @add-todo="addTodo" />
        <v-list>
          <v-list-item
            v-for="(todo, index) in todos"
            :key="index"
            @click="$router.push({ name: 'ToDoDetail', params: { id: index } })"
          >
            <template v-slot:prepend>
              <v-checkbox
                v-model="todo.completed"
                @change="saveTodos"
                hide-details
              />
            </template>
            
            <v-list-item-title>{{ todo.text }}</v-list-item-title>
            
            <template v-slot:append>
              <v-btn icon="mdi-delete" size="small" @click.stop="removeTodo(index)">
              </v-btn>
            </template>
          </v-list-item>
        </v-list>
      </v-col>
    </v-row>
  </v-container>
</template>

<script>
import AddTodo from './AddTodo.vue'

export default {
  name: 'ToDoList',
  components: { AddTodo },
  data() {
    return {
      todos: []
    }
  },
  mounted() {
    const savedTodos = localStorage.getItem('todos')
    if (savedTodos) {
      this.todos = JSON.parse(savedTodos)
    }
  },
  methods: {
    addTodo(newTodo) {
      this.todos.push({ text: newTodo, completed: false })
      this.saveTodos()
    },
    removeTodo(index) {
      this.todos.splice(index, 1)
      this.saveTodos()
    },
    saveTodos() {
      localStorage.setItem('todos', JSON.stringify(this.todos))
    }
  }
}
</script>

$router.push: 사용자가 클릭할 때 특정 라우트로 이동합니다.

params: { id: index }: 라우트 파라미터로 id를 전달합니다.

 

ToDoDetail.vue

<template>
  <v-container>
    <h2>To-Do Detail</h2>
    <v-card>
      <v-card-text>
        <p>ID: {{ id }}</p>
      </v-card-text>
    </v-card>
    <v-btn @click="$router.push('/')">Back</v-btn>
  </v-container>
</template>

<script>
export default {
  props: {
    id: {
      type: String,
      required: true
    }
  }
}
</script>

props: { id }: 라우트 파라미터로 전달된 id를 컴포넌트에서 사용합니다.


이전 블로그
vue to-do 리스트 구현 4 - vuetify 적용

https://juntcom.tistory.com/319

반응형
반응형

1. AWS DMS 설정 준비

 

1. RDS 인스턴스 생성

이미 RDS 인스턴스가 생성되어 있다면 이 단계를 건너뛰세요.

RDS에서 MySQL 인스턴스를 생성합니다. 인스턴스 생성 과정에서 적절한 VPC, 서브넷, 보안 그룹 설정을 확인해야 합니다.

 

 

2. IAM 역할 생성

AWS DMS에 필요한 IAM 역할을 생성해야 합니다.

필요한 권한은 AmazonDMSVPCManagementRole, AmazonDMSCloudWatchLogsRole, AmazonDMSRedshiftS3Role입니다.

 

2. AWS DMS 구성

 

1. Replication Instance 생성

AWS Management Console에서 DMS 서비스로 이동합니다.

Replication Instances에서 새로운 레플리케이션 인스턴스를 생성합니다. -

Replication instances를 선택한 후 Create replication instance를 클릭합니다.

복제 인스턴스 세부 정보를 입력합니다:

인스턴스 식별자: dms-replication-instance

인스턴스 클래스: 요구 사항에 맞는 인스턴스 유형 선택

할당된 저장소: 요구 사항에 맞는 스토리지 크기 선택

VPC: EC2와 RDS가 있는 VPC 선택

EC2와 RDS가 있는 동일한 VPC에 레플리케이션 인스턴스를 배치하고, 퍼블릭 액세스 여부를 선택합니다.

 

2. Endpoint 생성

DMS 콘솔에서 Endpoints로 이동하여 두 개의 엔드포인트를 생성합니다.

 

Source Endpoint (EC2 MySQL)

Endpoint type: Source

Engine type: MySQL

Server name: EC2 인스턴스의 퍼블릭 IP 주소 또는 도메인

Port: MySQL 기본 포트 (3306)

Username: MySQL 사용자 이름

Password: MySQL 비밀번호

Database name: MySQL 데이터베이스 이름 (특정 데이터베이스만 마이그레이션하려면)

Target Endpoint (RDS MySQL)

Endpoint type: Target

Engine type: MySQL

Server name: RDS 인스턴스의 엔드포인트 (콘솔에서 확인 가능)

Port: MySQL 기본 포트 (3306)

Username: RDS MySQL 사용자 이름

Password: RDS MySQL 비밀번호

Database name: MySQL 데이터베이스 이름

 

3. Migration Task 생성

Database migration tasks에서 새 마이그레이션 태스크를 생성합니다.

Source와 Target Endpoint를 설정합니다.

Migration type을 Migrate existing data 또는 Migrate existing data and replicate ongoing changes로 선택합니다.

Migrate existing data: 기존 데이터만 마이그레이션합니다.

Migrate existing data and replicate ongoing changes: 기존 데이터 마이그레이션과 동시에 변경 사항을 실시간으로 복제합니다.

테이블 매핑 설정에서 모든 스키마와 테이블을 포함하도록 설정합니다 (% 사용).

태스크 설정에서 데이터 검증, LOB 모드 등의 옵션을 설정할 수 있습니다.

4. Migration Task 시작

태스크를 생성한 후 Start 버튼을 눌러 태스크를 실행합니다.

콘솔에서 태스크 진행 상태를 모니터링할 수 있습니다.

 



Table mappings 섹션에서 테이블 매핑을 설정

시스템 테이블을 제외하려면 다음과 같이 설정하시면 됩니다:

 

1. Schema:

mysql, information_schema, performance_schema, sys 등 시스템 데이터베이스를 제외하려면 각각의 스키마 이름을 Schema 필드에 입력합니다.

2. Source name:

각 스키마에 대해 시스템 테이블이 위치한 스키마 이름을 입력합니다. 예를 들어, mysql 스키마를 제외하려면 mysql을 입력합니다.

3. Source table name:

테이블 이름을 제외하려면, %를 사용하여 모든 테이블을 선택할 수 있습니다.

4. Action:

Exclude로 설정합니다.

 

db 데이터베이스만 가져오도록 DMS 테이블 매핑 규칙을 설정하려면, 다음과 같이 설정할 수 있습니다.

1. Schema 필드: db 입력

2. Source table name: % (모든 테이블을 의미)

3. Action: Include

 

위 설정으로 DMS가 db 데이터베이스의 모든 테이블을 포함하여 마이그레이션하도록 구성됩니다. 다른 데이터베이스는 이 설정으로 제외됩니다.

db 라는 네임스페이스의 db 만 가져옵니다. 

{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "1",
      "rule-name": "include-db",
      "object-locator": {
        "schema-name": "db",
        "table-name": "%"
      },
      "rule-action": "include",
      "filters": []
    }
  ]
}

 

Mysql 타임존 수정 방법

1. MySQL 파라미터 그룹 수정

 

RDS의 MySQL 인스턴스에서 타임존을 변경하려면 먼저 파라미터 그룹에서 time_zone 파라미터를 수정해야 합니다.

 

1. 파라미터 그룹 생성 또는 수정:

AWS Management Console에 로그인한 후, RDS 콘솔로 이동합니다.

왼쪽 탐색 창에서 **“Parameter groups”**를 클릭합니다.

새로운 파라미터 그룹을 생성하거나 기존의 파라미터 그룹을 수정합니다.

파라미터 그룹에서 time_zone 파라미터를 찾습니다.

time_zone 파라미터 값을 원하는 타임존으로 설정합니다 (예: Asia/Seoul, UTC, Europe/London 등).

2. 파라미터 그룹 적용:

RDS 인스턴스에 해당 파라미터 그룹을 적용합니다.

파라미터 그룹을 적용한 후에는 RDS 인스턴스를 재부팅해야 새로운 타임존이 적용됩니다

 

2. RDS 인스턴스에 파라미터 그룹 적용

 

1. RDS 인스턴스 수정:

RDS 콘솔에서 타임존을 변경할 RDS 인스턴스를 선택한 후 **“Modify”**를 클릭합니다.

DB parameter group에서 새로 생성한 파라미터 그룹을 선택합니다.

인스턴스를 수정한 후, **“Apply immediately”**를 선택하여 변경 사항을 즉시 적용합니다.

2. 재부팅 필요:

파라미터 그룹이 적용된 후, RDS 인스턴스를 재부팅해야 변경된 타임존이 적용됩니다.

.

반응형
반응형

Vuetify는 Vue.js 기반의 Material Design 컴포넌트 프레임워크로, 반응형 UI를 쉽게 만들 수 있습니다.

기존의 To-Do 리스트 애플리케이션에 Vuetify를 적용하여 스타일을 개선하고, Vuetify의 컴포넌트를 활용하여 UI를 향상시켜보겠습니다.

 

1. Vuetify 설치

먼저 Vuetify를 프로젝트에 설치합니다.

1. 터미널에서 Vuetify 설치:

vue add vuetify

vue add vuetify 를 할 경우 4가지 선택지가 나오는데
vuetify2 를 할 것인지, 그리고 vue-cli 를 할 것인지에 대한 선택지가 나오는데
vuetify3 및 vite 라는 빌드툴을 사용하기로 했습니다. (최신버젼이기 때문) 

Vuetify 3 + Vite의 장점

A. 빠른 빌드 속도:

Vite는 빌드 도구로서 매우 빠른 속도를 자랑합니다. 특히 개발 중에 실시간으로 코드 변경 사항을 반영하는 속도가 빠르기 때문에, 대규모 프로젝트에서 매우 유용합니다.

Vite는 기본적으로 ES 모듈을 기반으로 작동하므로, 빌드 과정이 간소화되고 빠릅니다.

B. 최신 기능:

Vuetify 3는 Vuetify의 최신 버전으로, 최신 Vue.js 기능들을 활용할 수 있습니다. 특히, Composition API와 함께 사용할 때 더욱 강력한 기능을 제공합니다.

Vuetify 3은 새로운 디자인 시스템과 개선된 컴포넌트 구조를 제공하여 UI 개발에 더 나은 경험을 제공합니다.

C. 미래 지향적:

Vite와 Vuetify 3은 모두 Vue.js 커뮤니티에서 적극적으로 지원하는 최신 도구들입니다. 이를 사용하면 최신 기술을 습득하고 미래의 프로젝트에서 활용할 준비를 할 수 있습니다.

 

Vuetify 3 + Vite의 단점 및 고려사항

A. 호환성 문제:

Preview 단계: Vuetify 3은 아직 preview 단계이므로, 일부 기능이 불안정할 수 있으며, 공식적으로 모든 기능이 완전히 지원되지 않을 수 있습니다.

플러그인 호환성: Vuetify 3과 Vite를 사용하면, 기존의 일부 Vue.js 플러그인 또는 Vuetify 2에서 사용하던 플러그인들이 호환되지 않을 수 있습니다.

B. 러닝 커브:

Vite는 Webpack과는 다른 접근 방식을 취하기 때문에, 기존에 Webpack에 익숙한 개발자라면 Vite의 설정과 동작 방식에 적응하는 데 약간의 시간이 걸릴 수 있습니다.

C. 안정성:

Vite와 Vuetify 3의 조합은 최신 기술 스택이기 때문에, 프로젝트에 사용하기 전에 충분한 테스트가 필요할 수 있습니다. 대규모 프로젝트나 프로덕션 환경에서 사용할 때는 사전 검토가 중요합니다.



2.
프로젝트 실행:

설치가 완료된 후, 프로젝트를 다시 실행하여 Vuetify가 정상적으로 적용되었는지 확인합니다.

npm run dev

 

1). App.vue에서 Vuetify 레이아웃 적용

Vuetify의 기본 레이아웃 컴포넌트인 v-app, v-container, v-row, v-col 등을 사용하여 레이아웃을 설정합니다.

<template>
  <v-app>
    <v-container>
      <v-row>
        <v-col>
          <h1 class="text-center">Vue.js To-Do App</h1>
          <AddTodo @add-todo="addTodo" />
          <ToDoList :todos="todos" @remove-todo="removeTodo" @save-todos="saveTodos" />
        </v-col>
      </v-row>
    </v-container>
  </v-app>
</template>

<script>
import AddTodo from './components/AddTodo.vue';
import ToDoList from './components/ToDoList.vue';

export default {
  name: 'App',
  components: {
    AddTodo,
    ToDoList
  },
  data() {
    return {
      todos: []
    };
  },
  mounted() {
    const savedTodos = localStorage.getItem('todos');
    if (savedTodos) {
      this.todos = JSON.parse(savedTodos);
    }
  },
  methods: {
    addTodo(newTodo) {
      this.todos.push({ text: newTodo, completed: false });
      this.saveTodos();
    },
    removeTodo(index) {
      this.todos.splice(index, 1);
      this.saveTodos();
    },
    saveTodos() {
      localStorage.setItem('todos', JSON.stringify(this.todos));
    }
  }
};
</script>

<style>
.text-center {
  text-align: center;
}
</style>

3. AddTodo.vue에 Vuetify 컴포넌트 적용

 

AddTodo.vue 컴포넌트에서 Vuetify의 입력 및 버튼 컴포넌트를 사용합니다.

<template>
    <v-row class="mb-3">
      <v-col>
        <v-text-field
          v-model="newTodo"
          label="Add a new to-do"
          outlined
          dense
          @keyup.enter="submitTodo"
        />
      </v-col>
      <v-col cols="auto">
        <v-btn color="primary" @click="submitTodo">Add</v-btn>
      </v-col>
    </v-row>
  </template>
  
  <script>
  export default {
    name: 'AddTodo',
    data() {
      return {
        newTodo: ''
      };
    },
    methods: {
      submitTodo() {
        if (this.newTodo.trim()) {
          this.$emit('add-todo', this.newTodo);
          this.newTodo = '';
        }
      }
    }
  };
  </script>



4. TodoList.vue에 Vuetify 컴포넌트 적용

 

TodoList.vue 컴포넌트에서도 Vuetify의 리스트, 체크박스, 버튼 컴포넌트를 사용합니다.

<template>
  <v-list>
    <v-list-item
      v-for="(todo, index) in todos"
      :key="index"
      :class="{ 'completed': todo.completed }"
    >
      <v-row align="center" no-gutters>
        <v-col cols="auto" class="mr-3">
          <v-checkbox
            v-model="todo.completed"
            @change="saveTodos"
            hide-details
          />
        </v-col>
        <v-col>
          <v-list-item-content>
            <v-list-item-title>{{ todo.text }}</v-list-item-title>
          </v-list-item-content>
        </v-col>
        <v-col cols="auto">
          <v-btn icon small @click="removeTodo(index)">
            <v-icon>mdi-delete</v-icon>
          </v-btn>
        </v-col>
      </v-row>
    </v-list-item>
  </v-list>
</template>

<script>
export default {
  name: 'TodoList',
  props: {
    todos: {
      type: Array,
      required: true
    }
  },
  methods: {
    removeTodo(index) {
      this.$emit('remove-todo', index);
    },
    saveTodos() {
      this.$emit('save-todos');
    }
  }
};
</script>

<style scoped>
.completed .v-list-item__title {
  text-decoration: line-through;
  color: grey;
}
</style>

 

 

전체 코드 요약

 

App.vue

Vuetify의 레이아웃 컴포넌트(v-app, v-container, v-row, v-col)을 사용하여 구조를 만듭니다.

 

AddTodo.vue

Vuetify의 v-text-fieldv-btn을 사용하여 입력 필드와 버튼을 구현합니다.

 

TodoList.vue

Vuetify의 v-list, v-checkbox, v-btn, v-icon을 사용하여 할 일 리스트와 삭제 버튼을 구현합니다.

이전 블로그 

 

반응형
반응형

To-Do 리스트 애플리케이션에서 add 컴포넌트와 list 컴포넌트를 분리하는 작업을 하겠습니다.
컴포넌트를 분리하면 코드의 모듈화가 가능해지고, 각 컴포넌트가 자신의 역할에만 집중할 수 있게 됩니다.

이 과정에서 Vue.js의 컴포넌트 간 데이터 전달(propsevents)을 이해하는 데도 도움이 됩니다.

 

1. AddTodo.vue 컴포넌트 생성

 

1. AddTodo.vue 파일 생성:

src/components 디렉토리 안에 AddTodo.vue 파일을 생성합니다.

2. AddTodo.vue 초기 코드 작성:

이 컴포넌트는 새로운 할 일을 입력하고 추가하는 역할을 합니다.

 

<template>
  <div>
    <input v-model="newTodo" placeholder="Add a new to-do" @keyup.enter="submitTodo" />
    <button @click="submitTodo">Add</button>
  </div>
</template>

<script>
export default {
  name: 'AddTodo',
  data() {
    return {
      newTodo: ''
    };
  },
  methods: {
    submitTodo() {
      if (this.newTodo.trim()) {
        this.$emit('add-todo', this.newTodo);
        this.newTodo = ''; // 입력 필드 초기화
      }
    }
  }
};
</script>

3. 기능 설명:

newTodo라는 로컬 데이터 속성을 가지고 있으며, 사용자가 할 일 텍스트를 입력합니다.

사용자가 Enter 키를 누르거나 “Add” 버튼을 클릭하면 submitTodo 메서드가 호출됩니다.

submitTodo 메서드는 add-todo 이벤트를 상위 컴포넌트로 발송(emit)하여 입력된 할 일을 전달합니다.

 

2. TodoList.vue 컴포넌트 생성

 

1. TodoList.vue 파일 생성:

src/components 디렉토리 안에 TodoList.vue 파일을 생성합니다.

2. TodoList.vue 초기 코드 작성:

이 컴포넌트는 할 일 리스트를 렌더링하고, 할 일 항목을 삭제하는 역할을 합니다.

<template>
  <ul>
    <li v-for="(todo, index) in todos" :key="index">
      <input type="checkbox" v-model="todo.completed" @change="saveTodos" />
      <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
      <button @click="removeTodo(index)">Delete</button>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'ToDoList',
  props: {
    todos: {
      type: Array,
      required: true
    }
  },
  methods: {
    removeTodo(index) {
      this.$emit('remove-todo', index);
    },
    saveTodos() {
      this.$emit('save-todos');
    }
  }
};
</script>

<style>
.completed {
  text-decoration: line-through;
  color: grey;
}
</style>

3. 기능 설명:

todos 배열을 props로 받아와서 리스트를 렌더링합니다.

각 할 일 항목의 체크박스 상태를 변경하면 saveTodos 메서드가 호출되어, 상위 컴포넌트로 상태 저장 이벤트(save-todos)를 발송합니다.

“Delete” 버튼을 클릭하면 해당 항목을 삭제하기 위한 remove-todo 이벤트를 발송합니다.

 

3. App.vue 파일 수정

 

1. AddTodoTodoList 컴포넌트 가져오기:

App.vue 파일에서 새로 생성한 두 컴포넌트를 가져오고, 이를 사용해 To-Do 리스트를 완성합니다.

<template>
  <h1>Vue.js To-Do App</h1>
  <add-todo @add-todo="addTodo" />
  <to-do-list :todos="todos" @remove-todo="removeTodo" @save-todos="saveTodos" />
</template>

<script>
import AddTodo from './components/AddTodo.vue';
import ToDoList from './components/ToDoList.vue';


export default {
  name: 'App',
  components: {
    AddTodo,
    ToDoList
  },
  data() {
    return {
      todos: []
    };
  },
  mounted() {
    const savedTodos = localStorage.getItem('todos');
    if (savedTodos) {
      this.todos = JSON.parse(savedTodos);
    }
  },
  methods: {
    addTodo(newTodo) {
      this.todos.push({ text: newTodo, completed: false });
      this.saveTodos();
    },
    removeTodo(index) {
      this.todos.splice(index, 1);
      this.saveTodos();
    },
    saveTodos() {
      localStorage.setItem('todos', JSON.stringify(this.todos));
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

 

2. 기능 설명:

AddTodo 컴포넌트에서 발송된 add-todo 이벤트를 받아 addTodo 메서드를 호출합니다.

TodoList 컴포넌트에서 발송된 remove-todosave-todos 이벤트를 처리하여 할 일 리스트를 관리하고 로컬 스토리지에 저장합니다.

로컬 스토리지에서 할 일 목록을 불러오고, 이를 todos 배열에 저장합니다.

 

 

요약

 

1. AddTodo.vue: 사용자가 할 일을 입력하고 추가하는 기능을 담당하는 컴포넌트.

2. TodoList.vue: 할 일 목록을 렌더링하고, 항목을 삭제하거나 완료 상태를 관리하는 컴포넌트.

3. App.vue: 상위 컴포넌트로서, AddTodoTodoList 컴포넌트를 포함하고, 할 일 데이터를 중앙에서 관리하는 역할을 수행.


이전블로그 
로컬스토리지 통한 to-do list 구현
https://juntcom.tistory.com/317

반응형
반응형

 

To-Do 리스트 항목을 로컬 스토리지에 저장하고, 페이지 새로고침 후에도 할 일 목록이 유지되도록 기능을 추가하겠습니다.

이를 위해 ToDoList.vue 컴포넌트의 코드를 수정할 것입니다.

 

수정된 ToDoList.vue 코드

<template>
  <div>
    <h2>To-Do List</h2>
    <input v-model="newTodo" placeholder="Add a new to-do" @keyup.enter="addTodo" />
    <button @click="addTodo">Add</button>

    <ul>
      <li v-for="(todo, index) in todos" :key="index">
        <input type="checkbox" v-model="todo.completed" @change="saveTodos" />
        <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
        <button @click="removeTodo(index)">Delete</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'ToDoList',
  data() {
    return {
      newTodo: '',
      todos: []
    };
  },
  mounted() {
    // 컴포넌트가 마운트될 때 로컬 스토리지에서 할 일 목록을 불러옵니다.
    const savedTodos = localStorage.getItem('todos');
    if (savedTodos) {
      this.todos = JSON.parse(savedTodos);
    }
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.todos.push({ text: this.newTodo, completed: false });
        this.newTodo = '';
        this.saveTodos(); // 새로운 할 일 추가 후 로컬 스토리지에 저장
      }
    },
    removeTodo(index) {
      this.todos.splice(index, 1);
      this.saveTodos(); // 할 일 삭제 후 로컬 스토리지에 저장
    },
    saveTodos() {
      // 현재 할 일 목록을 로컬 스토리지에 저장합니다.
      localStorage.setItem('todos', JSON.stringify(this.todos));
    }
  }
};
</script>

<style>
.completed {
  text-decoration: line-through;
  color: grey;
}
</style>

코드 설명

 

1. 로컬 스토리지에서 할 일 목록 불러오기:

mounted() 훅에서 컴포넌트가 마운트될 때 localStorage.getItem('todos')를 통해 로컬 스토리지에 저장된 할 일 목록을 불러옵니다.

만약 저장된 할 일 목록이 있으면, 이를 JSON으로 파싱하여 todos 배열에 할당합니다.

2. 할 일 목록 저장:

addTodoremoveTodo 메소드가 실행될 때, saveTodos() 메소드를 호출하여 현재 todos 배열을 로컬 스토리지에 저장합니다.

saveTodos() 메소드는 localStorage.setItem('todos', JSON.stringify(this.todos))를 통해 todos 배열을 문자열로 변환하여 로컬 스토리지에 저장합니다.

3. 할 일 완료 상태 변경 시 저장:

할 일의 체크박스를 클릭하여 완료 상태를 변경할 때도 saveTodos() 메소드를 호출하여 변경된 상태를 로컬 스토리지에 저장합니다.

 

 

 

개발자도구 > Application > Local storage > 도메인 > todos 에 데이터가 쌓인 걸 볼 수 있습니다. 


로컬스토리지란

로컬 스토리지는 웹 브라우저에서 제공하는 클라이언트 측 저장소입니다. 이를 통해 웹 애플리케이션은 사용자의 데이터를 클라이언트(브라우저) 측에 영구적으로 저장할 수 있습니다. 로컬 스토리지에 저장된 데이터는 브라우저를 닫거나 컴퓨터를 재부팅해도 유지됩니다.

 

로컬 스토리지의 특징

 

1. 키-값(Key-Value) 쌍으로 저장:

로컬 스토리지는 데이터를 키-값 쌍으로 저장합니다. 즉, 데이터에 접근할 때 특정 키를 사용하여 해당 값을 가져오거나 수정할 수 있습니다.

2. 영구 저장:

로컬 스토리지에 저장된 데이터는 사용자가 명시적으로 삭제하지 않는 한 영구적으로 저장됩니다. 쿠키와 달리 만료 시간이 없으며, 브라우저를 닫거나 컴퓨터를 재부팅해도 유지됩니다.

3. 도메인 별 저장:

로컬 스토리지는 도메인 단위로 데이터를 저장합니다. 이는 특정 웹사이트에서 저장된 데이터가 다른 도메인에서는 접근할 수 없음을 의미합니다.

4. 5MB 정도의 용량 제한:

대부분의 브라우저에서는 로컬 스토리지에 약 5MB 정도의 데이터를 저장할 수 있습니다. 이는 비교적 큰 용량으로, 텍스트 기반 데이터나 간단한 설정 값을 저장하는 데 충분합니다.

5. 동기적 접근:

로컬 스토리지는 동기적으로 동작합니다. 즉, 데이터를 저장하거나 불러올 때 해당 작업이 즉시 처리되며, 결과가 바로 반환됩니다.

 

로컬 스토리지 사용 방법

 

로컬 스토리지는 JavaScript를 통해 접근할 수 있으며, 다음과 같은 메서드를 사용합니다:




1. 데이터 저장:

localStorage.setItem(key, value)

예:

localStorage.setItem('username', 'JohnDoe');

2. 데이터 가져오기:

localStorage.getItem(key)

예:

const username = localStorage.getItem('username');
console.log(username); // 'JohnDoe'

3. 데이터 삭제:

특정 데이터 삭제: localStorage.removeItem(key)

모든 데이터 삭제: localStorage.clear()

예:

localStorage.removeItem('username');
localStorage.clear(); // 모든 데이터 삭제

4. 저장된 데이터 개수 확인:

localStorage.length

예:

const length = localStorage.length;
console.log(length);

 

로컬 스토리지의 활용 사례

 

사용자 설정 저장:

예를 들어, 웹사이트의 테마 설정이나 글꼴 크기 등의 개인 설정을 로컬 스토리지에 저장하여, 사용자가 브라우저를 닫았다가 다시 열어도 같은 설정을 유지할 수 있습니다.

간단한 데이터 캐싱:

네트워크 요청 결과를 로컬 스토리지에 저장하여, 동일한 데이터를 다시 요청할 필요 없이 빠르게 접근할 수 있습니다.

폼 데이터 임시 저장:

사용자가 폼을 작성하는 중에 브라우저를 닫거나 페이지를 떠났다가 돌아오더라도, 작성된 내용을 잃지 않도록 로컬 스토리지에 임시로 저장할 수 있습니다.

 

로컬 스토리지의 한계

 

보안 문제: 로컬 스토리지는 클라이언트 측에 저장되므로, 악의적인 사용자가 쉽게 접근할 수 있습니다. 따라서 민감한 정보(예: 비밀번호, 개인 정보)를 저장하는 데는 적합하지 않습니다.

용량 제한: 로컬 스토리지는 보통 5MB 정도의 용량 제한이 있습니다. 이 때문에 대용량 데이터를 저장하는 데는 적합하지 않습니다.

브라우저 호환성: 대부분의 현대 브라우저는 로컬 스토리지를 지원하지만, 매우 오래된 브라우저에서는 지원되지 않을 수 있습니다.




이전 블로그

https://juntcom.tistory.com/316

 

반응형
반응형

To-Do 리스트를 구현하기 위해 새로운 컴포넌트를 만드는 방법을 단계별로 설명드리겠습니다.

이 설명을 따라 새로운 컴포넌트를 만들고 App.vue에서 이를 사용해 To-Do 리스트를 구현할 수 있습니다.

 

1. 새로운 컴포넌트 생성

 

1. ToDoList.vue 파일 생성:

src/components 디렉토리 안에 ToDoList.vue 파일을 생성합니다.

2. ToDoList.vue 초기 코드 작성:

아래 코드를 ToDoList.vue 파일에 추가합니다.

이 코드는 To-Do 리스트 항목을 추가하고, 리스트를 렌더링하는 기본적인 구조입니다.

 

<template>
  <div>
    <h2>To-Do List</h2>
    <input v-model="newTodo" placeholder="Add a new to-do" @keyup.enter="addTodo" />
    <button @click="addTodo">Add</button>
    
    <ul>
      <li v-for="(todo, index) in todos" :key="index">
        <input type="checkbox" v-model="todo.completed" />
        <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
        <button @click="removeTodo(index)">Delete</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'ToDoList',
  data() {
    return {
      newTodo: '',
      todos: []
    };
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.todos.push({ text: this.newTodo, completed: false });
        this.newTodo = '';
      }
    },
    removeTodo(index) {
      this.todos.splice(index, 1);
    }
  }
};
</script>

<style>
.completed {
  text-decoration: line-through;
  color: grey;
}
</style>

2. App.vue 파일 수정

 

1. ToDoList 컴포넌트 가져오기:

App.vue 파일에서 ToDoList.vue 컴포넌트를 가져오고, 등록합니다.

<template>
  <div id="app">
    <h1>Vue.js To-Do App</h1>
    <ToDoList />
  </div>
</template>

<script>
import ToDoList from './components/ToDoList.vue';

export default {
  name: 'App',
  components: {
    ToDoList
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

2. 컴포넌트 실행 및 테스트:

프로젝트를 실행하여 ToDoList.vue 컴포넌트가 정상적으로 렌더링되고, 할 일 항목을 추가, 삭제할 수 있는지 확인합니다.

 

 

3. 스타일 및 추가 기능

 

1. 스타일 개선:

ToDoList.vue 파일에 추가 스타일을 적용하여 UI를 더 예쁘게 꾸밀 수 있습니다.

예를 들어, 인풋 필드, 버튼, 리스트 항목 등에 스타일을 적용할 수 있습니다.

2. 추가 기능 구현:

할 일 목록을 로컬 스토리지에 저장하여 새로고침 후에도 유지되도록 하거나, 완료된 항목을 숨기거나 필터링하는 기능을 추가할 수 있습니다.




이전 블로그 

Vue.js 프로젝트 설정 - vue cli 시작하기

https://juntcom.tistory.com/284

반응형
반응형

Vue.js로 개발할 때 유용한 레퍼런스와 리소스를 정리해드리겠습니다. 이들은 Vue.js의 기본 개념부터 심화된 주제, 그리고 개발 도구와 관련된 다양한 정보들을 포함합니다.

 

공식 문서 및 가이드

 

1. Vue.js 공식 문서:

Vue.js 공식 문서

Vue.js의 모든 기능과 개념에 대한 공식 가이드입니다. 기초부터 고급 주제까지 잘 정리되어 있습니다.

2. Vue.js 스타일 가이드:

Vue.js 공식 스타일 가이드

Vue.js 프로젝트에서 일관된 코딩 스타일을 유지하기 위한 권장사항이 담긴 가이드입니다.

3. Vue.js API 레퍼런스:

Vue.js API 레퍼런스

Vue.js의 모든 API와 관련된 설명을 제공합니다. 특정 기능이나 메서드를 찾을 때 유용합니다.

4. Vue.js 3 공식 문서:

Vue 3 공식 문서

Vue.js 3의 새로운 기능들과 변경된 사항들을 포함한 공식 가이드입니다.

 

튜토리얼 및 학습 리소스

 

1. Vue Mastery:

Vue Mastery

Vue.js 공식 학습 파트너로, 초급부터 고급까지 다양한 튜토리얼 동영상을 제공합니다. 일부 강의는 무료로 제공됩니다.

2. Vue School:

Vue School

Vue.js 학습을 위한 온라인 교육 플랫폼으로, 심화된 Vue.js 주제들을 다루는 동영상 강의를 제공합니다.

3. Scrimba: Learn Vue.js for free:

Scrimba: Learn Vue.js

무료로 제공되는 Vue.js 강의 시리즈로, 인터랙티브한 코딩 환경에서 학습할 수 있습니다.

4. Laracasts Vue.js 시리즈:

Laracasts Vue.js 시리즈

Vue.js와 관련된 강좌를 제공하는 사이트로, 특히 Laravel과 함께 사용하는 방법을 다룹니다. 일부는 무료로 제공됩니다.

 

유용한 도구와 라이브러리

 

1. Vue CLI:

Vue CLI

Vue.js 프로젝트 생성을 위한 강력한 CLI 도구입니다. 다양한 설정을 자동으로 처리해주며, 플러그인 시스템을 통해 확장이 가능합니다.

2. Vue Router:

Vue Router 공식 문서

Vue.js에서 SPA(Single Page Application)의 라우팅을 담당하는 라이브러리로, 공식 문서를 통해 설정과 사용법을 자세히 배울 수 있습니다.

3. Vuex:

Vuex 공식 문서

Vue.js에서 상태 관리를 위한 중앙 집중식 저장소 역할을 하는 라이브러리입니다. 특히 대규모 애플리케이션에서 유용합니다.

4. Axios:

Axios 공식 문서

Vue.js와 함께 자주 사용되는 HTTP 클라이언트 라이브러리로, API 통신을 쉽게 처리할 수 있습니다.

5. Vuetify:

Vuetify 공식 문서

Vue.js 기반의 Material Design 컴포넌트 프레임워크로, 아름답고 반응형인 UI를 쉽게 구축할 수 있습니다.

6. Quasar Framework:

Quasar Framework 공식 문서

Vue.js 기반의 강력한 프레임워크로, 웹, 모바일, 데스크탑 애플리케이션을 한 번에 개발할 수 있는 도구를 제공합니다.

 

커뮤니티 및 포럼

 

1. Vue.js 공식 포럼:

Vue.js 공식 포럼

Vue.js 커뮤니티가 활발하게 활동하는 공식 포럼입니다. 질문과 답변, 다양한 토론이 이루어집니다.

2. Stack Overflow:

Stack Overflow Vue.js 태그

Vue.js 관련 질문과 답변을 찾을 수 있는 커뮤니티입니다. 개발 중 발생하는 문제를 해결할 때 유용합니다.

3. Reddit:

Reddit Vue.js 커뮤니티

Vue.js 관련 토론과 정보 공유가 활발히 이루어지는 Reddit 커뮤니티입니다.

4. Discord Vue.js 커뮤니티:

Vue Land (Discord 서버)

Vue.js 개발자들이 실시간으로 소통할 수 있는 공식 Discord 커뮤니티입니다.

 

추가 리소스

 

1. Awesome Vue:

Awesome Vue

Vue.js 관련 리소스와 라이브러리를 모아놓은 깃허브 리포지토리입니다. 다양한 플러그인, 튜토리얼, 프로젝트 예제를 찾을 수 있습니다.

2. Vue.js Examples:

Vue.js Examples

다양한 Vue.js 애플리케이션 예제와 코드를 제공하는 사이트입니다. 실제 프로젝트에 응용할 수 있는 샘플 코드들이 많습니다.

반응형
반응형

1. Visual Studio Code 설치

 

먼저, Visual Studio Code를 설치합니다. VS Code는 무료로 제공되며, 다양한 운영 체제(Windows, macOS, Linux)에서 사용할 수 있습니다.

 

설치 방법: 공식 웹사이트에서 운영 체제에 맞는 설치 파일을 다운로드한 후, 설치 프로그램을 실행하여 설치합니다.

 

2. Node.js 설치

 

Vue CLI와 관련된 도구들을 사용하려면 Node.js가 설치되어 있어야 합니다. Node.js 설치 시 npm(Node Package Manager)이 함께 설치됩니다.

 

설치 방법:

1. Node.js 공식 웹사이트에서 최신 LTS(Long Term Support) 버전을 다운로드합니다.

2. 설치 프로그램을 실행하여 Node.js와 npm을 설치합니다.

3. 설치 완료 후, 터미널에서 Node.js와 npm의 버전을 확인합니다.

 

node -v
npm -v

3. Vue CLI 설치

 

Vue.js 프로젝트를 쉽게 생성하고 관리하기 위해 Vue CLI(Command Line Interface)를 설치합니다.

 

설치 방법:

1. 터미널을 열고 다음 명령어를 입력하여 Vue CLI를 전역으로 설치합니다.

npm install -g @vue/cli

2. 설치가 완료되면, Vue CLI의 버전을 확인합니다.

vue --version

4. Visual Studio Code 플러그인 설치

vue 라는 플러그인 설치. 그 외에 다른 확장도구 설치해도 무방

 

5. Debugger for Chrome:
https://chromewebstore.google.com/search/vue?hl=ko 

브라우저에서 vue 개발을 도와주는 디버그 툴을 설치해주셔야 합니다.  

 

반응형

+ Recent posts