๐ Mixin ์ด๋?
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ mixin
์ ํ์ํ ๋ฉ์๋๋ค์ ํฌํจํ๊ณ ์๋ ํด๋์ค๋ฅผ ์ด์ฉํด์
์์์์ด ๋ค๋ฅธ ํด๋์ค์ ํ๋์ ๋ํด์ฃผ๋ ํ๋์ ๋ฐฉ๋ฒ์
๋๋ค.
์ฃผ๋ก ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ณต์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ฉฐ
์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ํก๋จ ๊ด์ฌ์ฌ
๋ผ๊ณ ํฉ๋๋ค.
๋๋ฆฌ ์ฌ์ฉ๋๋ ํจ๋ฌ๋ค์์ธ๋งํผ React
์ Vue
๋ฑ์ ๋ค์ํ FE ์ํคํ
์ณ์์๋
์ด ๊ฐ๋ ์ ์ด์ฉํด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๊ณ ์์ต๋๋ค.
1๏ธโฃ ES6 ์ class ๋ฅผ ์ด์ฉํ mixin
Object.assign
์ ์ด์ฉํ ๋ฉ์๋ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ mixin
ํจํด์ ๊ตฌํํ ์ ์์ต๋๋ค.
const GreetingMixin = {
sayHi() {
alert('Hello')
}
sayBye() {
alert('Bye')
}
}
class User {
constructor(name) {
this.name = name
}
}
Object.assign(User.prototype, GreetingMixin);
new User('JeongHyeon').sayHi();
2๏ธโฃ Vue ์์ mixin ์ ์ด์ฉํ ์ปดํฌ๋ํธ ๊ตฌ์ฑ
Vue
์์๋ mixin
์ ์ด์ฉํ ์ปดํฌ๋ํธ ๋ก์ง ์ฌ์ฌ์ฉ์ ์ง์ํฉ๋๋ค.
Vue 3
์์๋ ์ฌ์ ํ mixin
์ ์ง์ํ์ง๋ง ๋ช๊ฐ์ง ๋ฌธ์ ์ ๋ค ๋๋ฌธ์
Composition API
๋ผ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
Vue Mixin ์ปดํฌ๋ํธ ์ ์
import { Vue, Component } from 'vue-property-decorator'
@Component({})
export default class GreetingMixin extends Vue {
// ... APIs
}
์ด๋ ๊ฒ ์ฌ์ฉํฉ๋๋ค ๐
import { Mixins } from 'vue-property-decorator'
import GreetingMixin from './GreetingMixin.ts'
export default class Example extends Mixins(GreetingMixin) {
// ...
}
3๏ธโฃ React 15 ์์ mixin ์ ์ด์ฉํ ์ปดํฌ๋ํธ ๊ตฌ์ฑ
ํ์ฌ๋ deprecated
๋ ๋ฐฉ๋ฒ์ด์ง๋ง ํ๋ React
์์๋ mixin
์ ์ด์ฉํด์
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์์ต๋๋ค.
import React from 'react';
const GreetingMixin = {
sayHi() {
/** */
}
};
const MyComponent = React.createClass({
mixins: [GreetingMixin],
handleClick() {
this.sayHi();
},
render() {
return (
<button onClick={this.handleClick}>Say Hi!</button>
);
}
});
export default MyComponent;
๐ Mixin ์ ๋ง๋ฅ์ผ๊น?
์ด๋ ํจํด์ด๋ ๊ทธ๋ ๋ฏ์ด, ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋จ ํ๋์ ์์ ํํ์ ์กด์ฌํ์ง ์์ต๋๋ค.
mixin
๋ ๊ฒฐ๊ตญ์๋ ํ๊ณ์ ์ด ์๊ณ ์ด๋ฅผ ์ ์๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ค์์ ์ ๊ฐ ์ค์ ์
๋ฌด์์ mixin
์ ์ฌ์ฉํด๋ณด๋ฉฐ ๋๋ ํ๊ณ์ ๋ค๊ณผ React ๋ธ๋ก๊ทธ ์ ๊ฒ์ฌ๋ ๊ธ์ ์ฝ์ด๋ณด๋ฉฐ
๊ณต๊ฐํ ๋ถ๋ถ์ ์ ๋ฆฌํ ๋ด์ฉ๋ค์ ๋๋ค.
1๏ธโฃ Mixin ๋ด๋ถ ๋ฉ์๋์ ์ค๋ณต ์ํ์ด ์๋ค.
๊ท๋ชจ๊ฐ ์์ ํ๋ก์ ํธ์์๋ ํฐ ์ํฅ์ด ์์ ์ ์์ง๋ง, ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํจ๊ป ์งํํ๋
ํ๋ก์ ํธ์์๋ mixin
๋ด๋ถ์์ ์ ์ํ๋ ๋ฉ์๋์ ์ด๋ฆ ์ถฉ๋์ด ๋ฐ์ํ ์๋ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ํ๋ง๋ค ๋ค๋ฅด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํน์ ์ก์
์ ๋์ํ๋ ํธ๋ค๋ฌ ํจ์๋ค ๊ฐ์ ๊ฒฝ์ฐ
handleClick
ํน์ onClick
๊ณผ ๊ฐ์ด ์ผ๋ฐ์ ์ธ ํํ์ ๋ฉ์๋๋ค์ด
๊ฐ๊ฐ์ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ ์๋์ด ์๋ ๊ฒ์ ์ฌ์ฌ์น ์๊ฒ ๋ณผ ์ ์๋๋ฐ,
๋ง์ฝ mixin
๋ด๋ถ์์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ํจ์๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๋ฌผ๋ก ์ด๋ฌํ ๋ฌธ์ ๋ฅผ mixin
๋ค์ด๋ฐ ๊ท์น์ ํตํด ํด๊ฒฐํ ์๋ ์์ง๋ง,
๋ชจ๋ ๊ตฌ์ฑ์์ด ํด๋น ๋ฃฐ์ ๋ฐ๋ผ์ผ ํ๊ณ ์ธ๋ถ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ๋์ผํ ์ปจ๋ฒค์
์ด ์ ์ฉ๋์ด์๋ค๋
๋ณด์ฅ์ด ์๊ธฐ ๋๋ฌธ์ 100% ์ ๋ขฐ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
โญ๏ธ Mixin naming convention ์์
์ด์ ์ Vue
๋ฅผ ํตํด ๊ฐ๋ฐํ ๋์๋ ํ๋ก์ ํธ ๋ด์์ ์ฌ์ฉ๋๋ mixin
์์
๊ณต๊ฐ๋๋ API์ ๋ค์๊ณผ ๊ฐ์ด prefix
๋ฅผ ๋ถ์ฌํ๋ ๋ค์ด๋ฐ ๊ท์น์ ์ ์ฉํ์ต๋๋ค.
import { Vue, Component } from 'vue-property-decorator'
@Component({})
export default class GreetingMixin extends Vue {
private name = 'owen'
public GreetingMixin_sayHi() {
console.log(`say hi to ${this.name}!`)
}
}
2๏ธโฃ Mixin ๋ผ๋ฆฌ ์ํธ ๊ฐ์ ํ์ฅ์ด ํ์ํ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
์ํธ ๋
๋ฆฝ์ ์ธ mixin
์ ์ค๊ณํ๋ค๋ ๊ฒ์ ์ค์ ์๋น์ค๋ฅผ ๊ตฌํํ๋ค ๋ณด๋ฉด
๊ต์ฅํ ์ด์์ ์ด๊ณ ๋ง์ ๋ ธ๋ ฅ์ ํ์๋ก ํ๋ค๋ ๊ฒ์ ๋๋ ์ ์์ต๋๋ค.
๊ฐ๋์ ์๋น์ค ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ด์ฉ ์ ์์ด ๊ธฐ์กด์ ์กด์ฌํ๋ ํน์ mixin
์ ์์กดํ๋
๋ค๋ฅธ mixin
์ ์ค๊ณ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ๋ mixin
์ฌ์ด์ ์์กด์ฑ์ด ์ฝ๋์ ์ ๋ฐ์ ์ธ ์ ์ง๋ณด์์ฑ์ ๋ฎ์ถ๊ณ
๋ณต์กํ mixin
๊ตฌ์กฐ ๋๋ฌธ์ ์๋ก์ด ๊ฐ๋ฐ์๊ฐ ํด๋น ์ฝ๋๋ก ์์
ํ ๋ ์ด๋ ค์์ ์ค ์ ์์ต๋๋ค.
์ด๋ค ๋ณํ๊ฐ side effect
๋ฅผ ๋ถ๋ฌ์ฌ์ง ์์ธก์ด ์๋๊ธฐ ๋๋ฌธ์ด์ฃ .
3๏ธโฃ Mixin ์ด ๋ง์์๋ก ๋ถ์์ด ์ด๋ ต๊ณ ์ฝ๋ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๋ค.
๋ฐ๋ก ์ 2๋ฒ
์์ ์ธ๊ธํ ๋ฌธ์ ์ ์ฐ๊ด๋๋ ๋ฌธ์ ์
๋๋ค.
mixin
์์ ์ ์ํ ๋ฉ์๋๋ค์ ํด๋น mixin
์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฝ๋์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉฐ ์๋ง์ ๊ณตํต ๋ก์ง๋ค์ด mixin
์ผ๋ก ๊ด๋ฆฌ๋๋ฉด
์ด๋ค ํจ์๊ฐ ์ด๋์๋ถํฐ ์ ๋๋ ๊ฒ์ด๊ณ ๋งฅ๋ฝ ํ์ ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค.
mixin
๋ค์ด๋ฐ ๊ท์น์ ํตํด ๋๋ต์ ์ธ ๋งฅ๋ฝ์ ํ์
๊ฐ๋ฅํ ์๋ ์์ง๋ง
์๋ก ๋ณต์กํ๊ฒ ์ฝํ์๋ mixin
๋ค์ ์์กด์ฑ์ ์ํด ๋ฆฌํฉํ ๋ง์ ์ด๋ ต๊ฒ ํ๊ณ
์๋น์ค ๋ก์ง ๋ถ์์ด ์ด๋ ค์์ง๋๋ค.
๐ ๋ ์์ ๋จ์๋ก ์ชผ๊ฐ์!
โ ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ ์ปดํฌ๋ํธ ํฉ์ฑ
React
์์๋ ์ด๋ฌํ ๋ฌธ์ ์ ์ ์๊ณ mixin
์ ์ด์ฉํ ์ปดํฌ๋ํธ ํ์ฅ ์ง์์ ์ค์งํ์ต๋๋ค.
๋์์ผ๋ก ์ํ ๊ฐ์ ๊ณต์ ํ๊ธฐ ์ํด์ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)
๋ render prop
๋ฅผ ์ฌ์ฉํ๊ฑฐ๋
์ปดํฌ๋ํธ ํฉ์ฑ
๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ํตํด ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๊ฒ์ ์๋ดํ๊ณ ์์ต๋๋ค.
โ React Hook ์ ๋ฑ์ฅ
React 16.8
๋ถํฐ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ๋ฑ์ฅํ hook
์ ๊ธฐ์กด์ ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก
์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์์์ ๋ฒ์ด๋ ํจ์ํ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๊ณ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ
์ฌ๋ฌ React
์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํ์์ต๋๋ค.
useState
, useEffect
, useRef
์ ๊ฐ์ด ๋นํธ์ธ์ผ๋ก ์ ๊ณต๋๋ hook
์ด์ธ์๋
๊ฐ๋ฐ์๋ ์์ ๋ง์ hook
์ ์ ์ํ๊ณ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค.
โ Vue composition API
Vue 3.0
์ ์ด๋ฅด๋ฌ์ Vue
์ง์์ ์๋ก์ด ์ปดํฌ๋ํธ ํจ๋ฌ๋ค์์ด ๋ฑ์ฅํ์ต๋๋ค.
Composition API
๋ ๊ท๋ชจ๊ฐ ํฐ Vue
์ปดํฌ๋ํธ์์ ๋ฐ์ํ๋ ๋
ผ๋ฆฌ์ ๊ด์ฌ์ฌ์ ๋จํธํ๋ก ์ธํ
๋ณต์กํ ์ปดํฌ๋ํธ ๋ฐ ์ ์ง๋ณด์์ฑ ์ ํ๋ผ๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์๋์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ์ ๋ค๋ฃจ์ง ์์ง๋ง, React Hook
๊ณผ ์ ์ฌํ ํํ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง์
ํจ์ ๋จ์๋ก ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
Mixins Are Dead. Long Live Composition
๋ฏน์ค์ธ
Mixins Considered Harmful - React Blog
์๊ฐ | Vue.js
'๐จโ๐ป web.dev > log' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TDD ์ ํจ๊ป ์ฌ๋ด ์๋น์ค ๊ฐ์ ํ๊ธฐ (1) | 2023.05.15 |
---|---|
์ index ๋ 0๋ถํฐ ์์ํ ๊น? (0) | 2023.03.12 |
๋๋ฉ์ธ ๊ธฐ๋ฐ์ FE ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ (0) | 2022.03.07 |
๐ฌ ๋๊ธ