μ±κΈν€μ΄λ?
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ μ¬μ©λλ λμμΈ ν¨ν΄ μ€ νλλ‘,
νλμ ν΄λμ€μ μ€μ§ νλμ μΈμ€ν΄μ€λ§ κ°μ§λ ν¨ν΄μ΄λ€.
μ±κΈν€μ νΉμ§
1οΈβ£ νλμ ν΄λμ€μμ λ¨ νλμ μΈμ€ν΄μ€λ§ μμ±λλ€.
2οΈβ£ μμ±λ μΈμ€ν΄μ€λ μ μ λ³μλ‘ μ μ₯λμ΄ μ΄λμλ μ κ·Όν μ μλ€.
3οΈβ£ μμ±μλ privateμΌλ‘ μ€μ λμ΄ μΈλΆμμ μ§μ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
4οΈβ£ μΈλΆμμ μΈμ€ν΄μ€μ μ κ·Όν μ μλ public λ©μλλ₯Ό μ 곡νλ€.
μ¬μ©νλ μ΄μ
β μμ κ΄λ¦¬ : λ©λͺ¨λ¦¬ μΈ‘λ©΄
μ΅μ΄ ν λ²μ new μ°μ°μλ₯Ό ν΅ν΄μ κ³ μ λ λ©λͺ¨λ¦¬ μμμ μ¬μ©νκΈ° λλ¬Έμ μΆν ν΄λΉ κ°μ²΄μ μ κ·Όν λ λ©λͺ¨λ¦¬ λλΉλ₯Ό λ°©μ§ν μ μλ€.
β‘ λ°μ΄ν° 곡μ κ° μ½λ€.
μ±κΈν€ μΈμ€ν΄μ€κ° μ μμΌλ‘ μ¬μ©λλ μΈμ€ν΄μ€μ΄κΈ° λλ¬Έμ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€λ€μ΄ μ κ·Όνμ¬ μ¬μ©ν μ μλ€.
μ¬μ©νλ κ³³
μ€μ μ 보, λ°μ΄ν°λ² μ΄μ€ μ°κ²°, λ‘κΉ
μ₯λ¨μ
μ₯μ
νλμ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ λκ³ ν΄λΉ μΈμ€ν΄μ€λ₯Ό λ€λ₯Έ λͺ¨λλ€μ΄ 곡μ νλ©° μ¬μ©νκΈ° λλ¬Έμ μΈμ€ν΄μ€λ₯Ό μμ±ν λ λλ λΉμ©μ΄ μ€μ΄λ λ€.
λ¨μ
μμ‘΄μ±μ΄ λμμ§λ€.
μλ°μ€ν¬λ¦½νΈμ μ±κΈν€ ν¨ν΄
javascriptμμλ 리ν°λ΄ {} λλ new Objectλ‘ κ°μ²΄λ₯Ό μμ±νκ² λλ©΄ μ΄ μ체λ§μΌλ‘ μ±κΈν€ ν¨ν΄μ ꡬνν μ μλ€.
μλνλ©΄ μ΄λ κ² κ°μ²΄λ₯Ό λ§λ€κ² λλ©΄ λ€λ₯Έ μ΄λ€ κ°μ²΄μλ κ°μ§ μκΈ° λλ¬Έμ΄λ€.
const obj = {
a: 27
}
const obj2 = {
a: 27
}
console.log(obj === obj2)
// false
objκ³Ό obj2λ λ€λ₯Έ μΈμ€ν΄μ€λ₯Ό κ°μ§λ€.
μ μμ€λ μ΄λ μ λ μ±κΈν€ ν¨ν΄μ΄λΌ λ³Ό μ μμ§λ§,
μ€μ μ±κΈν€ ν¨ν΄μ λ°κ³Ό κ°μ΄ ꡬμ±λλ€.
class Singleton { // Singleton ν΄λμ€λ₯Ό μ μ
constructor(){ // ν΄λμ€μ μμ±μ ν¨μλ₯Ό μ μ, μμ±μ ν¨μλ κ°μ²΄κ° μμ±λ λ νΈμΆλλ€.
if(!Singleton.instance){ // μμ±μ ν¨μ λ΄μμ μΈμ€ν΄μ€κ° μ΄λ―Έ μμ±λμλμ§ νμΈ
Singleton.instance = this
}
return Singleton.instance
}
getInstance(){ // νμ¬μ Singleton μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
return this
}
}
const a = new Singleton()
const b = new Singleton()
console.log(a === b)
// true
// λ λ³μκ° λμΌν κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
// Singleton ν¨ν΄μ μ¬μ©νλ―λ‘ 'a'μ 'b'λ λμΌν μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλ€.
constructor
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° μΈμ΄μμ ν΄λμ€λ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±ν λ νΈμΆλλ νΉλ³ν λ©μλ λλ ν¨μμ΄λ€.
μλ°μμμ μ±κΈν€ ν¨ν΄
// Singleton ν΄λμ€ : μΈλΆμμ μΈμ€ν΄μ€ν λμ§ μλλ€.
// μ€μ§ singleInstanceHolder(λ΄λΆμ μ μ μ€μ²© ν΄λμ€)λ₯Ό ν΅ν΄μλ§ μμ±νλ€.
class Singleton{
private static class singleInstanceHolder {
private static final Singleton INSTANCE = new Singleton();
// INSTANCE : μ μ μμ νλ → Singleton ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό 보κ΄ν¨
}
public static Singleton getInstance(){
return singleInstanceHolder.INSTANCE;
}
// getInstance : singleInstanceHolder ν΄λμ€ λ΄μ INSTANCE νλλ₯Ό λ°ννλ€.
// κ·Έλμ μ΄ λ©μλλ₯Ό νΈμΆνλ©΄ νμ λμΌν μΈμ€ν΄μ€κ° λ°νλλ€.
}
public class HelloWorld{
public static void main(String []args){
Singleton a = Singleton.getInstance();
Singleton b = Singleton.getInstance();
System.out.println(a.hashCode()); // 2060468723
System.out.println(b.hashCode()); // 2060468723
if(a==b){
System.out.println("true"); // true
}
}
}
μ€μ²© ν΄λμ€ (nested class) : νλμ ν΄λμ€ λ΄μ λ€λ₯Έ ν΄λμ€λ₯Ό μ μνλ κ°λ
λ°μ΄ν°λ² μ΄μ€ μ°κ²° λͺ¨λ
const URL = 'mongodb://localhost:27017/kundolapp'
const createConnection = url => ({"url" : url})
// μ£Όμ΄μ§ URLμ λ°μμ κ°μ²΄λ‘ λννλ ν¨μ, λμ€μ DB μ°κ²° κ°μ²΄λ₯Ό μμ±ν λ μ¬μ©λ¨
class DB{
constructor(url){
if(!DB.instance){
DB.instance = createConnection(url)
}
return DB.instance
}
connect(){
return this.instance
}
}
const a = new DB(URL)
const b = new DB(URL)
console.log(a === b)
//true
JavaScriptλ₯Ό μ¬μ©νμ¬ MongoDB λ°μ΄ν°λ² μ΄μ€μ λν μ°κ²°μ κ΄λ¦¬νλ λ¨μν ν΄λμ€λ₯Ό ꡬννλ μ½λμ΄λ€.
μ±κΈν€ ν¨ν΄μ μ¬μ©νμ¬ DB μ°κ²°μ κ΄λ¦¬νλ©°, μ¬λ¬ κ°μ²΄κ° κ°μ μ°κ²°μ 곡μ ν μ μλλ‘ νλ€.
μ±κΈν€ ν¨ν΄μ λ¨μ
μ±κΈν€ ν¨ν΄μ TDDλ₯Ό ν λ κ±Έλ¦Όλμ΄ λλ€. (TDDλ₯Ό λͺ¨λ₯Έλ€λ©΄ λ°μ 보μμ€.)
TDDλ₯Ό ν λ λ¨μν μ€νΈλ₯Ό μ£Όλ‘ νλλ°,
λ¨μ ν μ€νΈλ ν μ€νΈκ° μλ‘ λ 립μ μ΄μ΄μΌ ν¨ & ν μ€νΈλ₯Ό μ΄λ€ μμλ‘λ μ€νν μ μμ΄μΌν¨
βBUTβ
μ±κΈν€ ν¨ν΄μ 미리 μμ±λ νλμ μΈμ€ν΄μ€λ₯Ό κΈ°λ°μΌλ‘ ꡬννλ ν¨ν΄μ΄λ―λ‘, κ° ν μ€νΈλ§λ€ 'λ 립μ μΈ' μΈμ€ν΄μ€λ₯Ό λ§λ€κΈ°κ° μ΄λ ΅λ€.
TDDλ? (Test Driven Development, ν μ€νΈ μ£Όλ κ°λ°)
β μꡬμ¬νμ κ²μ¦νλ μλνλ ν μ€νΈ μΌμ΄μ€λ₯Ό μμ± (Red)
β‘ κ·Έ ν μ€νΈ μΌμ΄μ€λ₯Ό ν΅κ³ΌνκΈ° μν μ΅μνμ μ½λ μμ± (Green)
β’ μμ±ν μ½λλ₯Ό νμ€μ λ§λλ‘ λ¦¬ν©ν λ§ (Blue)
β ~ β’ μ λ°λ³΅νλ κ²μ΄λ€.
3λ¨κ³μ κ°λ°μ£ΌκΈ°λ₯Ό κ°λλ€.
1οΈβ£ Red λ¨κ³ : μ€ν¨νλ ν μ€νΈ μ½λλ₯Ό λ¨Όμ μμ±
2οΈβ£ Green λ¨κ³ : μ±κ³΅νκΈ° μν΄ μ½λλ₯Ό μμ
3οΈβ£ Blue λ¨κ³ : μ€λ³΅ μ½λλ₯Ό μ κ±°νλ λ±μ 리ν©ν λ§ μν
μμ‘΄μ± μ£Όμ (DI, Dependency Injection)
λν, μ±κΈν€ ν¨ν΄μ λͺ¨λ κ°μ κ²°ν©μ κ°νκ² λ§λ€ μ μλ€λ λ¨μ μ΄ μλ€.
μ΄λ μμ‘΄μ± μ£Όμ μ ν΅ν΄ λͺ¨λκ°μ κ²°ν©μ μ‘°κΈ λ λμ¨νκ² λ§λ€μ΄ ν΄κ²°ν μ μλ€.
μ κ·Έλ¦Όμ²λΌ λ©μΈ λͺ¨λμ΄ 'μ§μ ' λ€λ₯Έ νμ λͺ¨λμ λν μμ‘΄μ±μ 주기보λ€λ μ€κ°μ μμ‘΄μ± μ£Όμ μκ° μ΄ λΆλΆμ κ°λ‘μ± λ©μΈ λͺ¨λμ΄ 'κ°μ 'μ μΌλ‘ μμ‘΄μ±μ μ£Όμ νλ λ°©μμ΄λ€.
μ΄λ κ² νλ©΄ λ©μΈλͺ¨λμ νμ λͺ¨λμ λν μμ‘΄μ±μ΄ λ¨μ΄μ§κ² λλ€.
μ΄λ₯Ό λ컀νλ§μ΄ λλ€κ³ νλ€.
μμ‘΄μ± μ£Όμ μ μ₯μ
1οΈβ£ν μ€ν νκΈ° μ½κ³ λ§μ΄κ·Έλ μ΄μ νκΈ°λ μμν¨
μλλ©΄ λͺ¨λλ€μ μ½κ² κ΅μ²΄ν μ μλ κ΅¬μ‘°κ° λμκΈ° λλ¬Έμ
(λ§μ΄κ·Έλ μ΄μ : μ΄λ€ μμ€ν , λ°μ΄ν°, μννΈμ¨μ΄, μλΉμ€ λ±μ λ€λ₯Έ μμ€ν μΌλ‘ μ΄μ νκ±°λ μ κ·Έλ μ΄λνλ νλ‘μΈμ€)
2οΈβ£μ ν리μΌμ΄μ μμ‘΄μ± λ°©ν₯μ΄ μΌκ΄λλ€.
3οΈβ£μ ν리μΌμ΄μ μ μ½κ² μΆλ‘ ν μ μλ€.
4οΈβ£λͺ¨λκ°μ κ΄κ³λ€μ΄ μ‘°κΈ λ λͺ νν΄μ§
μλλ©΄ ꡬνν λ μΆμν λ μ΄μ΄λ₯Ό λ£κ³ μ΄λ₯Ό κΈ°λ°μΌλ‘ ꡬν체λ₯Ό λ£μ΄μ£ΌκΈ° λλ¬Έμ
μμ‘΄μ± μ£Όμ μ λ¨μ
λͺ¨λμ΄ λΆλ¦¬λλ―λ‘ ν΄λμ€ μκ° λμ΄λ 볡μ‘μ± μ¦κ° & μ½κ°μ λ°νμ ν¨λν°
μμ‘΄μ± μ£Όμ μμΉ
μμ λͺ¨λμ νμ λͺ¨λμμ μ΄λ ν κ²λ κ°μ Έμ€μ§ μμμΌ νλ€.
λν λ λ€ μΆμνμ μμ‘΄ν΄μΌ νκ³ , μ΄λ μΆμνλ μΈλΆ μ¬νμ μμ‘΄νμ§ λ§μμΌ νλ€.
μ°Έκ³
https://product.kyobobook.co.kr/detail/S000001834833
λ©΄μ μ μν CS μ 곡μ§μ λ ΈνΈ | μ£Όνμ² - κ΅λ³΄λ¬Έκ³
λ©΄μ μ μν CS μ 곡μ§μ λ ΈνΈ |
product.kyobobook.co.kr
https://velog.io/@wngud4950/TDD%EB%9E%80
TDD, ν μ€νΈ μ£Όλ κ°λ°μ΄λ?
TDDλ? TDDλ Test Driven Develpmentμ μ½μλ‘ 'ν μ€νΈ μ£Όλ κ°λ°' μ΄λΌκ³ νλ€. λ°λ³΅ ν μ€νΈλ₯Ό μ΄μ©ν μννΈμ¨μ΄ λ°©λ²λ‘ μΌλ‘, μμ λ¨μμ ν μ€νΈ μΌμ΄μ€λ₯Ό μμ±νκ³ μ΄λ₯Ό ν΅κ³Όνλ μ½λλ₯Ό μΆκ°νλ
velog.io
'πΈπ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[WINDOWS] CPU μ½μ΄ μ°λ λ μ νμΈνκΈ° (0) | 2023.10.13 |
---|---|
TCPμ UDPμ μ°¨μ΄ (0) | 2023.10.06 |
ν΄λΌμ°λ μ»΄ν¨ν / Iaas / Paas / Saas (0) | 2023.08.24 |
Oracleκ³Ό MySQLμ μ°¨μ΄ λ° κ°λ (0) | 2023.08.24 |
REST API / RESTλ / RESTful (0) | 2023.08.21 |