π Chapter 1: ν¨μν κΈΈλ€μ΄κΈ°
- μ΅κ·Όμ μ ννκΈ° μμν 리μ‘ν°λΈ νλ‘κ·Έλλ°μ λ°μ΄ν° νλ¦(data flow)κ³Ό λ³κ²½ μ ν(propagation of change)μ μ΄μ μ λλ€.
- μλ°μ€ν¬λ¦½νΈλ‘ λΉλκΈ° λλ μ΄λ²€νΈ μ€μ¬ μ½λλ₯Ό λ€λ£° λλ μ΄λ° λΆλΆμ΄ μμ£Ό μ€μνλ€.
π ν¨μν νλ‘κ·Έλλ°μ κ³Όμ° μ μ©νκ°?β
- FP μ¬κ³ λ°©μμ μλ°μ€ν¬λ¦½νΈλ§μ λ§€μ° ννμ μΈ νΉμ±μ κ°λ€λ¬μ΄, κΉλνλ©΄μ λͺ¨λμ μΈ, ν μ€νΈνκΈ° μ’κ³ κ°κ²°ν μ½λλ₯Ό μμ±νλ λ° λμμ΄ λλ€.
- μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό ν¨μνμΌλ‘ μμ±νλ©΄ λλΆλΆμ λ¬Έμ κ° ν΄κ²°λλ€. μμν¨μμ κΈ°λ°μ λκ³ μ΄λ―Έ κ²μ¦λ κΈ°λ²κ³Ό κ΄λ‘μ λ°λΌ ꡬννλ©΄ μ½λκ° μ μ 볡μ‘ν΄μ§λλΌλ ν€μ리기 μ¬μ΄ λ°©ν₯μΌλ‘ μμ±ν μ μλ€.
π ν¨μν νλ‘κ·Έλλ°μ΄λ?β
- ν¨μν νλ‘κ·Έλλ°μ΄λ, νλ§λλ‘ ν¨μ μ¬μ©μ κ°μ‘°νλ μννΈμ¨μ΄ κ°λ° μ€νμΌμ΄λ€.
- λͺ©νλ μ ν리μΌμ΄μ μ λΆμ ν¨κ³Ό(Side Effect)λ₯Ό λ°©μ§νκ³ μν λ³μ΄(mutation of state) λ₯Ό κ°μνκΈ° μν΄ λ°μ΄ν°μ μ μ΄ νλ¦κ³Ό μ°μμ μΆμ(abstract)νλ κ²μ΄λ€.
document.querySelector('#msg').innerHTML = '<h1>Hello World!</h1>';
- μ μμ λ λͺ¨λ κ±Έ νλμ½ λ©ν λ¨μν νλ‘κ·Έλ¨μ΄λΌμ λ©μμ§λ₯Ό λμ μΌλ‘ νμν μ μλ€.
- ν¨μλ₯Ό λ§λ€μ΄ λ¬λΌμ§λ λΆλΆλ§ 맀κ°λ³μλ‘ μ£Όλ©΄ κ°μ μ½λλ₯Ό λ€μ μ¬μ©ν μ μλ€.
function printMessage(elementId, format, message) {
document.querySelector(`#${elementId}`).innerHTML = `<${format}>${message}</${format}>`;
}
- λμμ§κΈ΄ νμ§λ§ μλ²½ν μ¬μ¬μ© κ°λ₯ν μ½λλ μλλ€.
- λ©μμ§λ₯Ό HTML νμ΄μ§ λμ νμΌμ μ¨λ³΄μ.
- 맀κ°λ³μκ° λ¨μν μ€μΉΌλΌ κ°μ΄ μλ, νΉμ κΈ°λ₯μ ν¨μμ μΆκ°νμ¬ λ§€κ°λ³μλ‘ μ λ¬νλ, λ€μ λ§ν΄ ν¨μλ₯Ό 맀κ°λ³μννλ μ ν λ€λ₯Έ μ°¨μμ κ³Όμ μ λ μ¬λ €μΌ νλ€.
var printMessage = run(addToDom('msg'), h1, echo);
printMessage('Hello World!');
- μμ ν¨μλ€μ μ¬λ£λ‘ μλ‘μ΄ ν¨μλ₯Ό λ§λ€μ΄λΈλ€.
- μ¬μ¬μ©μ±κ³Ό λ―Ώμμ±(reliability)μ΄ μ’κ³ μ΄ν΄νκΈ° μ¬ μ΄, λ μμ μ‘°κ°λ€λ‘ νλ‘κ·Έλ¨μ λλ ν, μ 체μ μΌλ‘ λ ν€μ리기 μ¬μ΄ ννμ νλ‘κ·Έλ¨μΌλ‘ λ€μ μ‘°ν©νλ κ³Όμ μ λνλΈλ€.
- μμ ν¨μ run μ°Έκ³
- ν¨μν μ½λλ κΈ°λ³Έμ μΌλ‘, λ§μΉ μκ³ λ¦¬μ¦μ μ΄κΈ° 쑰건μ μ‘°μ νλ―, λ³Έμ°μ κΈ°λ₯μ κ·Έλλ‘ κ°μ§ν μ± μ½λλ₯Ό μ½κ² λ³κ²½νκΈ° μν΄ μ½λ μ체λ₯Ό 맀κ°λ³μννλ κ²μ΄λ€.
π ν¨μν νλ‘κ·Έλλ°μ μ μΈμ β
- ν¨μν νλ‘κ·Έλλ°μ ν° νμμ μ μΈμ (declarative) νλ‘κ·Έλλ° ν¨λ¬λ€μμ μνλ€.
- λ΄λΆμ μΌλ‘ μ½λλ₯Ό μ΄λ»κ² ꡬννλμ§, λ°μ΄ν°λ μ΄λ»κ² νλ¬κ°λμ§ λ°νμ§ μμ μ± μ°μ°/μμ μ νννλ μ¬μμ΄λ€.
- μμ§μ μλ°, C#, C++ λ±μ ꡬ쑰μ /κ°μ²΄μ§ν₯ μΈμ΄κ° μ§μνλ λͺ λ Ήν λλ μ μ°¨μ λͺ¨λΈμ΄ λ λ§μ΄ μ°μΈλ€.
- λͺ λ ΉνμΌλ‘ μ§ μ½λ
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for(let i = 0; i < array.length; i++) {
array[i] = Math.pow(array[i], 2);
}
- λͺ λ Ήν νλ‘κ·Έλλ°μ μ»΄ν¨ν°μκ² μνλ μμ μ μ΄λ»κ² νλμ§ μμΈν μ΄λ₯Έλ€.
- μ΄μ λ¬λ¦¬ μ μΈμ νλ‘κ·Έλλ°μ νλ‘κ·Έλ¨μ μμ λΆμ νκ°λΆλ₯Ό λΆλ¦¬νμ¬, μ μ΄ νλ¦μ΄λ μν λ³νλ₯Ό νΉμ νμ§ μκ³ λ νλ‘κ·Έλ¨ λ‘μ§μ΄ 무μμΈμ§λ₯Ό ννμμΌλ‘ λνλΈλ€.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(
function(num) {
return Math.pow(num, 2);
}
);
- 루νλ₯Ό ν¨μλ‘ μΆμνλ©΄ ES6λΆν° μλ‘ μ λ³΄μΈ λλ€ ννμ(lambda expression) μ΄λ νμ΄ν ν¨μ(arrow function) λ₯Ό μΈ μ μλ€.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => Math.pow(num, 2));
- 루νλ₯Ό μ κ±°ν΄μΌ λλ μ΄μ λ 루νλ₯Ό μ¬μ¬μ©νκΈ°λ μ΄λ ΅κ³ λ€λ₯Έ μ°μ°μ λΌμ λ£κΈ°λ μ΄λ €μ΄ λͺ λ Ήν μ μ΄ κ΅¬μ‘°λ¬Όμ΄λ€.
- λ 루νλ μ±κ²©μ λ°λ³΅ν λλ§λ€ κ°μ΄λ μνκ° κ³μ λ°λλ€.
- κ·Έλ¬λ ν¨μν νκ·Έλ¨μ 무μνμ±(statelessness) κ³Ό λΆλ³μ±(immutability) μ μ§ν₯νλ€.
- 무μν μ½λλ μ μ μνλ₯Ό λ°κΎΈκ±°λ νΌμ μ μΌμΌν¬ κ°λ₯μ±μ΄ λ¨ 1%λ μ‘΄μ¬νμ§ μλλ€.
- μνλ₯Ό λμ§ μμΌλ €λ©΄ λΆμν¨κ³Όμ μν λ³μ΄λ₯Ό μΌμΌν€μ§ μλ μμν¨μ(pure function) λ₯Ό μ¨μΌ νλ€.
π μμν¨μμ λΆμν¨κ³Όβ
- ν¨μν νλ‘κ·Έλλ°μ μμν¨μλ‘ κ΅¬μ±λ λΆλ³ νλ‘κ·Έλ¨ κ΅¬μΆμ μ μ λ‘ νλ€.
- μμν¨μ νΉμ±
- μ£Όμ΄μ§ μ λ ₯μλ§ μμ‘΄ν λΏ, νκ° λμ€ λλ νΈμΆ κ° λ³κ²½λ μ μλ μ¨κ²¨μ§ κ°μ΄λ μΈλΆ μνμ 무κ΄νκ² μλνλ€.
- μ μ κ°μ²΄λ λ νΌλ°μ€λ‘ μ λ¬λ 맀κ°λ³μλ₯Ό μμ νλ λ± ν¨μ μ€μ½ν λ°μμ μ΄λ€ν λ³κ²½λ μΌμΌν€μ§ μλλ€.
var counter = 0;
function increment() {
return ++counter;
}
- μμ μ μ€μ½νμ μλ μΈλΆ λ³μ
counter
λ₯Ό μ½κ³ μμ νλ―λ‘ λΆμνλ€. - μΈλΆ μμμ μλλ‘ λ°μ΄ν°λ₯Ό μ½κ³ μ°λ ν¨μλ λΆμν¨κ³Όλ₯Ό λλ°νλ€.
- μ¬κΈ°μ
counter
λ μμμ μ μ λ³μλ₯Ό ν΅ν΄ μ κ·Όνλλ°,this
ν€μλλ₯Ό κ±°μ³ μΈμ€ν΄μ€ λ°μ΄ν°μ μ κ·Όνλ κ² μμ λΆμν¨κ³Όκ° μ λ°λλ€. - λ€μμ λΆμν¨κ³Όκ° λ°μνλ μν©μ΄λ€.
- μ μ λ³μμμ λ³μ, μμ±, μλ£κ΅¬μ‘°λ₯Ό λ³κ²½
- ν¨μμ μλ μΈμ κ°μ λ³κ²½
- μ¬μ©μ μ λ ₯μ μ²λ¦¬
- μμΈλ₯Ό μΌμΌν¨ ν΄λΉ ν¨μκ° λΆμ‘μ§ μκ³ (catch) κ·Έλλ‘ μμΈλ₯Ό λμ§(throw)
- νλ©΄ λλ λ‘κ·Έ νμΌμ μΆλ ₯
- HTML λ¬Έμ, λΈλΌμ°μ μΏ ν€, DBμ μ§μ
- μ΄λ λ― λ¬΄μ‘°κ±΄ ν¨μν νλ‘κ·Έλλ°μ λͺ¨λ μν λ³μ΄λ₯Ό κ·Όμ νμλ 건 μλκ³ , μν λ³μ΄λ₯Ό μ€μ΄κ³ κ΄λ¦¬ν μ μλ νλ μμν¬λ₯Ό μ 곡νμ¬ μμ/λΆμ ν¨μλ₯Ό ꡬλΆνμλ κ²μ΄λ€.
- λ€μ μμ λ SSNμΌλ‘ νμ λ μ½λλ₯Ό κ²μνμ¬ λΈλΌμ°μ μ νμνλ λͺ λ Ήν νλ‘κ·Έλ¨μ΄λ€.
function showStudent(ssn) {
let student = db.find(ssn); // db μ‘°ν
if(student !== null) {
document.querySelector(`#${elementId}`).innerHTML = `
${student.ssn},
${student.firstname},
${student.lastname}
`;
}
else {
throw new Error('νμμ μ°Ύμ μ μμ΅λλ€.');
}
}
showStudent('444-44-4444');
- μ΄ ν¨μλ νμ€ν μμ μ μ€μ½νλ₯Ό λ²μ΄λ λͺ κ°μ§ λΆμν¨κ³Όλ₯Ό νμ₯μ μΌμΌν¨λ€.
- λ³μ
db
λ₯Ό ν΅ν΄ λ°μ΄ν°μ μ κ·Όνλλ°, ν¨μ μλͺ μλ μ΄λ° 맀κ°λ³μκ° μκΈ° λλ¬Έμ μΈλΆ λ³μμ΄λ€. elementId
λ κ·Έ κ°μ΄ μΈμ λΌλ κ·Έ κ°μ΄ μΈμ λ μ§ λ°λ μ μλ μ μ λ²μλ€.- HTML μμλ₯Ό μ§μ κ³ μΉκΈ° λλ¬Έμ κ·Έ μμ²΄λ‘ κ°λ³μ μΈ, μ μ 곡μ μμμ΄λ€.
- νμ λ μ½λλ₯Ό μ°Ύμ§ λͺ»ν΄ μμΈλ₯Ό λμ§λ©΄ μ 체 νλ‘κ·Έλ¨μ μ€νμ΄ ν ν리면μ μ’ λ£λ κ²μ΄λ€.
- λ³μ
- κ·Έλ κΈ° λλ¬Έμ ν¨μνμΌλ‘ ꡬνλΆλ₯Ό κ°μ ν μ μλ€.
- κΈ΄ ν¨μλ₯Ό νλμ λͺ©μ μ κ°μ§ 짧μ ν¨μλ‘ κ°κ° λΆλ¦¬νλ€.
- ν¨μκ° ν΄μΌ ν μμ μ νμν μΈμλ₯Ό λͺ¨λ λͺ μνμ¬ λΆμν¨κ³Ό κ°μλ₯Ό μ€μΈλ€.
- 컀λ§μ μ¬μ©νμ¬ λ¨ν ν¨μ(unary function) λ‘ λλλ€.
var find = curry((db, id) => {
let obj = db.find(id);
if(obj === null) {
throw new Error('κ°μ²΄λ₯Ό μ°Ύμ μ μμ΅λλ€.');
}
return obj;
});
var csv = student =>
`${student.ssn}, ${student.firstname}, ${student.lastname}`;
var append = curry((selector, info) => {
document.querySelector(selector).innerHTML = info;
});
- λΆμν¨κ³Όλ₯Ό μ€μμΌλ‘μ¨ μΈλΆ 쑰건 λ³νμ λ μ·¨μ½ν νλ‘κ·Έλ¨μ΄ λμλ€.
- ν¨μκ° μΌκ΄λ λ°νκ°μ 보μ₯νλλ‘ ν΄μ μ 체 ν¨μ κ²°κ³Όλ₯Ό μμΈ‘ κ°λ₯ν λ°©ν₯μΌλ‘ μ λνλ©΄ μ¬λ¬λͺ¨λ‘ μ΄λ‘μ΄λ° μ΄κ²μ μ°Έμ‘° ν¬λͺ μ±(referential transparency) μ΄λΌλ μμν¨μ λ³Έμ°μ νΉμ§μ΄λ€.
π μ°Έμ‘° ν¬λͺ μ±κ³Ό μΉνμ±β
- μ°Έμ‘° ν¬λͺ μ±μ μμν¨μλ₯Ό μ μνλ μ’ λ 곡μμ μΈ λ°©λ²μ΄λ©°, μ¬κΈ°μ μμμ±(purity) μ΄λ ν¨μμ μΈμμ κ²°κ΄κ° μ¬μ΄μ μμν 맀ν κ΄κ³λ₯Ό μλ―Ένλ€.
- λ°λΌμ μ΄λ€ ν¨μκ° λμΌν μ λ ₯μ λ°μμ λ λμΌν κ²°κ³Όλ₯Ό λ΄λ©΄ μ΄λ₯Ό μ°Έμ‘° ν¬λͺ ν ν¨μλΌκ³ νλ€.
- μ°Έμ‘° ν¬λͺ ν ν¨μλ‘ λ§λ€λ €λ©΄ μ΄ ν¨μκ° μμ‘΄νλ μν, μ¦ μΈλΆ λ³μλ₯Ό μ κ±°νκ³ ν¨μ μλͺ μ μ κ· λ§€κ°λ³μλ‘ λͺ μν΄μΌ νλ€.
// λ³κ²½ μ
var counter = 0;
function increment() {
return ++counter;
}
// λ³κ²½ ν
var increment = counter => counter + 1;
- μ΄λ° ν¨μλ μ½λλ₯Ό ν μ€νΈνκΈ° μ½κ³ μ 체 λ‘μ§μ νμ νλ κ²λ μ½λ€.
π λΆλ³ λ°μ΄ν° μ μ§νκΈ°β
- λΆλ³ λ°μ΄ν°λ νλ² μμ±λ νμλ μ λ λ°κΎΈμ§ μλλ€.
- λ°°μ΄μ μ λ ¬νλ κ°λ¨ν μ½λμ΄λ€.
var sortDesc = arr => {
arr.sort(
(a, b) => b - a
);
};
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9,];
sortDesc(arr); // [9, 8, 7, 6, 5, 4, 3, 2, 1]
- μΌν 보기μ λΆμν¨κ³Όμ μ ν 무κ΄ν΄ 보μ΄μ§λ§, λΆννλ μνμ ν¨μμΈ
Array.sort
λ μλ³Έ λ νΌλ°μ€κ° κ°λ¦¬ν€λ λ°°μ΄μ μμλ₯Ό μ λ ¬νλ λΆμν¨κ³Όλ₯Ό μΌμΌν¨λ€. - ν¨μν νλ‘κ·Έλλ°μ, μΈλΆμμ κ΄μ°° κ°λ₯ν λΆμ ν¨κ³Όκ° μ κ±°λ λΆλ³ νλ‘κ·Έλ¨μ μμ±νκΈ° μν΄ μμν¨μλ₯Ό μ μΈμ μΌλ‘ νκ°νλ κ²μ΄λ€.
- ν¨μλ₯Ό μμ μ°μ°μ κ΄μ μμ λ°μ΄ν°λ₯Ό μ λ λ³κ²½νμ§ μλ κ³ μ λ μμ λ¨μλ‘ λ°λΌλ³Έλ€λ©΄ μ μ¬μ μΈ λ²κ·Έλ μ€κ² λ κ²μ΄λ€.
π ν¨μν νλ‘κ·Έλλ°μ μ’μ μ β
- FPλ‘ κ°λ°ν μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ
μ μ΄λ€ μ μ΄ μ’μκΉ
- κ°λ¨ν ν¨μλ€λ‘ μμ μ λΆν΄νλ€.
- νλ¦ μ²΄μΈμΌλ‘ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ€.
- 리μ‘ν°λΈ ν¨λ¬λ€μμ μ€ννμ¬ μ΄λ²€νΈ μ€μ¬ μ½λμ 볡μ‘μ±μ μ€μΈλ€.
π 볡μ‘ν μμ μ λΆν΄νλλ‘ μ λβ
- ν¨μν νλ‘κ·Έλλ°μ κ³ μμ€μμ 보면, μ¬μ€μ λΆν΄μ ν©μ±κ°μ μνΈμμ©μ΄λΌ ν μ μλ€.
- μ΄λ¬ν μλ©΄μ± λλΆμ ν¨μν νλ‘κ·Έλ¨μ λͺ¨λμ μΌλ‘, ν¨μ¨μ μΌλ‘ λμνλ€.
- λͺ¨λμ±μ λ¨μ, 곧 μμ λ¨μλ ν¨μ μμ μ΄λ€.
- FPμμ λͺ¨λνλ λ¨μΌμ±(singularity) μ μ리μ λ°μ ν κ΄λ ¨μ΄ μλ€.
- λͺ¨λ¦μ§κΈ° ν¨μλ μ λ§λ€ ν κ°μ§ λͺ©νλ§ λ°λΌλ΄μΌ νλ€λ μ¬μμ΄λ€.
- λ ν¨μλ₯Ό ν©μ±νλ©΄ 첫 λ²μ§Έ ν¨μμ κ²°κ³Όλ₯Ό λ€μ ν¨μμ λ°μ΄ λ£λ μλ‘μ΄ ν¨μκ° νμνλ€.
var showStudent = compose(append('#student-info'), csv, find(db));
showStudent('444-44-4444');
compose
ν¨μλ ν¨μν μ ν리μΌμ΄μ μ λͺ¨λμ±κ³Ό μ¬μ¬μ©μ±μ νμ΅νλ λ° λ§€μ° κ°λ³ν μλ―Έλ₯Ό μ§λλ€.- ν¨μνμΌλ‘ ν©μ±ν μ½λλ μ 체 ννμμ μλ―Έλ₯Ό κ°λ³ μ‘°κ°μ μλ―Έμμ μΆλ‘ ν μ μλ€.
- λν, ν¨μ ν©μ±μ κ³ μμ€μ μΆμνλ₯Ό ν΅ν΄ μμΈν λ΄λ§μ λ°νμ§ μ μλ μ½λκ° μννλ μ λ¨κ³λ₯Ό μΌλͺ©μμ°νκ² λνλΈλ€.
compose
λ λ€λ₯Έ ν¨μλ₯Ό μΈμλ‘ λ°μΌλ―λ‘ κ³ κ³ν¨μ(higher-order-function) λΌκ³ νλ€.
π λ°μ΄ν°λ₯Ό 맀λλ½κ² 체μ΄λνμ¬ μ²λ¦¬β
- ν¨μν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©νλ©΄ μ΄λ μλ°μ€ν¬λ¦½νΈ νλ‘μ νΈλΌλ λ€μν κ³ κ³ν¨μλ₯Ό λ§μκ» κ°μ Έλ€ μΈ μ μλ€.
- ν¨μν λΌμ΄λΈλ¬λ¦¬: λ‘λμJS(Lodash), λλ€JS(Ramda)
- λ λΌμ΄λΈλ¬λ¦¬μ 곡ν΅μ μ ν¨μ 체μΈμ 쑰립νλ€.
- 체μΈ(chain) μ κ°μ κ°μ²΄λ₯Ό λ°ννλ μμ°¨μ μΈ ν¨μ νΈμΆμ΄λ€.
- λ€μμ νμλ€μ νκ· μ μλ₯Ό κ³μ°νλ μμ μ΄λ€.
let enrollment = [
{ enrolled: 2, grade: 100 },
{ enrolled: 2, grade: 80 },
{ enrolled: 1, grade: 89 },
];
// λͺ
λ Ήν
var totalGrades = 0;
var totalStudentsFound = 0;
for(let i = 0; i < enrollment.length; i++) {
let student = enrollment[i];
if(student !== null) {
if(student.enrolled > 1) {
totalGrades +=student.grade;
totalStudentsFound++;
}
}
}
var average = totalGrades / totalStudentsFound; // 90
- κ° λ¨κ³μμ ν΄λΉνλ ν¨μλ₯Ό λ‘λμJSλ‘ λ¬ΆμΌλ©΄ λ€μκ³Ό κ°μ ν¨μ 체μΈμ΄ νμ±λλ€.
- ν¨μ 체μΈμ νμν μμ κΉμ§ μ€νμ 미루λ λκΈν νκ°(lazy evaluation) λ₯Ό μννλ€.
- λ€ λ₯Έ λ°μμ μ ν μΈ μΌμ΄ μλ μΌλ ¨μ μ½λλ₯Ό μ λΆ μ€ννμ§ μμλ λλ CPU λΆνκ° μ€μ΄λ€μ΄ μ±λ₯μ΄ μ’μμ§λ€. μ΄λ κ² νλ©΄ λ€λ₯Έ ν¨μν μΈμ΄μ κΈ°λ³Έ νμ¬λ νμ μ νΈμΆ(call-by-need) λμμ ν¨κ³Όμ μΌλ‘ λͺ¨λ°©ν μ μλ€.
_.chain(enrollment)
.filter(student => student.enrolled > 1)
// κ°μ²΄λ‘ ꡬμ±λ λ°°μ΄μμ κ°μ²΄μ νΉμ ν€μλν κ°μ μΆμΆν λ μ¬μ©νλ€. version 4 deleted??
.pluck('grade')
.average()
.value(); // 90
π 볡μ‘ν λΉλκΈ° μ ν리μΌμ΄μ μμλ μ μνκ² λ°μβ
- 리μ‘ν°λΈ ν¨λ¬λ€μμ κ°μ₯ ν° μ₯μ μ, λ λμ μμ€μΌλ‘ μ½λλ₯Ό μΆμνμ¬ λΉλκΈ°, μ΄λ²€νΈ κΈ°λ° νλ‘κ·Έλ¨μ μ€μ νλλΌ λ°λ³΅λλ νλ°μ΄ μ½λλ μμ μκ³ λΉμ§λμ€ λ‘μ§μλ§ μ λ ν μ μκ² ν΄μ€λ€λ μ μ΄λ€.
- λ ν¨μλ₯Ό 체μΈμΌλ‘ λ¬Άκ³ ν©μ±νλ FPμ λ₯λ ₯μ μ΅λν μ΄λμ΄λΌ μ μλ€.
- λ€μ μμ λ μ΄λ€ νμμ SSNμ΄ μ¬λ°λ₯Έ λ²νΈμΈμ§ κ²μ€νλ ν¨μμ΄λ€.
var valid = false;
var elem = document.querySelector('#student-ssn');
elem.onkeyup = function(event) {
var val = elem.value; // λΆμ ν¨κ³Ό
if(val !== null && val.length !== 0) {
val = val.replace(/^\s*|\-|\s*$/g, ''); // μ
λ ₯ λ°μ΄ν° μ μ /λ³κ²½
if(val.length === 9) {
console.log(`μ¬λ°λ₯Έ SSN: ${val}!`);
valid = true; // λΆμ ν¨κ³Ό
}
}
else {
console.log(`μλͺ»λ SSN: ${val}!`);
}
};
- μ μ½λλ 볡μ‘ν΄λ³΄μ΄κ³ , λΉμ§λμ€ λ‘μ§μ΄ λͺ¨λ νκ³³μ μ§μ€λμ΄ μμ΄ λͺ¨λμ±λ κ²°μ¬λμ΄ μλ€.
- 무μλ³΄λ€ μ΄ ν¨μλ μΈλΆ μνμ μμ‘΄νλ νμ μ¬μ¬μ©μ΄ μ΄λ ΅λ€.
- ν¨μν νλ‘κ·Έλλ°μ κΈ°λ°μ λ 리μ‘ν°λΈ νλ‘κ·Έλ¨μ μμν¨μλ₯Ό μ΄μ©νμ¬
map
,reduce
μ²λΌ λ§μ΄ μ°λ μ°μ°μΌλ‘ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ μκ³ λλ€ ννμμ κ°κ²°ν¨μ λ릴 μ μλ€λ μ΄μ μ΄ μλ€. - 리μ‘ν°λΈ ν¨λ¬λ€μμ μ΅μ λ²λΈ(observable) μ΄λΌλ μμ£Ό μ€μν μ₯μΉλ₯Ό 맀κ°λ‘ μμ§μ΄λλ°, μ΅μ λ²λΈμ μ΄μ©νλ©΄ λ°μ΄ν° μ€νΈλ¦Όμ ꡬλ ν΄μ μνλ μ°μ°μ ν©μ± λ° μ²΄μ΄λνμ¬ μ²λ¦¬ν μ μλ€.
Rx.Observable.fromEvent(document.querySelector('#student-ssn'), ('keyup'))
.pluck('srcElement', 'value')
.map(ssn => ssn.replace(/^\s*|\-|\s*$/g, ''))
.filter(ssn => ssn !== null && ssn.length === 9)
.subscribe(validSsn => {
console.log(`μ¬λ°λ₯Έ SSN ${validSsn}!`);
})
- κ°μ₯ μ£Όλͺ©ν΄μΌ ν λΆλΆμ, μννλ λͺ¨λ μ°μ°μ΄ μμ ν λΆλ³μ΄κ³ λΉμ§λμ€ λ‘μ§μ λͺ¨λ κ°λ³ ν¨μλ‘ λλμλ€λ μ μ΄λ€.
- κ΅³μ΄ λ¦¬μ‘ν°λΈ/ν¨μνμ μμ΄ μΈ νμλ μμ§λ§, ν¨μνμΌλ‘ μ¬κ³ νλ€ λ³΄λ©΄ λ κ°μ§λ₯Ό νΌμ©νκ² λμ΄ κ²°κ΅ ν¨μν 리μ‘ν°λΈ νλ‘κ·Έλλ°(FRP) μ΄λΌλ μν€ν μ²μ λμ λ¨κ² λλ€.
- κ°μ²΄μ§ν₯ μ€κ³λ₯Ό FPκ° μμ ν λ체νλ κ²μΌκΉ?
- ν¨μν νλ‘κ·Έλλ°μ μ½λμ μ μ©νλ 건 μ λΆλ₯Ό μ»κ±°λ μ λΆλ₯Ό μλ μμ μ κ·Ό λ°©λ²μ΄ μλλ€.
- FPλ λΆλ³μ±κ³Ό 곡μ μνλ₯Ό μ격νκ² ν΅μ νλ―λ‘ λ©ν°μ€λ λ νλ‘κ·Έλ¨λ λ³΄λ€ μ§κ΄μ μΌλ‘ μμ±ν μ μλ€.