๋ฉํ ๋ง 8๋ฒ์งธ
๐ F-lab ๋ฉํ ๋ง ๊ธฐ๋ก
๋ฉํ ๋ง ์ดํ ๋ถ์กฑํ ๋ถ๋ถ์ ์ฑ์ฐ๊ธฐ ์ํ ๊ธฐ๋ก
โ ์ต์ ๋ฒ ํจํด์ด๋
์ต์ ๋ฒ ํจํด(observer pattern)์ ๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ ๊ด์ฐฐ์๋ค, ์ฆ ์ต์ ๋ฒ๋ค์ ๋ชฉ๋ก์ ๊ฐ์ฒด์ ๋ฑ๋กํ์ฌ ์ํ ๋ณํ๊ฐ ์์ ๋๋ง๋ค ๋ฉ์๋ ๋ฑ์ ํตํด ๊ฐ์ฒด๊ฐ ์ง์ ๋ชฉ๋ก์ ๊ฐ ์ต์ ๋ฒ์๊ฒ ํต์งํ๋๋ก ํ๋ ๋์์ธ ํจํด์ด๋ค. ์ฃผ๋ก ๋ถ์ฐ ์ด๋ฒคํธ ํธ๋ค๋ง ์์คํ
์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ๋ฐํ/๊ตฌ๋
๋ชจ๋ธ๋ก ์๋ ค์ ธ ์๊ธฐ๋ ํ๋ค.
์ข๋ ๋จ์ํ๊ฒ ์๊ฐํ๋ฉด ์ด๋ค ๊ฐ์ฒด(A)์ ์ํ๊ฐ ๋ณํ ๋, ๊ทธ์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ค(B)์๊ฒ ์๋ฆผ์ ๋ณด๋์ผ๋ก์จ ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ๋ฎ์ถ๋ ๋์์ธ ํจํด
์ด๋ค.
B๋ A๋ฅผ ๊ตฌ๋
ํจ์ผ๋ก์จ , A์์ ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๋ฐํํ ๋ B์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๊ฒ๋ ํ๋ ๋์์ธ ํจํด์ด๋ค.
A๋ Observable, Subject ๋ฑ์ผ๋ก ๋ถ๋ฆฌ๊ณ Model์ด ๊ทธ ์ญํ ์ ํ๋ค. B๋ Observer์ด๋ฉฐ View์ ํด๋นํ๋ค.
class Observable {
constructor() {
this._observers = new Set();
}
subscribe(observer) {
this._observers.add(observer);
}
unsubscribe(observer) {
this._observers = [...this._observers].filter((subscriber) => subscriber !== observer);
}
notify(data) {
this._observers.forEach((observer) => observer(data));
}
}
์ต์ ๋ฒ ํจํด์ ์ด์ฉํด ํด๊ฒฐํ๋ ค๋ ์ํ ๋ณ๊ฒฝ?
ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋, ์ด ๊ฐ์ฒด์๊ฒ ์์กดํ๊ณ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์๊ฒ ์ํ ๋ณ๊ฒฝ์ ๋ํด ์๋ฆฌ๋ฉด์ ๋์์ ์ด๋ค ํ๋์ ์ทจํ๊ฒ ํ๋ ๊ฒ
๋์จํ ๊ฒฐํฉ
: ๋ ๊ฐ์ฒด๊ฐ ์ํธ์์ฉ์ ํ์ง๋ง, ์๋ก์ ๋ํด์๋ ์ ๋ชจ๋ฅด๊ฒ ํ๋ ๊ฒฐํฉ
- ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฐ์ฒด(Subject)๋ Observer๋ค์ ์ ๋ณด๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ ํ์์์ด ์ ๋ณด ์ ๋ฌ์ ํ ์ ์๋ค.
โ immutable์ ์ ์งํ๋ฉด์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
const a = {
name: 'hodu',
others: { age: 2, favorite: 'walking' },
};
// age๋ง ๋ณ๊ฒฝํ์ฌ ๋ค๋ฅธ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
// 1) Object.assign() ์ด์ฉ
const b = Object.assign({}, a, {
others: Object.assign({}, { age: 2, favorite: 'walking' }, { age: 31 }),
});
// 2) spread ์ฐ์ฐ์ ์ด์ฉ
const b = { ...a, others: { ...a.others, age: 31 } };
โ SPA ๊ทธ๋ฆฌ๊ณ ๋ผ์ฐํ
SPA
SPA๋ Single Page Application์ ์ฝ์๋ก, ํ๋์ ํ์ด์ง์์ ๋์ ์ผ๋ก ์ํ๋ ๋ถ๋ถ๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๋ฉฐ ํ๋ฉด์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ํํํ๋ ๊ฒ์ด๋ค.
ํด๋ฆญ, ์คํฌ๋กค ๋ฑ์ ์ํธ์์ฉ์ ์ํ ์ต์ํ์ ์์ ๋ณ๊ฒฝ์ด ์ผ์ด๋๊ณ ์ ์ ์ ๋์ ํ์ด์ง ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ค๊ณ ๋ณด์ฌ์ง๋ ๊ฒ ๋ํ ์ต์ด ๋ก๋๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ค.(์๋ฒ์์ ์๋ก์ด html์ ์์ฒญํ๋ ๊ฒ์ด ์๋๋ค.)
SPA์ ๋จ์
- ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์ผ๋ก ํ๋ฉด ํน์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์, ์ผ๋ฐ์ ์ธ html์ ํฌ๋กค๋งํ๋ ๊ฒ์ ์์ง์ ์์ด ์ต์ ํ๊ฐ ์ด๋ ค์ธ ์ ์๋ค.
- ํ์ด์ง ์ด๊ธฐ ๋ก๋ ์, ์น๊ณผ ๊ด๋ จํ ํ์ผ๋ค์ด ๋ฒ๋ค๋์ด ์ ์ก๋๊ธฐ์ ์ด๊ธฐ ๋ก๋ ์๋๊ฐ ๋๋ฆด ์ ์๋ค.
- ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ์ฝ๋ ์คํ๋ฆฌํ , gzip ์์ถ ๋ฑ์ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ์ด๋ง์ ๋ ํด๊ฒฐ์ด ํ๋ค๋ฉด SSR(Server Side Rendering)๋ก ๋์ด๊ฐ๋ค.
๋ผ์ฐํ
SPA๋ฅผ ํตํด UX(User Experience; ์ฌ์ฉ์ ๊ฒฝํ)๋ฅผ ๋์ธ ๊ฒ์ ์ข์๋ค. ๊ทธ๋ฐ๋ฐ ๋จ์ผ ํ์ด์ง์ด๋ค ๋ณด๋ ์์์ ์ผ๋ก ์๊ฐํด๋ด๋ ํ์ด์ง์ ์, ๋ค
๋ฅผ ์ค๊ฐ ์ ์๋ ์์ผ๋ก๊ฐ๊ธฐ, ๋ค๋ก๊ฐ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค. ์ฆ, ์ฌ์ฉ์ ๊ฒฝํ์ด ๋จ์ด์ง๊ฒ ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด client routing ๊ฐ๋
์ด๋ฉฐ, ๋จ์ํ๊ฒ ์๊ฐํ๋ฉด ํด๋ผ์ด์ธํธ ์์ญ์์ ๊ฐ์์ ํ์ด์ง ์ฃผ์(route)๋ฅผ ๋ง๋ค์ด ํ๋ฉด ์ด๋์ด ์ผ์ด๋ ๊ฒ์ฒ๋ผ ์๋ํ๊ฒ ํ๋ ๊ฒ์ด๋ค. ์ด ๋, ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ history API
๋ฅผ ํ์ฉํ๊ฒ ๋๋ค.
- history.back(): ์ธ์
๊ธฐ๋ก ๋ฐ๋ก ์ด์ ํ์ด์ง๋ก ์ด๋ํ๋ ๋น๋๊ธฐ ๋ฉ์๋.
๋ค๋ก ๊ฐ๊ธฐ
- history.forward(): ์ธ์
๊ธฐ๋ก ๋ฐ๋ก ์ดํ ํ์ด์ง๋ก ์ด๋ํ๋ ๋น๋๊ธฐ ๋ฉ์๋.
์์ผ๋ก ๊ฐ๊ธฐ
- history.go(): ํน์ ์ธ์ ๊ธฐ๋ก์ผ๋ก ์ด๋ํ๊ฒ ํด์ฃผ๋ ๋ฉ์๋. 0์ ํ์ฌ ์์น์ด๋ฉฐ -1์ ์ด์ , 1์ ์ดํ ํ์ด์ง๋ก ์ด๋ํ๋ค.
- history.pushState(): ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ธ์ ๊ธฐ๋ก ์คํ์ ๋ด๋๋ค. ์ง๋ ฌํ ๊ฐ๋ฅํ ๋ชจ๋ JavaScript ๊ฐ์ฒด๋ฅผ ์ ์ฅ ๊ฐ๋ฅํ๋ค.
- history.replaceState(): ์ต๊ทผ ์ธ์ ๊ธฐ๋ก ์คํ์ ๋ด์ฉ์ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ก ๊ต์ฒดํ๋ค.
์ฆ, history API๋ฅผ ์ด์ฉํ์ฌ ์ฃผ์๋ฅผ ์ธ์์ ์ผ๋ก ๋ณ๊ฒฝํ๊ณ , ์๋ฒ๋ก ์๋ก์ด ํ์ด์ง๋ฅผ ์์ฒญํ๋ ๊ฒ์ด ์๋๋ผ history.state์ ๋ด์๋ ์ ๋ณด๋ก ajax ์์ฒญ์ ๋ณด๋ด ํ๋ฉด์ ๊ฐฑ์ ํ ์ ์๊ฒ ๋๋ค.
โ Test 3๊ฐ์ง
์ ๋ ํ ์คํธ(unit test)
- ์ ์ฒด ์ฝ๋ ์ค ์์ ๋จ์๋ฅผ ๋ค๋ฃจ๋ ํ ์คํธ(์ฃผ๋ก ํจ์ ๋จ์)
- ํ ์คํธ์ ๋คํธ์ค, DB์ ๊ฐ์ ์ธ๋ถ ๋ฆฌ์์ค๊ฐ ํฌํจ๋๋ค๋ฉด ์ ๋ ํ ์คํธ๊ฐ ์๋๋ค.
- ์ ๋ ํ ์คํธ๋ ๊ฐ๋จํ๊ณ ๋ช ํํด์ผํ๋ค. ์์ธก๊ฐ๊ณผ ์ ๋ ฅ๊ฐ์ ๋ํ ํจ์์ ์ถ๋ ฅ๊ฐ์ ๋น๊ต
- ์ฝ๋ ์์ฒด์ ์ค๊ณ๊ฐ ์ข์ง ๋ชปํ๋ค๋ฉด, ์ ๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ๋ ์ด๋ ค์์ง๋ค.
- ์ด๋ ํ ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ์๊ณ ๊ณ ์น ๋ถ๋ถ์ด ์ด๋์ธ์ง ๋ช ํํ๊ฒ ํด์ค๋ค.
ํตํฉ ํ ์คํธ(Integration test)
- ๊ฐ๊ฐ์ ์์คํ ๋ค์ด ์๋ก ์ด๋ป๊ฒ ์ํธ์์ฉํ๊ณ , ์ ๋๋ก ์๋ํ๋์ง ํ ์คํธํ๋ ๊ฒ
- ์ ๋ ํ ์คํธ์ ์ ์ฌํ์ง๋ง, ์ ๋ ํ ์คํธ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๋ ๋ฐ๋ฉด ํตํฉ ํ ์คํธ๋ ๊ทธ๋ ์ง ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ํ ์คํธ๋ก ์ถฉ๋ถํ์ง ์๋ค๊ณ ๋๋ ๋ ์ฌ์ฉํ๋ฉฐ, ๋๊ฒ ์ ๋ ํ ์คํธ๋ณด๋ค ๋ณต์กํ๊ณ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ ๋ ํ ์คํธ์ ์ง์คํ๋ ๊ฒ์ด ์ข๋ค.
์์คํ ํ ์คํธ(System test)
- ์ํํธ์จ์ด(์ ํ)๊ฐ ์์ ํ ํตํฉ๋์ด ๊ตฌ์ถ๋ ์ํ์์ ์ ํ์ ๊ธฐ๋ฅ์ ์ด์ฒด์ ์ผ๋ก ๊ฒ์ฌํ๋ ๊ฒ
- ๊ฐ๊ฐ์ ํตํฉ๋ ๋ชจ๋๋ค์ด ์๋ ๊ณํํ๋ ๋๋ก ์๋ํ๋์ง, ์ค์คํ ์ ์ค์ ๋์๊ณผ ์๋์๋ ์ฐจ์ด๊ฐ ์๋์ง ๋ฑ์ ํ๋จํ๋ค.
- ์์คํ ์ ๋ด๋ถ์ ์ธ ๊ตฌํ ๋ฐฉ์, ์ค๊ณ์ ๋ํ ์ง์๊ณผ ๊ด๊ณ์์ด ํ ์คํธ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ๋ธ๋๋ฐ์ค ํ ์คํธ์ ์ผ์ข ์ผ๋ก ๋ถ๋ฅ๋๋ค.
๋ธ๋๋ฐ์ค ํ ์คํธ: ์ํํธ์จ์ด์ ๋ํ
๋ด๋ถ ๊ตฌ์กฐ๋ ์๋ ์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋ ์ํ
์์ ์ํํธ์จ์ด์ ๋์์ ๊ฒ์ฌํ๋ ๋ฐฉ๋ฒ
์ฃผ๋ก ์ฌ๋ฐ๋ฅธ/์ฌ๋ฐ๋ฅด์ง ์์ ์ ๋ ฅ์ ํ๋ํ๋ ๋์ํ์ฌ ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ์ ํ๋ณํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
โ OOP์ 4๋ ํต์ฌ ๊ฐ๋ (feat. JavaScript)
์บก์ํ(Encapsulation)
- ๋ด๋ถ์์๋ง ์๊ณ ์์ด๋ ๋๋ ์ ๋ณด๋ ์ธ๋ถ์ ๊ณต๊ฐํ์ง ์๋๋ค.(
์ ๋ณด์๋
) - ๋จ, ํ์ํ ๋ถ๋ถ์ ํํด์๋ง ์ธ๋ถ์ ์ ๊ทผ์ ํ์ฉํ๋ค.
- ๊ณต์์ ์ผ๋ก JavaScript๋ ์ง์ํ์ง๋ ์๋์ง๋ง, ํด๋ก์ ๋ module pattern ๋ฑ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ์ ๊ฐ๋ฅ
์์(Inheritance)
- ์์ ํด๋์ค์ ํ๋กํผํฐ, ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค์์๋ ์ฌ์ฉ
- ์ฆ, ์ฝ๋์
์ฌ์ฌ์ฉ
ํ๊ธฐ ์ํ ๋ชฉ์ - ES6์ Class์๋ extends, super()์ ํตํด ์์์ด ๊ฐ๋ฅ
- ๋จ, ์ด ๋ํ JavaScript์ prototype chain์ ํตํด ๊ตฌํ๋์ด์๋ ๊ฒ์ด๋ค.
์ถ์ํ(Abstraction)
- ๊ตฌํํ๋ ค๋ ์ค์ฒด์ ๋ํด์ ํ์ํ ๋ถ๋ถ๋ง์ ์ ํํ์ฌ ํด๋์ค๋ก ๋ง๋ค ์ ์๋ ๊ฒ
- โ์ฐจโ๋ โ๋ฒ์คโ์ โ์ค์ฅ๋นโ ํด๋์ค๋ก ๊ตฌ๋ถ์ง์ ์ ์๋ค. ํ๋, ๋ฒ์ค์ ์ค์ฅ๋น๋ ์๋ก ๋ค๋ฅธ ํ๋กํผํฐ์ ๋ฉ์๋๊ฐ ํ์ํ๋ค. ์ฆ, ์ด๋ ๊ฒ ํ์ํ ๋ถ๋ถ์ ์ ํํ์ฌ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒ์ด ์ถ์ํ
- ๋น์ฐํ JavaScript์์๋ ์ถ์ํ ๊ฐ๋ฅ!
๋คํ์ฑ(Polymorphism)
- ๋ค์ํ ์ฑ์ง๋ก ๋์ํ ์ ์๋ ๊ฒ
- Java์์์ ์์
- ์ค๋ฒ๋ผ์ด๋ฉ(overriding): A๋ผ๋ ํด๋์ค๋ฅผ ์์ํ๋ a๋ผ๋ ํ์ ํด๋์ค๊ฐ ์์ ๋, A์ ๋ฉ์๋๋ฅผ a์์ ์ฌ์ ์ํ๋ ๊ฒ
- ์ค๋ฒ๋ก๋ฉ(overloading): B๋ผ๋ ํด๋์ค๋ด์ add(x, y)๋ผ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ๋ x์ y๊ฐ int ์๋ฃํ์ผ ๋์ add์ str ์๋ฃํ์ผ ๋์ add๋ฅผ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ก ๊ตฌํํ ์ ์๋ ๊ฒ(์ฆ, add(x, y)๋ x์ y๊ฐ int๋ , str์ด๋ ์๊ด์์ด ํด๋นํ๋ ๋ฉ์๋๋ฅผ ์คํํ ์ ์๊ฒ ๋๋ค.)
- JavaScript์์๋ prototype chain์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ์ ๊ตฌํํ ์ ์๋ค.
- ๋ค๋ง, overloading์ ๊ฒฝ์ฐ ๊ณต์์ ์ธ ์ง์์ ์๋ค.(๊ตณ์ด ์ต์ง๋ก ํ์๋ฉด, ๋ณ์์ ํ์ ์ ์ฒดํฌํ๊ณ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์คํํ๋ ๋ฐฉ๋ฒ์ด ์๊ธดํ๋ค.)
- JavaScript์ ๋คํ์ฑ์ด ์กด์ฌํ๋๊ฐ? ๋ ์ค์ํ ๋ ผ์๊ฑฐ๋ฆฌ๋ ์๋๋ค!
โ CORS๋ ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น
CORS ์ ์ฑ
์ด๋ ๋จ์ํ๊ฒ ์๊ฐํ๋ฉด SOP(Same-Origin Policy)์ ๋ํ ์์ธ ์กฐํญ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์น ๋ธ๋ผ์ฐ์ ๋ SOP์ ๋ฐ๋ผ, ๋์ผํ ์ถ์ฒ(์ถ์ฒ = ํ๋กํ ์ฝ + ํธ์คํธ + ํฌํธ)์ ๋ฆฌ์์ค๋ง ๊ณต์ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์น ํ์ด์ง๋ฅผ ๊ตฌ์ฑ ์ ์ธ๋ถ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ๋ฐ์ ์์ผ๋ฏ๋ก ์ด์ ๋ํ ์์ธ์กฐํญ์ผ๋ก CORS(Cross-Origin Resource Sharing)๋ฅผ ๋๊ณ ์๋ค.
CORS ํด๊ฒฐ ๋ฐฉ๋ฒ
- ๋์ผ ์ถ์ฒ๋ก ์ด๋: ์์ฃผ ๋จ์ํ๊ฒ ๊ฐ์ ์ถ์ฒ๋ก ์ด๋์ํจ๋ค.
- ์๋ฒ์์ Access-Control-Allow-Origin ํค๋๋ฅผ ์ถ๊ฐํ๋ค.
- ๋ฆฌ์์ค์ ์ถ์ฒ๊ฐ ๋๋ ์๋ฒ์, ๋ชจ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ํ cross-origin http ์์ฒญ์ ํ๊ฐํ๋
Access-Control-Allow-Origin
ํค๋๋ฅผ ์ถ๊ฐํด์ค๋ค. ๋ค๋ง, ์ ์ฒด ํธ์คํธ์ ๋ํ ์์ฒญ์ ํ์ฉํ๊ฒ ๋๊ธฐ์ ๋ณด์์ ์ทจ์ฝํด์ง๋ค.
- ๋ฆฌ์์ค์ ์ถ์ฒ๊ฐ ๋๋ ์๋ฒ์, ๋ชจ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ํ cross-origin http ์์ฒญ์ ํ๊ฐํ๋
- Proxy: Proxy Server๋ ํค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ฒญ์ ํ์ฉ ๋ฐ ๊ฑฐ๋ถํ๋ ์ญํ ์ ์ค๊ฐ์์ ํด์ค ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ก์ ์๋ฒ์์
Access-Control-Allow-Origin
ํค๋๋ฅผ ๋ด์ ์๋ตํด ์ฃผ๋ฉด ๋๋ค.- proxy๋ ํ์์ ์ด์ง ์์ง๋ง, ๋ฐฑ์๋์์ ๊ฐ๋ฐ์๋ฒ๋ฅผ ์ํ CORS๋ฅผ ์ค์ ์ ์ํด๋ ๋๊ธฐ์ ๋ถํ์ํ ์ฝ๋๋ฅผ ์๋ ์ ์๋ค.
- ํ๋ก ํธ์๋์์
webpack-dev-server proxy
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์ชฝ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ํด๊ฒฐํ ์ ์๋ค.
โ http์์ https๋ก s๊ฐ ๋ถ๋ ๊ณผ์ (ssl ์ธ์ฆ์ ๋ฐ๊ธ์ ์ผ๋ จ ๊ณผ์ )
์ธํฐ๋ท ์์์ ์น ๋ธ๋ผ์ฐ์ (Client)์ ์น ์๋ฒ(Server)๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด์๋ ์๋ก ์ํธํํ์ฌ ํต์ ์ ํด์ผํ๋ค.
SSL(Secure Socket Layer)
์ ์น ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ ์ํธํ ํต์ ์ ์ํ ํ๋กํ ์ฝ์ด๋ฉฐ, SSL์ธ์ฆ์๋ SSL ๊ธฐ๋ฐํ์์ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ ์ํธํ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ธ์ฆ์(์ 3์ ์ ๋ขฐ๊ธฐ๊ฐ์ด ์ธ์ฆํ)๋ฅผ ์๋ฏธํ๋ค.
SSL์ธ์ฆ์์ 3๊ฐ์ง ๊ธฐ๋ฅ
- ์ ๋ณด ์ ์ถ ๋ฐฉ์ง: ํ์ค ์ํธํ ๊ธฐ๋ฒ์ ํตํด ์ ์ก์์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ์ก
- ๊ธฐ์ ์ค์ฒด์ฑ ํ์ธ: ์๋ฅผ ๋ค์ด, ์ฟ ํก์ ์ฃผ๋ฌธ์ ํ ๋ ์ฟ ํก์ด๋ผ๋ ๊ธฐ์ ์ ์ค์ฒด์ฑ(์ฌ์ ์ ๋ฑ๋ก๊ณผ ๊ฐ์)์ ํ์ธ ํ์ ์ฟ ํก์ SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ
- ์์กฐ์ฌ์ดํธ ๋ฐฉ์ง: ์ฌ์ดํธ์ ์ง์ ์ฌ๋ถ๋ฅผ ํ๋จ
์ํธํ
๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ์์ง๋ฅผ ์ํธํํ์ฌ ์๋ฒ์ ์ ์กํ๋ฉด, ์๋ฒ๋ ์ํธํํค(๋น๋ฐํค)๋ก ์ํธํ๋ ๋ฉ์์ง๋ฅผ ํด๋
(๋ณตํธํ)ํ๋ ๊ณผ์ ์ด ์ด๋ค์ง๋ค.
- ๋์นญํค ์ํธํ: ๋ฉ์์ง๋ฅผ ์ํธํํ ๋ ์ฌ์ฉํ๋ ๋น๋ฐํค์ ๋ฉ์์ง๋ฅผ ๋ณตํธํํ ๋ ์ฌ์ฉํ๋ ๋น๋ฐํค๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
์ด ๋, ๊ทธ๋ ๋ค๋ฉด ๊ฐ์ ๋น๋ฐํค๋ฅผ ์ด๋ป๊ฒ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ ์ ๋ฌํ ์ง์ ๋ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
USB ๋ฑ์ ์ ์ฅ์ฅ์น๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ, ๋น๋ฐํค ์์ฒด๋ฅผ ์ํธํํ์ฌ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ ๋ฑ์ด ์๋๋ฐ ์ด๋ ํ์ค์ ์ผ๋ก ํด๊ฒฐ์ฑ ์ด ์๋๋ค.
ํด์ ๋ฑ์ฅํ ๊ฒ์ด๋น๋์นญํค ์ํธํ
ํน์๊ณต๊ฐํค ์ํธํ
๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐฉ์์ด๋ค.
- ๋น๋์นญํค ์ํธํ(๊ณต๊ฐํค ์ํธํ): ์ก์ ์์ ์์ ์๊ฐ ๊ฐ๊ฐ 2๊ฐ์ ํค๋ฅผ ์์ฑํ๋๋ฐ, ํ๋๋
๊ฐ์ธํค
์ด๊ณ ๋๋จธ์ง ํ๋๋๊ณต๊ฐํค
- ๊ณต๊ฐํค๋ก ์ํธํํ๋ฉด ๊ฐ์ธํค๋ก ๋ณตํธํ๊ฐ ๊ฐ๋ฅํ๊ณ , ๊ฐ์ธํค๋ก ์ํธํํ๋ฉด ๊ณต๊ฐํค๋ก ๋ณตํธํ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์ฆ, ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ๊ณต๊ฐํค๋ก ์ํธํ๋ฅผ ํ์ฌ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์๋ฒ์ ๊ฐ์ธํค๋ก ๋ณตํธํ๋ฅผ ์งํํ๋ค.
- ๋ฐ๋๋ก ์๋ฒ๋ ๋ธ๋ผ์ฐ์ ์ ๊ณต๊ฐํค๋ก ์ํธํ, ๋ธ๋ผ์ฐ์ ๋ ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ธํค๋ก ๋ณตํธํํ์ฌ ๋ ์์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
- ์๋ฒ๊ฐ ์๋ฒ์ ๊ณต๊ฐํค(SSL ์ธ์ฆ์) ์ก์
- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ๊ณต๊ฐํค๋ฅผ ๊ฒ์ฆ(์ธ์ฆ๊ธฐ๊ด์ ๊ฒ์ฆ์ ์์ฒญ)
------๊ฒ์ฆ ์๋ฃ ํ-------
- ๋ธ๋ผ์ฐ์ ๊ฐ ๋์นญํค ์์ฑ
- ๋ธ๋ผ์ฐ์ ๋
๊ฒ์ฆ๋ ์๋ฒ์ ๊ณต๊ฐํค
๋ก ๋์นญํค๋ฅผ ์ํธํ ๋ฐ ์ก์ - ์๋ฒ๋
์๋ฒ์ ๊ฐ์ธํค
๋ก ๋์นญํค๋ฅผ ๋ณตํธํ------๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ ๋์นญํค๋ฅผ ์์ ํ๊ฒ ๊ตํ-------
- ์ด์ ๋ธ๋ผ์ฐ์ ๋ ๋์นญํค๋ก ๋ฉ์์ง ์ํธํ ๋ฐ ์ ์ก
- ์๋ฒ๋ ๋์นญํค๋ก ์์ ํ ๋ฉ์์ง๋ฅผ ๋ณตํธํ
๐ Reference
์ํค๋ฐฑ๊ณผ-์ต์ ๋ฒ ํจํด
์ต์ ๋ฒํจํด
ํ
์คํธ(1)
ํ
์คํธ(2)
์ํค๋ฐฑ๊ณผ-์์คํ
ํ
์คํธ
์ํค๋ฐฑ๊ณผ-๋ธ๋๋ฐ์ค ํ
์คํธ
SOP์ CORS
SSL, ๊ทธ๋ฆฌ๊ณ ์ํธํ