[ ํ์๊ฐ์ ํ์ด์ง ๋ง๋ค๊ธฐ 2ํธ : ์์ด๋์ ์ด๋ฉ์ผ ํจํด ์ฒดํฌํ๊ณ ์ค๋ณต ํ์ธํ๊ธฐ ]
[SpringBoot] (IntelliJ, vue.js, H2) ํ์๊ฐ์ ํ์ด์ง ๋ง๋ค๊ธฐ 2ํธ : ์์ด๋, ์ด๋ฉ์ผ ์ค๋ณต์ฒดํฌ ๋ง๋ค๊ธฐ.
์ด๋ฆ, ๋น๋ฐ๋ฒํธ, ์ ํ๋ฒํธ๋ฅผํจํด ์ฒดํฌ๋ฅผ ํ์๋ค.์ด๋ฒ์๋ ์์ด๋์ ์ด๋ฉ์ผ์์ค๋ณต ์ฒดํฌ ํด๋ณด์! [ ํ์๊ฐ์ ํ์ด์ง ๋ง๋ค๊ธฐ 1ํธ : ์ด๋ฆ, ํจ์ค์๋, ์ ํ๋ฒํธ ํจํด ์ฒดํฌ ]์ด๊ณณ์ ๋ค์ด๊ฐ์๋ฉด ํ์ด์ง
post-this.tistory.com
์์ด๋์ ์ด๋ฉ์ผ์
์ค๋ณต ์ฒดํฌํ๊ณ ํจํด ์ฒดํฌ๊น์ง ๋ง๋ค์๋ฐ.
๊ทธ๋ฐ๋ฐ ์ด๋ด์๊ฐ!
์ฌ์ฉ์๊ฐ ์ค๋ณต ์ฒดํฌ๋ฅผ ๋ง๋ค๊ณ
๊ฐ์ ๋ณ๊ฒฝํด๋ ๊ฐ์ ์ด ์ฑ๊ณตํ๋ค.
1. ํ๋ฉด ๋์๊ณผ ์ ์ฒด ์ฝ๋
- ํ๋ฉด๋์

- ์ฝ๋
Register-Web-frontend/src/views/BasicRegister.vue at master · hyeong-ing/Register-Web-frontend
์ผ๋ฐ ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ, ๊ฐํธ ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ์ ๊ตฌํํ์ต๋๋ค. WebStrom์ผ๋ก Vue.js์ Vite๋ฅผ ์ฌ์ฉํ์ต๋๋ค. - hyeong-ing/Register-Web-frontend
github.com
2. ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
- ๋ฌธ์
์์ด๋์ ์ด๋ฉ์ผ์ ์ค๋ณต ์ฒดํฌ ํ, ์ฌ์ฉ์๊ฐ ์์ด๋์ ์ด๋ฉ์ผ์ ์๋กญ๊ฒ ์์ฑํ๋ฉด ๊ทธ๋๋ก ํ์๊ฐ์ ์ด ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ค๋ณต ์ฒดํฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋๋ฉด true๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ง๋ idDuplicate ๊ฐ๊ณผ emailDuplicate ๊ฐ์ด false๋ก ๋ณ๊ฒฝ๋๋ฉด์ ์์ด๋์ ์ด๋ฉ์ผ ๋ฐ์ดํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ์ฌ์ ํ false๊ฐ ๋์ด ๊ฐ์ ์ด ์ฑ๊ณต๋๋ ๊ฒ์ด๋ค. ์คํ๋ง์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ ๊ณ ๋ฏผํ๋ ์ฐฐ๋, vue์์ ์ด ๋ฌธ์ ์ ๋ํด ์์ฃผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ฒ ๋๋๋ฐ...
- ํด๊ฒฐ๋ฐฉ๋ฒ
๋ฐ๋ก watch๋ผ๋ ํจ์๋ฅผ ํตํด ํด๊ฒฐํ ์ ์์๋ค.
3. Watch
<template> ์ฝ๋
<input v-model="userId" type="text" name="userId" placeholder="id"/>
<button class="id-duplicate-btn" @click="checkIdDuplicate"> id </button>
<input v-model="email" type="email" name="email" placeholder="example01@sori.com"/>
<button class="email-duplicate-btn" @click="checkEmailDuplicate"> email </button>
<script> ์ฝ๋
data() {
return {
name: "",
userId: "",
pwd: "",
pwdConfirm: "",
tel: "",
birth: "",
email: "",
idDuplicate: true,
emailDuplicate: true,
};
},
watch: {
userId(newVal, oldVal) {
this.idDuplicate = true;
},
email(newVal, oldVal) {
this.emailDuplicate = true;
}
},
watch๋ data, props, computed ๋ฑ ๋ฐ์ํ ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ๊ฐ์ํ๋ค๊ฐ, ๊ฐ์ด ๋ฐ๋๋ฉด ํจ์๋ฅผ ์คํ์ํจ๋ค. userId์ email์ newVal๊ณผ oldVal๋ฅผ ๊ฐ์ง๋๋ฐ, newVal์ ๋ณ๊ฒฝ๋ ์๋ก์ด ๊ฐ์ด๊ณ oldVal์ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ์ด์ ๊ฐ์ด๋ค. ๊ทธ๋์ newVal๊ณผ oldVal์ ๊ฐ์ด ๋ค๋ฅด๋ฉด this.idDuplicate = true์ this.emailDuplicate = true๊ฐ ์คํ๋๋ค.
์ค๋ณต ๋ฒํผ์ ๋๋ฅด๊ณ ํ์ธ์ด ๋๋ฌ์ผ๋ฉด, idDuplicate์ emailDuplicate์ ๊ฐ์ false๋ก ๋ณ๊ฒฝ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ฉ์๊ฐ id ํน์ email ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด watch๊ฐ ๊ทธ๊ฑธ ์์์ฑ๊ณ ๋ค์ idDuplicate์ emailDuplicate ๊ฐ์ true๋ก ๋ณ๊ฒฝํ๋ค.
์ฌ์ฉ์๊ฐ ํ์๊ฐ์ ์ ํ๊ธฐ ์ํด์๋ idDuplicate์ emailDuplicate ๊ฐ์ด false๋ฅผ ๊ฐ์ ธ์ผํ๊ธฐ ๋๋ฌธ์, true๋ก ๋ณ๊ฒฝ๋์ด ๊ฐ์ ์ด ์ ๋๋ก ์ํ๋์ง ์๋๋ค.
4. ๋ค๋ฅธ ๋ฐฉ๋ฒ input, watch์ ์ฐจ์ด์ ์?
<template> ์ฝ๋
<input v-model="userId" @input="userIdInput" type="text" name="userId" placeholder="id"/>
<button class="id-duplicate-btn" @click="checkIdDuplicate"> id </button>
ํน์
<input v-model="userId" v-on:input="userIdInput" type="text" name="userId" placeholder="id"/>
<button class="id-duplicate-btn" @click="checkIdDuplicate"> id </button>
<script> ์ฝ๋
methods: {
userIdInput() {
this.idDuplicate = true;
},
watch๋ ๋ฐ์ดํฐ ์์ฒด๊ฐ ๋ฐ๋๋ฉด ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ด ์ด๋ป๊ฒ ๋ฐ๋์๋์ง๋ฅผ oldVal, newVal๋ก ์ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ @input์ HTML DOM ์ด๋ฒคํธ ๋ ๋ฒจ์์ ๋์ํ๋ค. <input> ํ๊ทธ์ input ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋๋ง ์์์, ์ฌ์ฉ์๊ฐ ๋ญ๊ฐ ์ ๋ ฅํ๋ค๋ ๊ฒ๋ง ์๋ ๊ฒ์ด๋ค.
์ฌ์ฉ์๊ฐ ์์ด๋์ sori1234๋ฅผ ์ ์๊ณ ๊ทธ ๊ฐ ์์ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ค๊ณ ๊ฐ์ ํ์.(์ด์ด์ ์ ๊ฑฐ๋ ์ง์ ๋ค ์ ์๊ฒ ์๋๋ผ ์์ด๋๋ฅผ ๋๋๊ทธ ํด๋์ ๋ค ๋ถ์ฌ๋ฃ๊ธฐ ํ ๊ฒ) watch๋ ๋ฐ์ดํฐ ๊ฐ์ ๋ณ๋์ ํ์ธํ๋๊น oldVal๊ณผ newVal์ ๊ฐ์ด ๋ฌ๋ผ์ง์ง ์์์์ ํ์ธํ๊ณ idDuplicate์ true๋ฅผ ํ ๋นํ์ง ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ @input์ ์ฌ์ฉ์๊ฐ input๋์ ๊ฑด๋๋ ธ๊ธฐ์ ๋ค์ ์ฒดํฌํ๋ผ๊ณ ๋ฌ๋ค.
์์ ์ํฉ๋ง ๋ด๋ watch๋ฅผ ์ฐ๋๊ฒ ๋ ์ ์ ํ๊ฒ ๋ณด์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ํ ์ญํ ์์ฒด๋ watch๊ฐ ๋ ๋ง๋ค. watch๋ ๊ฐ์ด ๋ฐ๋๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ๋ ฅ์ผ๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ, ์ฝ๋๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ, ์๋์์ฑ+์ด๊ธฐํ+๋ผ์ฐํ ์ผ๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์์์ฐจ๋ฆฐ๋ค. (๊ทธ ์ธ ๋ ๋ค์ํ ์ด์ ๋ก watch๋ฅผ ์ฐ๋ผ๊ณ ํ๋ค) ๋ง์ฝ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ธํ ํด๋์ ์ด๋ค ๊ฒฝ์ฐ๋ผ๋ฉด DOM ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๋ฐ์ํ๋ input์ ๋์น ์ ์๋ค.
Vue์์ DOM ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ ๋๋ ์๋ v-on ๋๋ ํฐ๋ธ๋ฅผ ์ด๋ค. v-on์ ์ค์ฌ์ @๋ก ์ธ ์ ์๋ค. @input์ v-on:input์ ์ค์๋ง์ด๋ค.
์ ๊ฐ ์ดํดํ ๊ฑธ ์ต๋ํ ์ ์ ์ด๋ณด๋ ค๊ณ ๋
ธ๋ ฅํ์ต๋๋ค.
๋ด์ฉ ์ค์ ํ๋ฆฐ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ :-)
๋์์ด ๋์
จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๐ณ ํ์ดํ ๐ณ
Vue.js
Vue.js - ํ๋ก๊ทธ๋์๋ธ ์๋ฐ์คํธ๋ฆฝํธ ํ๋ ์์ํฌ
ko.vuejs.org
Vue.js
Vue.js - ํ๋ก๊ทธ๋์๋ธ ์๋ฐ์คํธ๋ฆฝํธ ํ๋ ์์ํฌ
ko.vuejs.org
Vue.js
Vue.js - ํ๋ก๊ทธ๋์๋ธ ์๋ฐ์คํธ๋ฆฝํธ ํ๋ ์์ํฌ
ko.vuejs.org
Vue์์ ์ค์ฒฉ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ํ๋ ๋ฒ
์ฑ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ ์์ฑ์ ๊ฐ์ง ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฑ์ด ๋ฌด์๊ฐ๋ฅผ ์ํํ๊ธธ ์ํ๋ค.
ui.toast.com
Watch | Cracking Vue.js
watch ์์ฑ watch ์์ฑ์ ํน์ ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ์๋์ผ๋ก ํน์ ๋ก์ง์ ์ํํด์ฃผ๋ ์์ฑ์ ๋๋ค. watch ์ฝ๋ ํ์ watch ์์ฑ์ ๊ตฌํ ์ฝ๋ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ ์ฝ๋๋ message๋ผ๋ ๋ฐ์ดํฐ
joshua1988.github.io
vue input value ๊ฐ ์ค์๊ฐ ๋ณ๊ฒฝ ๊ฐ์ง
vue - input value๊ฐ ๋ณ๊ฒฝ ์ค์๊ฐ ๊ฐ์ง๋ฅผ ์ํด์ @input ์ฌ์ฉ ์์) onChange(event){ console.log(event.target.value) }
taenami.tistory.com
v-model ๋์ v-on๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐ (v-model ํ๊ธ์ ๋ ฅ)
v-model? v-on? ๋์ ์ฐจ์ด์ ์ด๋ ์ฌ์ฉ์ฒ๋ฅผ ์๊ธฐ ์ํด์๋ ๋จผ์ ์์ ๋ ๊ธฐ๋ฅ์ด ์ด๋ค ์ญํ ์ ํ๋์ง์ ๋ํด ์์๋ณด๋๋กํ์! ๋ ๊ธฐ๋ฅ์ ๋งค์ฐ, ๋ง์ด ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ vue์ ๊ธฐ์ด๊ฐ์๋, ์ฑ ์
hj-tilblog.tistory.com