๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋กœ์ ํŠธ/๐Ÿ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๐Ÿ 

[SpringBoot] (IntelliJ, vue.js, H2) ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ 3ํŽธ: watch๋กœ ์•„์ด๋””์™€ ์ด๋ฉ”์ผ ๋ณ€๊ฒฝ ์‹œ ๋‹ค์‹œ ์ค‘๋ณต์ฒดํฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ.

by ._.sori 2025. 8. 18.

 

 

 

[ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ 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์˜ ์ค„์ž„๋ง์ด๋‹ค.

 

 

 


 


์ œ๊ฐ€ ์ดํ•ดํ•œ ๊ฑธ ์ตœ๋Œ€ํ•œ ์ž˜ ์ ์–ด๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์šฉ ์ค‘์— ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š” :-)
๋„์›€์ด ๋˜์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿณ ํ™”์ดํŒ… ๐Ÿณ

 

 

 

- watch

 

Vue.js

Vue.js - ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

ko.vuejs.org

 

 

 

- event handling

 

Vue.js

Vue.js - ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

ko.vuejs.org

 

 

 

- @input

 

Vue.js

Vue.js - ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

ko.vuejs.org

 

 

 

- watch

 

Vue์—์„œ ์ค‘์ฒฉ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๋ฒ•

์•ฑ์€ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์•ฑ์ด ๋ฌด์—‡๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธธ ์›ํ•œ๋‹ค.

ui.toast.com

 

 

 

-watch

 

Watch | Cracking Vue.js

watch ์†์„ฑ watch ์†์„ฑ์€ ํŠน์ • ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ํŠน์ • ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. watch ์ฝ”๋“œ ํ˜•์‹ watch ์†์„ฑ์˜ ๊ตฌํ˜„ ์ฝ”๋“œ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” message๋ผ๋Š” ๋ฐ์ดํ„ฐ

joshua1988.github.io

 

 

 

- @input

 

vue input value ๊ฐ’ ์‹ค์‹œ๊ฐ„ ๋ณ€๊ฒฝ ๊ฐ์ง€

vue - input value๊ฐ’ ๋ณ€๊ฒฝ ์‹ค์‹œ๊ฐ„ ๊ฐ์ง€๋ฅผ ์œ„ํ•ด์„œ @input ์‚ฌ์šฉ ์˜ˆ์‹œ) onChange(event){ console.log(event.target.value) }

taenami.tistory.com

 

 

 

- v-on

 

v-model ๋Œ€์‹  v-on๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ (v-model ํ•œ๊ธ€์ž…๋ ฅ)

v-model? v-on? ๋‘˜์˜ ์ฐจ์ด์ ์ด๋‚˜ ์‚ฌ์šฉ์ฒ˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์œ„์˜ ๋‘ ๊ธฐ๋Šฅ์ด ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋กํ•˜์ž! ๋‘ ๊ธฐ๋Šฅ์€ ๋งค์šฐ, ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์˜ vue์˜ ๊ธฐ์ดˆ๊ฐ•์˜๋‚˜, ์ฑ…์—

hj-tilblog.tistory.com