본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 Chapter 1: 쒋은 μ†Œν”„νŠΈμ›¨μ–΄ λ§Œλ“€κΈ°

πŸ“š λ°”λ₯΄κ²Œ μ‹œμž‘ν•˜λŠ” μ½”λ“œ μž‘μ„±ν•˜κΈ°β€‹

🎈 μžλ°”μŠ€ν¬λ¦½νŠΈ νŠΉμ„±μ„ μ™„λ²½νžˆ μ„­λ ΅ν•˜λΌβ€‹

사둀 연ꡬ: D3.js​

전체적인 λ‚΄μš©μ€ μ˜ˆμ œν˜•μ‹μ΄λΌ μƒλž΅. (rj.js와 pathFromArray.js μ°Έκ³ )

const rj3 = {};

rj3.svg = {};

rj3.svg.line = function () {
let getX = function (point) {
return point[0];
};

let getY = function (point) {
return point[1];
};

const interpolate = function (points) {
return points.join('L');
};

function line(data) {
const segments = [];
const points = [];
let i = -1;
const n = data.length;
let d;

function segment() {
segments.push('M', interpolate(points));
}

while (++i < n) {
d = data[i];
points.push([+getX.call(this, d, i), +getY.call(this, d, i)]);
}

if (points.length) {
segment();
}

return segments.length ? segments.join('') : null;
}

line.x = function (funcToGetX) {
if (!arguments.length) {
return getX;
}

getX = funcToGetX;
return line;
};

line.y = function (funcToGetY) {
if (!arguments.length) {
return getY;
}

getY = funcToGetY;
return line;
};

return line;
};
  1. μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜ 내뢀에 쀑첩될 수 있으며, μ΄λŠ” μŠ€μ½”ν”„λ₯Ό λ‹€μŠ€λ¦¬λŠ” μ€‘μš”ν•œ μˆ˜λ‹¨μ΄λ‹€.
  2. μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” 일급 μ‹œλ―Όλ‘œμ„œ μžμ‹ λ§Œμ˜ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.
  3. μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ©”μ„œλ“œ/ν”„λ‘œνΌν‹°λ₯Ό μ§€λ‹Œ 객체둜, λ‹€λ₯Έ μ–Έμ–΄μ˜ ν•¨μˆ˜λ³΄λ‹€ 훨씬 μœ μ—°ν•˜κ³  κ°•λ ₯ν•˜λ‹€.
  4. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체 지ν–₯적 ν•¨μˆ˜ μ˜€λ²„λ‘œλ”© κ°œλ…μ€ ν•¨μˆ˜μ˜ argumentsλ₯Ό 보고 여기에 λ­”κ°€ λ§žμΆ”λŠ” ν–‰μœ„λ‹€.
  5. 덕 타이핑을 잘 ν™œμš©ν•˜λΌ. 적은 μ½”λ“œλ‘œλ„ 객체λ₯Ό ν­λ„“κ²Œ λ‹€λ£° 수 μžˆλ‹€.
  6. ν΄λ‘œμ €λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 정말 κ°•λ ₯ν•œ 섀계 μš”μ†Œλ‹€. λͺ¨λ“  ν•¨μˆ˜λŠ” ν΄λ‘œμ €λ‹€.
  7. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ thisλŠ” 섀계 κ΄€μ μ—μ„œ 절호의 κΈ°νšŒκ°€ 될 수 μžˆλ‹€. 잘 써먹도둝 ν•˜μž!
    • thisλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 객체λ₯Ό μ°Έμ‘°ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ 움직인닀​

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ 움직인닀. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ‹€λ₯Έ μ‹μœΌλ‘œ 비동기 ν”„λ‘œκ·Έλž˜λ°μ„ ν•΄μ•Ό ν•œλ‹€λŠ” λœ»μ΄λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ–΄λ–€ μ΄λ²€νŠΈκ°€ λλ‚˜μžλ§ˆμž μ‹€ν–‰ν•  ν•¨μˆ˜λ₯Ό 큐에 λ„£λŠ”κ²Œ κ³ μž‘μ΄λ‹€. μ—¬κΈ°μ„œ μ΄λ²€νŠΈλž€ 일정 μ‹œκ°„ κ²½κ³Ό(setTimeout), λ‹€λ₯Έ μ›Ή μ‚¬μ΄νŠΈμ—μ„œ 데이터 쑰회(XMLHttpRequest.send), 마우슀 클릭 등이닀. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 이벀트 λ£¨ν”„μ—μ„œ ν•œ λ²ˆμ— ν•˜λ‚˜μ”© ν•¨μˆ˜λ₯Ό κΊΌλ‚΄ μ‹€ν–‰ν•œλ‹€.

🎈 λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 함정을 ν”Όν•˜λΌβ€‹

μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ“ˆμ΄ μ•„λ‹ˆλ‹€β€‹

μ—¬λŸ¬λΆ„μ΄ μž‘μ„±ν•œ μŠ€ν¬λ¦½νŠΈλŠ” 이 μŠ€ν¬λ¦½νŠΈκ°€ λ‹΄κΈ΄ .js 파일 μ•ˆμ— 담겨 μžˆμœΌλ‹ˆ μ–΄λ–€ κ²½μš°λΌλ„ μ™„μ „ λΆ„λ¦¬λŠ” λΆˆκ°€λŠ₯ν•˜λ‹€. 파일 첫 뢀뢄이 μ΄λ ‡κ²Œ μ‹œμž‘ν•˜λ©΄,

var myVariable = makeValue();

myVariable은 같은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‹€λ₯Έ μŠ€ν¬λ¦½νŠΈμ—μ„œλ„ λ³Ό 수 있고 makeValue ν•¨μˆ˜λ„ λ§ˆμ°¬κ°€μ§€λ‹€.

μŠ€μ½”ν”„λŠ” 쀑첩 ν•¨μˆ˜λ‘œ λ‹€μŠ€λ¦°λ‹€β€‹

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν΄λž˜μŠ€κ°€ μ—†μ§€λ§Œ, ν•¨μˆ˜λ₯Ό μ€‘μ²©ν•˜μ—¬ μ½”λ“œλ₯Ό 계측화할 수 μžˆλ‹€. 덕뢄에 κ°œλ°œμžκ°€ μ›ν•˜λŠ” 것을 μ°ΎλŠ” 데 도움이 될 뿐만 μ•„λ‹ˆλΌ ν”„λ‘œκ·Έλž¨μ—μ„œ λ³€μˆ˜/ν•¨μˆ˜μ˜ μŠ€μ½”ν”„λ₯Ό μ΅œμ†Œν™”ν•  수 μžˆλ‹€.

κ·œμ•½μ„ μ§€μΌœ μ½”λ”©ν•œλ‹€β€‹

λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ„ 잘 κΎΈλ € λ‚˜κ°€λ €λ©΄ 될 수 μžˆλŠ” ν•œ μž‘κ²Œ λ§Œλ“€μ–΄μ•Ό νš¨κ³Όμ μ΄λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 간이 고루 잘 λ°΄ 덕 νƒ€μ΄ν•‘μ˜ κΈ°μƒμ²œμ™Έν•œ μœ μ—°μ„± 덕뢄에 적은 μ½”λ“œλ‘œλ„ λ§Žμ€ 일을 ν•  수 μžˆλ‹€.

λ°˜λ©΄μ—, μžμ‹ μ΄ μ§  ν”„λ‘œκ·Έλž¨μ΄ λˆ„κ°€ 무엇을 던져 넣을지 도톡 μ•Œ μˆ˜κ°€ μ—†λ‹€. ν•¨μˆ˜ μΈμžμ— νŠΉμ •ν•œ 쑰건이 μžˆλ‹€λ©΄ κ·Έ 값을 κΌ­ 검증해야 ν•œλ‹€.

🎈 μ†Œν”„νŠΈμ›¨μ–΄ 곡학 원칙을 μ μš©ν•˜λΌβ€‹

SOLID 원칙​

SOLIDλŠ” 마이클 νŽ˜λ”μŠ€κ°€ 1990λ…„λŒ€ ν›„λ°˜, λ‘œλ²„νŠΈ λ§ˆν‹΄μ΄ ν™•λ¦½ν•œ λ‹€μŒ λ‹€μ„― 가지 객체 지ν–₯ 섀계 원칙을 잘 κΈ°μ–΅ν•˜λ €κ³  μ§œλ‚Έ λ¨Έλ¦¬κΈ€μžλ‹€.

  • Single Responsibility Principle (단일 μ±…μž„ 원칙)
  • Open/Closed Principle (개방/폐쇄 원칙)
  • Liskov Substitution Principle (λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙)
  • Interface Segregation Principle (μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙)
  • Dependency Inversion Principle (μ˜μ‘΄μ„± μ—­μ „ 원칙)

단일 μ±…μž„ 원칙​

λ‹€μ†Œ κ³Όμž₯ν•΄μ„œ λ§ν•˜λ©΄ λͺ¨λ“  클래슀(μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜)λŠ” λ°˜λ“œμ‹œ ν•œ 가지 λ³€κ²½ μ‚¬μœ κ°€ μžˆμ–΄μ•Ό ν•œλ‹€.

μ˜ˆμ œμ—μ„œ rj3.svg.line은 μ•„λŠ”κ²Œ 거의 μ—†λ‹€. κ·Έμ € 점 데이터λ₯Ό λ°°μ—΄λ‘œ λ°›μ•„ SVG 경둜λ₯Ό κ·Έλ €μ£ΌλŠ” ν•¨μˆ˜(λ‚΄λΆ€ line)λ₯Ό λ°˜ν™˜ν•  뿐이닀.

이 ν•¨μˆ˜μ˜ μœ μΌν•œ κ΄€μ‹¬μ‚¬λŠ” λ°°μ—΄μ—μ„œ SVG 경둜λ₯Ό λ§Œλ“œλŠ” 일이닀. 이 관심사λ₯Ό μ–΄λ–»κ²Œ μ΄ν–‰ν• μ§€λŠ” μ² μ €ν•˜κ²Œ μ™ΈλΆ€μ—μ„œ μ œκ³΅ν•œ ν•¨μˆ˜μ— 달렀 μžˆμœΌλ‹ˆ λ³€κ²½ν•  μ΄μœ κ°€ μ „ν˜€ μ—†λ‹€.

개방/폐쇄 원칙​

λͺ¨λ“  μ†Œν”„νŠΈμ›¨μ–΄ κ°œμ²΄λŠ” ν™•μž₯ κ°€λŠ₯성은 μ—΄μ–΄ λ‘λ˜ μˆ˜μ • κ°€λŠ₯성은 λ‹«μ•„μ•Ό ν•œλ‹€λŠ” 원칙이닀.

즉, μ–΄λ–€ κ²½μš°λΌλ„ μ‹€ν–‰ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ 말고, μ–΄λ–»κ²Œλ“  (상속 λ“±μ˜ λ°©λ²•μœΌλ‘œ) μž¬μ‚¬μš©ν•˜κ³  ν™•μž₯ν•˜λΌλŠ” λœ»μ΄λ‹€.

d3.svg.line ν•¨μˆ˜λ₯Ό 섀계할 λ•Œ 마이크 λ³΄μŠ€ν†‘μ€ λ°μ΄ν„°μ—μ„œ μ’Œν‘―κ°’μ„ λ½‘μ•„λ‚΄λŠ” 방법과 점을 μ—°κ²°ν•˜λŠ” 방법에 λ³€κ²½ 사항이 있으리라 내닀보고 μ΄λŸ¬ν•œ νŠΉμ„±μ„ μΆ”μƒν™”ν•˜μ—¬ ν•¨μˆ˜ λ°–μœΌλ‘œ λΉΌλ‚΄λŠ” 기지λ₯Ό λ°œνœ˜ν–ˆλ‹€.

κ·Έκ°€ λ³€κ²½λ˜μ§€ μ•Šμ„ 거라고 λ³Έ 건 SVG 경둜의 κ·œκ²©μ΄λ‹€. λ°˜λ“œμ‹œ M으둜 μ‹œμž‘ν•΄μ„œ κ·Έ 뒀에 점 데이터가 μ΄μ–΄μ§€λŠ” λ¬Έμžμ—΄ ν˜•νƒœλ‘œ 과감히 경둜 λ¬Έμžμ—΄μ„ ν•˜λ“œ μ½”λ”©ν•œ 것이닀. SVG λͺ…μ„Έμ„œκ°€ ν•˜λ£¨μ•„μΉ¨μ— λ°”λ€” 일은 없을 ν…Œλ‹ˆ d3.svg.line μ—­μ‹œ μ†λŒˆ 일은 거의 없을 것이닀.

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙​

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙을 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”ν•œ ν‘œν˜„μœΌλ‘œ λ°”κΎΈλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

μ–΄λ–€ νƒ€μž…μ—μ„œ νŒŒμƒλœ νƒ€μž…μ˜ 객체가 μžˆλ‹€λ©΄ 이 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” μ½”λ“œλŠ” λ³€κ²½ν•˜μ§€ 말아야 ν•œλ‹€.

λ‹€μ‹œ 말해, ν•œ 객체λ₯Ό λ‹€λ₯Έ κ°μ²΄μ—μ„œ νŒŒμƒν•˜λ”λΌλ„ κ·Έ κΈ°λ³Έ 둜직이 λ³€κ²½λ˜μ–΄μ„œλŠ” μ•ˆ λœλ‹€λŠ” λœ»μ΄λ‹€. λ§Œμ•½ μž‘μ„± 쀑인 ν•¨μˆ˜κ°€ 기반 클래슀둜 ν•˜λŠ” 일과 μ„œλΈŒ 클래슀둜 ν•˜λŠ” 일이 λ‹€λ₯΄λ‹€λ©΄ 이 원칙을 μ–΄κΈ΄ μ…ˆμ΄λ‹€.

μ„œλ‘œ νŒŒμƒ 관계가 μ—†λŠ” νƒ€μž… κ°„μ—λŠ” μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€. μ˜ˆμ»¨λŒ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ–΄λ–€ ν•¨μˆ˜μ˜ μΈμžκ°€ 숫자일 λ•Œ, λ¬Έμžμ—΄μΌ λ•Œ, μ•„μ˜ˆ μΈμžκ°€ μ—†λŠ” undefined νƒ€μž…μΌ λ•Œλ₯Ό 각각 λΆ„κΈ° μ²˜λ¦¬ν•˜λŠ” 것이 λŒ€κ°œ 쒋은 μŠ΅κ΄€μ΄λ‹€. μ•žμ„œ μ‚΄νŽ΄λ³΄μ•˜λ“―μ΄ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©μ΄λΌλŠ” 객체 지ν–₯ κ°œλ…μœΌλ‘œ 이λ₯Ό μ‹€μ²œν•œλ‹€.

μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙​

이 원칙은 C++, μžλ°” 같은 μΈν„°νŽ˜μ΄μŠ€ 기반 μ–Έμ–΄ ν™˜κ²½μ—μ„œ λΉ„λ‘―λ˜μ—ˆλ‹€. 이듀 μ–Έμ–΄μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λž€ ν΄λž˜μŠ€μ—μ„œ μ–΄λ–€ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ§€ μ•Šκ³  μ„œμˆ λ§Œ ν•œ μ½”λ“œ 쑰각이닀.

κΈ°λŠ₯이 λ§Žμ€ μΈν„°νŽ˜μ΄μŠ€λŠ” 더 μž‘κ²Œ μ‘μΆ•μ‹œν‚¨ 쑰각으둜 λ‚˜λˆ„μ–΄μ•Ό ν•œλ‹€λŠ” λ°œμƒμ΄λ‹€. μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©λΆ€λŠ” 전체가 μ•„λ‹ˆλΌ μ•„μ£Ό μž‘μ€ μΈν„°νŽ˜μ΄μŠ€ ν•˜λ‚˜λ§Œ 바라보면 λœλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλ„ 이 원칙을 μ‹€ν˜„ν•  수 μžˆλŠ”λ° (16μž₯) 짧게 μ΄μ•ΌκΈ°ν•˜λ©΄, μΈν„°νŽ˜μ΄μŠ€ 뢄리 μ›μΉ™μ˜ 정신을 μ‹€ν˜„ν•˜λ €λ©΄ ν•¨μˆ˜κ°€ κΈ°λŒ€ν•˜λŠ” μΈμžκ°€ 무엇인지 λͺ…ν™•νžˆ ν•˜κ³  κ·Έ κΈ°λŒ€μΉ˜λ₯Ό μ΅œμ†Œν™”ν•΄μ•Ό ν•œλ‹€. 이럴 λ•Œλ„ 덕 타이핑이 λ„μ›€λœλ‹€. νŠΉμ • νƒ€μž…μ˜ 인자λ₯Ό λ°”λΌλ³΄κΈ°λ³΄λ‹€λŠ” 이 νƒ€μž…μ—μ„œ μ‹€μ œλ‘œ ν•„μš”ν•œ ν”„λ‘œνΌν‹°κ°€ λ”λŸ¬ μžˆμ„ 거라 κΈ°λŒ€ν•˜λŠ” 것이닀.

μ˜μ‘΄μ„± μ—­μ „ 원칙​

λ‘œλ²„νŠΌ λ§ˆν‹΄μ€ μƒμœ„ μˆ˜μ€€ λͺ¨λ“ˆμ€ ν•˜μœ„ μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆ 되며 이 λ‘˜μ„ 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•œλ‹€λΌκ³  λ§ν–ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€ 기반 μ–Έμ–΄μ—μ„œλŠ” λŒ€κ°œ μ˜μ‘΄μ„± μ£Όμž…μ΄λΌλŠ” μ—°κ΄€λœ κ°œλ…μœΌλ‘œ ν‘œν˜„ν•œλ‹€. 클래슀 Aκ°€ 클래슀 B의 μ„œλΉ„μŠ€κ°€ ν•„μš”ν•  λ•Œ AλŠ” Bλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€. λŒ€μ‹  A μƒμ„±μžμ— 건넨 νŒŒλΌλ―Έν„° ν•˜λ‚˜κ°€ Bλ₯Ό μ„œμˆ ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•œλ‹€. 이제 AλŠ” B에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³  μžμ‹ μ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œ 바라본닀. Aκ°€ μƒμ„±λ˜λ©΄ κ΅¬μ²΄ν™”ν•œ Bλ₯Ό λ„˜κ²¨λ°›λŠ”λ‹€. B μ—­μ‹œ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•œλ‹€.

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 덕뢄에 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œμ‘±ν•˜λŠ”, B의 νŒŒμƒν˜• 버전을 μ œκ³΅ν•  수 μžˆλŠ” 이점이 μžˆλ‹€. λ˜ν•œ, μΈν„°νŽ˜μ΄μŠ€λŠ” Bλ₯Ό 고쳐야 ν•  경우 ν•˜μœ„ 버전 ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜λ €λ©΄ μ–΄λ–€ λ‘œμ§μ„ 계속 κ°–κ³  μžˆμ–΄μ•Ό ν•˜λŠ”μ§€ 일λͺ©μš”μ—°ν•˜κ²Œ μ„œμˆ ν•œλ‹€.

DRY 원칙​

DRY 원칙, 즉 λ°˜λ³΅ν•˜μ§€ 마라(Don't Repeat Yourself) λΌλŠ” 말 μ—­μ‹œ 쒋은 μ†Œν”„νŠΈμ›¨μ–΄ 개발 μŠ΅κ΄€μ˜ 근원이라 ν•  λ§Œν•˜λ‹€. λͺ¨λ“  지식 쑰각은 λ”± ν•œ 번만 λ‚˜μ™€μ•Ό ν•œλ‹€λΌλŠ” 말이닀.

κ°€μž₯ μ€‘μš”ν•œ SOLID의 원칙 쀑 일뢀가 DRY μ›μΉ™μ˜ 필연적 산물이닀. 단일 μ±…μž„ 원칙이 κ·Έλ ‡λ‹€. 이 원칙을 μ–΄κΈ΄ μ½”λ“œλŠ” 결과적으둜 λ‹€μ‹œ μ“Έ 수 μ—†λ‹€. X와 Yλ₯Ό ν•¨κ»˜ ν•˜λŠ” λͺ¨λ“ˆμ΄ μžˆλ”°. Xλ₯Ό ν•˜λŠ” μ½”λ“œκ°€ ν•„μš”ν•  λ•Œ Y λ‘œμ§μ„ 듀어내지 μ•ŠλŠ” ν•œ λͺ¨λ“ˆμ„ μž¬μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ λ˜λ‹€μ‹œ Xλ₯Ό μ½”λ”©ν•  μˆ˜λ°–μ— μ—†λ‹€. DRY 원칙과 λ§žμ§€ μ•ŠλŠ”λ‹€.

DRY함은 여타 언어와 λΉ„κ΅ν–ˆμ„ λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ νŠΉλ³„νžˆ μ€‘μš”ν•˜λ‹€. μ½”λ”© μ‹€μˆ˜λŠ” 늘 ν•˜κΈ° 마련인데, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 잘λͺ» μ½”λ”©ν•œ νŠΉμ • 클래슀λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ 미리 μ•Œλ €μ£Όμ§€ μ•ŠμœΌλ‹ˆ 자칫 κ·Έλž˜λ„ 운영 ν™˜κ²½μ— λ…ΈμΆœλ  κ°€λŠ₯성이 크닀.

πŸ“š λ°”λ₯΄κ²Œ μœ μ§€λ˜λŠ” μ½”λ“œ μž‘μ„±ν•˜κΈ°β€‹

🎈 λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” λ―Έλž˜μ— λŒ€λΉ„ν•œ νˆ¬μžλ‹€β€‹

λ‹¨μœ„ ν…ŒμŠ€νŠΈ(unit test)μ—μ„œ λ‹¨μœ„(unit)μ΄λž€ νŠΉμ • μ‘°κ±΄μ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•΄μ•Ό 할지 μ •μ˜ν•œ 것이닀. μ–Έμ œλ‚˜ 그런 것은 μ•„λ‹ˆμ§€λ§Œ, λŒ€κ°œ ν•¨μˆ˜λ‘œ ν‘œν˜„ν•œλ‹€.

λ‹¨μœ„ ν…ŒμŠ€νŠΈ 본체에 μž‘μ„±ν•œ μ½”λ“œλŠ” μ€€λΉ„(arrange), μ‹€ν–‰(act), 단언(assert)의 νŒ¨ν„΄μ„ λ”°λ₯Έλ‹€.

첫째, ν…ŒμŠ€νŠΈ μ€€λΉ„λ‹€. λ‹¨μœ„λ₯Ό μ‹€ν–‰ν•  쑰건을 ν™•μ‹€νžˆ μ •ν•˜κ³ , μ˜μ‘΄μ„± 및 ν•¨μˆ˜ μž…λ ₯ 데이터λ₯Ό μ„€μ •ν•œλ‹€.
λ‘˜μ§Έ, λ‹¨μœ„λ₯Ό μ‹€ν–‰ν•˜μ—¬ ν…ŒμŠ€νŠΈν•œλ‹€. 예λ₯Ό λ“€μ–΄ λ‹¨μœ„κ°€ ν•¨μˆ˜λ©΄ μ€€λΉ„ λ‹¨κ³„μ—μ„œ 미리 μ„€μ •ν•œ μž…λ ₯값을 ν•¨μˆ˜μ— λ„˜κ²¨ μ‹€ν–‰ν•œλ‹€.
λ§ˆμ§€λ§‰μ€ ν…ŒμŠ€νŠΈ 단언이닀. 미리 μ •ν•œ 쑰건에 따라 μ˜ˆμƒλŒ€λ‘œ λ‹¨μœ„κ°€ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. λ‹¨μœ„κ°€ ν•¨μˆ˜μΈ ν…ŒμŠ€νŠΈλΌλ©΄ μ˜ˆμƒν•œ 값을 λ°˜ν™˜ν•˜λŠ”μ§€ μ‘°μ‚¬ν•˜λ©΄ λœλ‹€.

전체 λ‹¨μœ„ ν…ŒμŠ€νŠΈ 꾸러미(test suite)λ₯Ό μž‘μ„±ν•˜λŠ” 데 λ“  μ‹œκ°„κ³Ό λ…Έλ ₯은 μ•žμœΌλ‘œ ν”„λ‘œκ·Έλž¨μ΄ 직면할 갖가지 변화에 λŒ€μ²˜ν•˜κΈ° μœ„ν•œ λ³΄ν—˜μ΄μž, μ•ˆμ •μ μΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μœ μ§€μ— κΌ­ ν•„μš”ν•œ μ΅œμ„ μ˜ 투자라고 ν•  수 μžˆλ‹€. λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ μ‹€νŒ¨ν•œλ‹€λŠ” 것은 μ–΄λ–€ λ³€ν™”λ‘œ 인해 κΈ°μ‘΄ ν”„λ‘œκ·Έλž¨μ˜ κΈ°λŠ₯을 λ°”λ€Œμ—ˆμœΌλ‹ˆ μ‹€νŒ¨λ₯Ό μœ λ°œν•œ 이 λ³€ν™”λ₯Ό μžμ„Ένžˆ 듀여닀보아야 ν•œλ‹€λŠ” 사싀을 μΌκΉ¨μ›Œμ£ΌλŠ” 적색 μ‹ ν˜Έλ“±μ΄λ‹€.

🎈 ν…ŒμŠ€νŠΈ 주도 κ°œλ°œμ„ μ‹€μ²œν•˜λΌβ€‹

ν…ŒμŠ€νŠΈ 주도 개발(Test-Driven Development, TDD)은 μ²˜μŒλΆ€ν„° ν”„λ‘œκ·Έλž¨μ„ μ œλŒ€λ‘œ μž‘μ„±ν–ˆλŠ”μ§€ ν™•μ‹€νžˆ 보μž₯ν•œλ‹€. TDDμ—μ„œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό 짜기 전에 이 μ½”λ“œκ°€ 톡과해야 ν•  λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € μž‘μ„±ν•œλ‹€. 마치 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λ“― 전체 λ‹¨μœ„ ν…ŒμŠ€νŠΈ 꾸러미λ₯Ό λ§Œλ“€μ–΄κ°€λŠ” TDD 방식을 λ”°λ₯΄λ©΄ λ‹¨μœ„ μ •μ˜μ™€ μΈν„°νŽ˜μ΄μŠ€ 섀계에 도움이 많이 λœλ‹€.

TDDλ₯Ό μ‹€μ²œν•˜λŠ” κ°œλ°œμžλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ–΄λ–€ λ³€ν™”κ°€ 생길 λ•Œλ§ˆλ‹€ λ‹€μŒ 단계λ₯Ό λ°ŸλŠ”λ‹€. μ—¬κΈ°μ„œ λ³€ν™”λž€ μ™„μ „νžˆ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ κΈ°μ‘΄ μ‹œμŠ€ν…œμ„ 고치고 버그λ₯Ό μž‘λŠ” 일이닀.

  1. μ™„λ²½νžˆ λ³€κ²½ν•˜λ©΄ μ„±κ³΅ν•˜κ±°λ‚˜ κ·Έλ ‡κΈ° 되기 μ „κΉŒμ§€λŠ” λ°˜λ“œμ‹œ μ‹€νŒ¨ν•˜λŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•œλ‹€.
  2. ν…ŒμŠ€νŠΈκ°€ 성곡할 수 μžˆμ„ 만큼만 μ΅œμ†Œν•œμœΌλ‘œ μ½”λ”©ν•œλ‹€.
  3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•˜λ©° 쀑볡을 μ œκ±°ν•œλ‹€.

이 μ„Έ 단계λ₯Ό ν”νžˆ red, green, refactor라고 쀄여 λ§ν•œλ‹€. red와 green은 각각 μƒˆ λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ μ‹€νŒ¨μ™€ 성곡 μƒνƒœλ₯Ό 가리킨닀.

TDDμ—μ„œ κ°€μž₯ μ€‘μš”ν•œ 건 ν…ŒμŠ€νŠΈλ₯Ό μΆ©μ‘±ν•  μ½”λ“œλ₯Ό λ§Œλ“€κΈ° 전에 ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € μž‘μ„±ν•œλ‹€λŠ” 사싀이닀. TDD μŠ΅κ΄€μ΄ μ™„μ „νžˆ λͺΈμ— 배지 μ•Šμ€ κ°œλ°œμžλŠ” 빨리 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό λœ―μ–΄κ³ μ³ λ‹€μŒ 개발 업무λ₯Ό μ§„ν–‰ν•˜κ³  싢은 μΆ©λŒμ„ λŠλ‚„ 것이닀. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°”λ₯΄κ²Œ κ°œλ°œν•˜λ €λŠ” μ˜μ§€κ°€ μžˆλ‹€λ©΄ ν…ŒμŠ€νŠΈλ₯Ό κ±΄λ„ˆλ›°κ³  싢은 μš•λ§μ„ 극볡해야 ν•œλ‹€.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό λ°”κΎΈκ³  λ‚˜μ„œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ©΄ λ˜μ§€ μ•Šλ‚˜ 싢을 μˆ˜λ„ μžˆλ‹€. κ±°λ“­ λ§ν•˜μ§€λ§Œ 이런 μš•λ§μ— κ΅΄ν•˜μ§€ 마라. μ—¬λŸ¬λΆ„μ΄ λ°”κΎΌ μ½”λ“œκ°€ κ·Έ 이후에 λ§Œλ“  ν…ŒμŠ€νŠΈλ₯Ό κ·Έλƒ₯ ν†΅κ³Όμ‹œν‚¬μ§€ ν™•μ‹ ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. μ΄λ ‡κ²Œ λ§Œλ“  μƒˆ ν…ŒμŠ€νŠΈλŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈ κΎΈλŸ¬λ―Έμ— 아무 값도 μΆ”κ°€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 잘λͺ»λœ ν…ŒμŠ€νŠΈλΌλ„ 무사 톡과할 κ°€λŠ₯성이 μžˆλ‹€. λ˜ν•œ, 사후에 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œκ°€ μ–΄λ–»κ²Œ μž‘λ™ν•΄μ•Ό ν•œλ‹€λŠ” 것이 μ•„λ‹ˆλΌ μž‘μ„±ν•œ λŒ€λ‘œ μž‘λ™ν•  κ±°λΌλŠ” λš±λ”΄μ§€κ°™μ€ 사싀을 ν™•μΈν•˜λŠ” 꼴이닀.

🎈 ν…ŒμŠ€νŠΈν•˜κΈ° μ‰¬μš΄ μ½”λ“œλ‘œ 닀듬어라​

ν…ŒμŠ€νŠΈν•˜κΈ° μ‰¬μš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ €λ©΄ κ°€μž₯ μ€‘μš”ν•œ λ‹¨κ³„λŠ” 관심사λ₯Ό 적절히 λΆ„λ¦¬ν•˜λŠ” 일이닀.

예λ₯Ό λ“€μ–΄, λ‹€μŒ validateAndRegisterUser ν•¨μˆ˜λŠ” 관심사가 λ‹€μ–‘ν•˜λ‹€.

var Users = Users || {};

Users.registration = function () {
return {
validateAndRegisterUser: function validateAndDisplayUser(user) {
if (!user ||
user.name === '' ||
user.password === '' ||
user.password.length < 6) {
throw new Error('μ‚¬μš©μž 인증이 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.');
}

$.post('http://yourapplication.com/user', user);

$('#user-message').text('κ°€μž…ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€', + user.name + 'λ‹˜');
}
};
};

이 ν•¨μˆ˜κ°€ ν•˜λŠ” 일은 μ„Έ 가지닀.

  1. user 객체가 μ˜¬λ°”λ₯΄κ²Œ μ±„μ›Œμ‘ŒλŠ”μ§€ κ²€μ¦ν•œλ‹€.
  2. 검증을 마친 user 객체λ₯Ό μ„œλ²„λ‘œ μ „μ†‘ν•œλ‹€.
  3. UI에 λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•œλ‹€.

κ΄€μ‹¬μ‚¬λŠ” μ„Έ κ°€μ§€λ‘œ μš”μ•½λœλ‹€.

  1. μ‚¬μš©μž 검증
  2. μ„œλ²„μ™€ 직접 톡신
  3. UI 직접 닀루기

자, 그럼 validateAndRegisterUser ν•¨μˆ˜κ°€ μž‘λ™ν•˜λŠ” ν…ŒμŠ€νŠΈν•  쑰건을 λͺ¨λ‘ λ‚˜λ Ήν•΄λ³΄μž.

  1. userκ°€ null이면 μ—λŸ¬λ₯Ό λ‚Έλ‹€.
  2. null인 userλŠ” μ„œλ²„λ‘œ μ „μ†‘ν•˜μ§€ μ•ŠλŠ”λ‹€.
  3. userκ°€ null이면 UIλ₯Ό μ—…λ°μ΄νŠΈν•˜μ§€ μ•ŠλŠ”λ‹€.
  4. userκ°€ undefined이면 μ—λŸ¬λ₯Ό λ‚Έλ‹€.
  5. undefined인 userλŠ” μ„œλ²„λ‘œ μ „μ†‘λ˜μ§€ μ•ŠλŠ”λ‹€.
  6. userκ°€ undefined이면 UIλ₯Ό μ—…λ°μ΄νŠΈν•˜μ§€ μ•ŠλŠ”λ‹€.
  7. user의 name ν”„λ‘œνΌν‹°κ°€ 빈 μƒνƒœλ©΄ μ—λŸ¬λ₯Ό λ‚Έλ‹€.
  8. name ν”„λ‘œνΌν‹°κ°€ 빈 userλŠ” μ„œλ²„λ‘œ μ „μ†‘ν•˜μ§€ μ•ŠλŠ”λ‹€.
  9. user의 name ν”„λ‘œνΌν‹°κ°€ λΉ„μ–΄ 있으면 UIλ₯Ό μ—…λ°μ΄νŠΈν•˜μ§€ μ•ŠλŠ”λ‹€.

이 밖에도 였λ₯˜ 쑰건은 더 μžˆλ‹€.

이 μ½”λ“œλŠ” ν…ŒμŠ€νŠΈν•  μˆ˜λŠ” μžˆμ§€λ§Œ κΉŒλ‹€λ‘­λ‹€. ν…ŒμŠ€νŠΈν•  쑰건이 μ—„μ²­ λ‹€μ–‘ν•˜κ²Œ 쑰합될 수 있고 이듀을 죄닀 λ³΄μ™„ν•˜λŠ” 건 λΆˆκ°€λŠ₯에 가깝닀. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό μ „λΆ€ μ΄λ ‡κ²Œ μž‘μ„±ν•˜λ©΄ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ˜μ—­μ΄ μ ν•©ν•˜μ§€ μ•Šλ‹€κ³  ν™•μ‹€νžˆ 말할 수 μžˆλ‹€.

그럼, μ„Έ 관심사λ₯Ό validateAndRegisterUser ν•¨μˆ˜μ— λ‹€ 맑기지 말고 λ³„κ°œμ˜ 객체둜 각 관심사λ₯Ό μΆ”μΆœν•˜μ—¬ 단일 μ±…μž„μ„ λΆ€μ—¬ν•˜λ©΄ μ–΄λ–¨κΉŒ? μ΄λ ‡κ²Œ λ§Œλ“  독립적인 κ°μ²΄λŠ” 각자 μ™„μ „ν•œ ν…ŒμŠ€νŠΈ 꾸러미λ₯Ό κ°–κ²Œ 될 ν…Œκ³  validateAndRegisterUser μ½”λ“œλŠ” 이런 λͺ¨μŠ΅μ„ κ°–μΆ”κ²Œ 될 것이닀.

var Users = Users || {};

Users.registration = function(userValidator, userRegister, userDisplay) {
return {
validateAndRegisterUser: function validateAndDisplayUser(user) {
if (!userValidator.userIsValid(user)) {
throw new Error('μ‚¬μš©μž 인증이 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.');
}

userRegister.registerUser(user);
userDisplay.showRegistrationThankYou(user);
}
};
};

μƒˆλ‘œ 고친 registration λͺ¨λ“ˆμ€ user 검증, 등둝, ν™”λ©΄ ν‘œμ‹œλ₯Ό λ‹΄λ‹Ήν•˜λŠ” κ°œλ³„ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μ˜μ‘΄μ„± μ£Όμž…μœΌλ‘œ μ œκ³΅ν•œλ‹€. 그리고 validateAndRegisterUserλŠ” λ‹€λ₯Έ κ΄€μ‹¬μ‚¬μ—κ²Œ 직접 영ν–₯을 미쳀던 μ½”λ“œ λŒ€μ‹  μ£Όμž…λœ 객체λ₯Ό μ‚¬μš©ν•œλ‹€.

validateAndRegisterUserλŠ” 본질적으둜 μ–΄λ–€ 일을 ν•˜λŠ” ν•¨μˆ˜μ—μ„œ 남이 ν•œ 일을 μ‘°μ •ν•˜λŠ” ν•¨μˆ˜λ‘œ νƒˆλ°”κΏˆν–ˆλ‹€. 덕뢄에 이 ν•¨μˆ˜λŠ” ν…ŒμŠ€νŠΈν•˜κΈ° μ‰¬μ›Œμ Έμ„œ λ‹€μŒ μ—¬μ„― 쑰건만 ν™•μΈν•˜λ©΄ μ™„λ²½ν•œ κΈ°λŠ₯ ν…ŒμŠ€νŠΈλ₯Ό ν•  수 μžˆλ‹€.

  1. userκ°€ 잘λͺ» λ„˜μ–΄μ˜€λ©΄ μ—λŸ¬κ°€ λ‚œλ‹€.
  2. 잘λͺ»λœ userλ₯Ό λ“±λ‘ν•˜μ§€ μ•ŠλŠ”λ‹€.
  3. 잘λͺ»λœ userλŠ” ν‘œμ‹œν•˜μ§€ μ•ŠλŠ”λ‹€.
  4. μ˜¬λ°”λ₯Έ userλ₯Ό 인자둜 userRegister.registerUser ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œλ‹€.
  5. userRegister.registerUserμ—μ„œ μ—λŸ¬κ°€ λ‚˜λ©΄ userDisplay.showRegistrationThankYou ν•¨μˆ˜λŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.
  6. userκ°€ μ„±κ³΅μ μœΌλ‘œ λ“±λ‘λ˜λ©΄ userλ₯Ό 인자둜 userDisplay.showRegistrationThankYou ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œλ‹€.

μ„œλ‘œ λ‹€λ₯Έ κ΄€μ‹¬μ‚¬λŠ” μž‘κ³  κ°„λ‹¨ν•œ λͺ¨λ“ˆλ‘œ λ‚˜λˆ„μ–΄ λ§Œλ“€λ©΄ μ½”λ“œ μž‘μ„±κ³Ό ν…ŒμŠ€νŠΈ, 그리고 이해가 쉽닀.

TDDκ°€ 개발 속도λ₯Ό 늦좜 κ²ƒμœΌλ‘œ μƒκ°ν•˜λŠ” μ‚¬λžŒλ„ 있으리라. 관심사λ₯Ό μ œλŒ€λ‘œ λΆ„λ¦¬ν•˜μ§€ μ•Šμ€ 채 λ¨Όμ € μ½”λ”©ν•˜κ³  ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” μ‹μœΌλ‘œ μ§„ν–‰ν•˜λ©΄ 정말 λŠ¦μ–΄μ§€κ²Œ 될 것이라 ν™•μ‹ ν•œλ‹€. λ¬΄μˆ˜ν•œ μ‹€μˆ˜μ˜ λŠͺ에 λΉ μ Έ ν—ˆμš°μ κ±°λ¦¬κΈ° 전에 λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ μ‹€μˆ˜λ₯Ό κ°€λŠ₯ν•œ ν•œ 빨리 λ°œκ²¬ν•˜λŠ” κΈΈμ΄λΌλŠ” 진리λ₯Ό κΈ°μ–΅ν•˜λΌ.

red-green-refactor 과정을 λ°˜λ³΅ν•˜λ©° μž‘μ€ μ½”λ“œλ₯Ό κ°œλ°œν•˜λ‹€ 보면 점점 속도가 λΆ™κ²Œ λœλ‹€. 첫째, μž‘μ€ μ½”λ“œλŠ” λŒ€κ°œ κ°„λ‹¨ν•˜κ³  μ‹€μˆ˜ν•  κ°€λŠ₯성이 μž‘μ•„ 디버깅 μ‹œκ°„μ„ μƒλ‹Ήνžˆ 쀄일 수 μžˆλ‹€. λ‘˜μ§Έ, ν…ŒμŠ€νŠΈλ‘œ μ½”λ“œλ₯Ό μ™„μ „νžˆ μ»€λ²„ν•˜λ‹ˆ λ¦¬νŒ©ν† λ§μ„ ν•˜λ”λΌλ„ λ¬΄μ„œμšΈ 게 μ—†λ‹€.

λ”°λΌμ„œ μ½”λ“œλ₯Ό DRYν•˜κ²Œ μœ μ§€ν•˜μ—¬ μ½”λ“œλ² μ΄μŠ€μ— 였λ₯˜ λ°œμƒ 여지λ₯Ό 쀄이고 규λͺ¨λ₯Ό μž‘κ²Œ κ°€μ Έν•  수 μžˆλ‹€. DRYλŠ” κ²°κ΅­ μž¬μ‚¬μš©μ„ μ˜λ―Έν•˜λ©° μ•Œλ‹€μ‹œν”Ό μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œλŠ” μ‹œκ°„μ„ μ ˆμ•½ν•œλ‹€.

πŸ“š μ •λ¦¬ν•˜κΈ°β€‹

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ‚¬μš© λ²”μœ„κ°€ λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμœΌλ‘œ ν™•λŒ€λ˜λ©΄μ„œ μ–Έμ–΄ 자체의 거친 뢀뢄을 잘 λ‹€λ£¨λŠ” 일이 μ•„μ£Ό μ€‘μš”ν•΄μ‘Œλ‹€. κ°œλ³„ 슀크립트 파일둜 μ½”λ“œλ₯Ό λ‚˜λˆ„λŠ” 것이 μ–΄λ–€ λ©΄μ—μ„œλŠ” 쒋은 μƒκ°μ΄μ§€λ§Œ, 진정 λͺ¨λ“ˆν™”λŠ” μ•„λ‹ˆλΌλŠ” 사싀을 μ΄μ•ΌκΈ°ν–ˆλ‹€. κ²€μ¦λœ μ†Œν”„νŠΈμ›¨μ–΄ 곡학이둠과 D3 μ‚¬λ‘€λ‘œ μ˜ˆμ‹œν•œ 섀계 κΈ°νšŒμ— κΈ°λ°˜μ„ 두라. λ‹€μ„― 가지 SOLID 원칙과 DRY 원칙을 μ†Œκ°œν–ˆλ‹€.

λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” μž₯기적인 κ΄€μ μ—μ„œ μ•ˆμ •λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€κΈ° μœ„ν•œ μ΅œμ„ μ˜ νˆ¬μžλ‹€. λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ μ—†μœΌλ©΄ κ·Έμ € μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 잘 μž‘λ™ν•˜κΈ°λ₯Ό λ§‰μ—°νžˆ 기도할 μˆ˜λ°–μ— μ—†λ‹€.

ν…ŒμŠ€νŠΈ 주도 κ°œλ°œμ„ μ‹€μ²œν•˜λ©΄ μ—¬λŸ¬ 가지 ν˜œνƒμ΄ μžˆλ‹€. 첫째, μž₯기적인 λ―ΏμŒμ„±μ„ 보μž₯ν•˜λŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈ 꾸러미λ₯Ό κ΅¬μΆ•ν•œλ‹€. λ‘˜μ§Έ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 객체에 μ ν™•ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 섀계할 λ•Œ 도움이 λœλ‹€. μ…‹μ§Έ, λ†€λžκ²Œλ„ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ½”λ“œλ₯Ό 더 빨리 κ°œλ°œν•  수 μžˆλ‹€.

ν…ŒμŠ€νŠΈμ„±μ„ 높이렀면 관심사λ₯Ό λΆ„λ¦¬ν•˜λŠ” 일에 μ§‘μ€‘ν•˜κ³  단일 μ±…μž„ μ›μΉ™μ΄λ‚˜ μ˜μ‘΄μ„± μ£Όμž… 같은 μ†Œν”„νŠΈμ›¨μ–΄ 곡학 원칙을 잘 μ¨λ¨ΉλŠ” 게 μ€‘μš”ν•˜λ‹€.