Springμ λν΄ μ²μ 곡λΆνλ μ¬λμ΄ μ 리λ₯Ό λͺ©μ μΌλ‘ μμ±ν κΈμ λλ€. μ€κ°λ λ± μλͺ»λ λΆλΆμ΄ μμ κ²½μ° λκΈλ‘ κ°κ°μμ΄ μ§μ ν΄μ£ΌμΈμ! νμΈνλ λλ‘ μ νν μ 보λ₯Ό κΈ°λ°ν΄ λΉ λ₯΄κ² μμ ν μ μλλ‘ νκ² μ΅λλ€.
κ°μ
μ΄λ² Spring Boot μ€ν°λλ λ°°λ¬μ λ―Όμ‘±μ κΉμνλκ»μ μΈνλ°μ μ¬λ €μ£Όμλ μλ° μ€νλ§ μμ μ 볡 μ리μ¦λ₯Ό κΈ°λ°μΌλ‘ μ§ννλ€. κ·Έ μ리μ¦μ κ°μ₯ 첫 κ°μμΈ μ€νλ§ μ λ¬Έ - μ½λλ‘ λ°°μ°λ μ€νλ§ λΆνΈ, μΉ MVC, DB μ κ·Ό κΈ°μ μ λλ΄κ³ , λ€μ κ°μμΈ μ€νλ§ ν΅μ¬ μ리 - κΈ°λ³ΈνΈμ μ 리ν΄λ³΄λ € νλ€.
μ΄λ² ν¬μ€νΈμμλ κ°μ μ΄λ°λΆμ λ΄μ©μ΄μ, κ°μΈμ μΌλ‘ ν° κ°λͺ μ λ°μ, κ·Έλ¦¬κ³ νκ΅μμ λ°°μ°μ§ λͺ»ν κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ μ₯μ μ€ νλμΈ λ€νμ±μ λν μ΄μΌκΈ°λ₯Ό ν΄λ³΄λ € νλ€.
λ€νμ±
μ¬λ¬λΆλ€μ λ€νμ±μ΄ λλΌκ³ μκ³ κ³μ κ°μ?
μ΄ λ€νμ±μ΄λΌλ κ°λ μ μ΄λμ κ° μλ°λ₯Ό λ°°μλ³Έ κ²½νμ΄ μλ μ¬λμ΄λΌλ©΄ κΌ νλ²μ© μλ°μ νΉμ§, κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ νΉμ§μΌλ‘ λ°°μλ³Έ κ²½νμ΄ μμ κ²μ΄λ€. λμ κ²½μ° μ§κΈκΉμ§ μ΄ν΄νκΈ°λ₯Ό λμΆ© λΆλͺ¨ νμ μ μμ νμ μ λΌμλ£μ μ μλ€ μ λλ‘ μκ³ μμλ€.
μ΄λ₯Ό μ²μ λ°°μΈ λ μ¬λ μ¬λλ€κ³Ό κ°μ΄ μ§μ¬κ°ν - μ μ¬κ°νμ΄λΌλ μμλ‘ λ°°μ μλ€. μ΄λ₯Όν λ©΄ μ½λλ‘ λνλ΄λ©΄ λ€μκ³Ό κ°μ κ²μ΄λ€.
public class Rectangle {
private int width;
private int height;
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
}
public class Square extends Rectangle {
@Override
public void setWidth(final int width) {
super.setWidth(width);
super.setHeight(width);
}
@Override
public void setHeight(final int height) {
super.setWidth(height);
super.setHeight(height);
}
}
μ μ¬κ°νμ μ§μ¬κ°νμ΄λ μ΄λ₯Ό μ½λλ‘ νννλ©΄ μμ κ°μ΄ λκ³ , Rectangle
μ΄λ νμ
μ Square
κ°μ²΄λ₯Ό λΌμλ£μ μ μλ€λ μ λλ‘ λλ λ€νμ±μ μ΄ν΄νκ³ μμλ€. κ·Έλ¦¬κ³ μ‘°κΈ λ μκ°μ΄ μ§λμ μ΄λμ κ° SOLID λΌλ κ²μ μ€μ΄ λ€μμ λ, μμ μμκ° κ°μ²΄ μ§ν₯ μ€κ³μ μμΉ κ·Έ μ€μμλ 리μ€μ½ν μΉν μμΉ(LSP)λ₯Ό μ§ν€μ§ μκ³ μλ€λ μ¬μ€μ μκ² λμλ€. (κ·Έ μ΄μ μ λν΄μ μ΄ κΈμ΄ λμμ΄ λ§μ΄ λμλ€.)
μμμμ μν¬λ¦¬ μ§μμ μ΅λν μλ‘, λμκ² νμ λ³΄λ¨ νΌλλ§μ΄ κ°μ€λμλ€. βκ·Έλμ μ΄ SOLID λΌλ μμΉμ λ€ μ§ν€λκ² νμ€μ μΌλ‘ κ°λ₯ν건κ°? μ΄λ¬λ©΄ μμμ΄κ³ μ»΄ν¬μ§μ μ΄κ³ λκ° μ λλ‘ μ°κΈ° λ무 νλ€ κ² κ°μλ°?β λΌλ μκ°λ§ κ°μ§κ² λμλ€. κ·Έ μ΄νλ‘λ μ μ λ κ°μ²΄ μ§ν₯ μ€κ³μ μν μ½λ보λ€λ ννλ€ λ§νλ Best Practiceμ λͺ¨μμ λ°λΌνκΈ°μ κΈκΈνλ κ² κ°λ€. μ λΉν λ°λΌνλκΉ μ λΉν μ΄μκ³ μ λΉν ν΄λ¦°νκ³ μ μ§λ³΄μλ μ λΉν λκ³ (λ¬Όλ‘ μ무λ μμ λ΄μ©μ μΈμ ν μ μ μμγ γ ) λ μ λΉν λμκ°λκΉ μ μ μ½λλ 벨μ μ λ°ν μ€κ³μ ν¨ν΄μλ κ΄μ¬μ΄ μμ΄μ§κ³ , μν€ν μ²λ μΈνλΌμ μΈ λΆλΆμμμ μ€κ³μλ§ κ΄μ¬μ κ°μ‘λ κ² κ°λ€.
μ‘°κΈμ μκ°μ΄ νλ¬ μ΄ κ°μλ₯Ό λ§λκ³ μμΌ SOLIDμ λν μλ¬Έ, λ€νμ±μ λν μλ¬Έμ κ±°μ μλ²½νκ² ν μ μμλ κ² κ°λ€. λ, μ΄ κ°μ λλΆμ λ€μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ κ΄μ¬λ μκΈ°κ³ νμ΅μ λν μμ§λ μκ²Όλ€.
μ¬μ€μ΄ κΈΈμλ€. μ΄ κ°μμμλ μ§μ¬κ°ν - μ μ¬κ°ν μμ μ²λΌ μ€μνμ μν©μ λΉλμ΄μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°, νΉν λ€νμ±μ λν΄ μ€λͺ ν΄μ€λ€. μ²μ²ν μ΄ν΄λ³΄μ.
μν κ³Ό ꡬν
λ€νμ±μ μ€λͺ νκΈ° μν΄μ κ°μ₯ μ€μν κ°λ μ μν κ³Ό ꡬνμ΄λ€. μλ₯Ό λ€μ΄ μ΄μ μμ μλμ°¨λ‘ μκ°ν΄λ³΄μ.
μ΄λ€ μ΄μ μ μν μ λ§‘μ μ¬λμ΄ μλμ°¨ μν μ μ¬μ©νλ€κ³ μκ°ν μ μλ€. κ·Έλ¦¬κ³ μ μ΄μ μ μν μλ ꡬνμΌλ‘μ¨ λ΄κ° λ€μ΄κ° μλ, μλλ©΄ λ€λ₯Έ λκ΅°κ°κ° λ€μ΄κ° μλ μλ€. λμΌνκ² μλμ°¨ μν μλ ꡬνμΌλ‘μ¨ μλνκ° λ€μ΄κ° μλ, μλλ©΄ μ΄λ§ μ’μΌλ©΄ ν μ¬λΌ λͺ¨λΈ 3 νΉμ λ²€μΈ C ν΄λμ€κ° λ€μ΄κ° μλ μλ€.
μν κ³Ό ꡬνμ λΆλ¦¬νλ κ²μ κ·Έλ₯ μ΄μ μ ꡬνκ³Ό μλμ°¨ ꡬνλ§μ κ°λ κ²μ λΉν΄μ λ§μ μ₯μ μ κ°μ§λ€.
μ΄λ€ μ₯μ μ κ°μ§λλ°?
λ³΄ν΅ μ΄λ¬ν ν¨ν΄ νΉμ λͺ¨λΈμμ 무μΈκ°λ₯Ό μ¬μ©νλ μΈ‘μ ν΄λΌμ΄μΈνΈ(Client)λΌ νλ€. μμ μμμμλ μ΄μ μκ° ν΄λΌμ΄μΈνΈκ° λλ€.
μν κ³Ό ꡬνμ λΆλ¦¬νλ©΄ λ€μμ μ₯μ μ κ°μ§κ² λλ€.
- ν΄λΌμ΄μΈνΈλ λμ(μλμ°¨)μ μν (μΈν°νμ΄μ€)λ§ μλ©΄ λλ€.
- ν΄λΌμ΄μΈνΈλ λμ(μλμ°¨)μ λ΄λΆ ꡬ쑰λ ꡬ체μ μΈ λ΄λΆ ꡬνμ λͺ°λΌλ λλ€.
- ν΄λΌμ΄μΈνΈλ λμ(μλμ°¨)μ λ΄λΆ ꡬ쑰λ ꡬ체μ λ΄λΆ ꡬνμ΄ λ³κ²½λμ΄λ μν₯μ λ°μ§ μλλ€.
- ν΄λΌμ΄μΈνΈλ λμ(μλμ°¨)μ ꡬν μ체λ₯Ό λ³κ²½ν΄λ(μλμ°¨λ₯Ό λ°κΏλ) μν₯μ λ°μ§ μλλ€.
μ°λ¦¬κ° μλμ°¨λ₯Ό μ΄μ νλ€κ³ νμ.
- λ©΄νλ§ μμ§νκ³ μλ€λ©΄ λμΆ© κ°μ νλ¬μ λ°μΌλ©΄ μμΌλ‘ κ°κ³ , λΈλ μ΄ν¬λ₯Ό λ°μΌλ©΄ λ©μΆλ μλμ°¨μ μν (μΈν°νμ΄μ€)λ₯Ό μμ§νκ³ μκΈ° λλ¬Έμ μλμ°¨μ μ’ λ₯(ꡬ체μ ꡬν)μ λν΄μλ λͺ¨λ₯΄λλΌλ μ΄μ μ ν μ μλ€.
- μλνμ μμ§ μ’ λ₯κ° λ¬΄μμ΄κ³ νμ΄μ΄λ 무μμ μ°λ©° λ°°κΈ°λμ΄ λͺμΈμ§μ λν΄ μ ν μ νμκ° μλ€.
- λ§μ½ μ λΉλ₯Ό λ°μΌλ¬ κ°μ λΈλ μ΄ν¬λ₯Ό μ νμΌλ‘ λ°κΎΈκ±°λ, λ°°ν°λ¦¬λ₯Ό λ°κΎΈλλΌλ μ΄μ νλ κΈ°λ³Έ κΈ°λ₯ μ체μλ μν₯μ λ°μ§ μλλ€.
- μ‘°κΈ κ·Ήλ¨μ μΌλ‘ μλνλ₯Ό ν μ¬λΌ λͺ¨λΈ 3λ‘ λ³κ²½μ νλλΌλ, μ°λ¦¬λ μ΄μ μ ν μ μλ€.
μ΄μ κ°μ΄ μν κ³Ό ꡬνμ λΆλ¦¬νλ©΄ κ΅μ₯ν μ μ°ν΄μ§κ³ λ³κ²½λ νΈλ¦¬ν΄μ§λ€.
μλ°μμλ μ΄λ»κ² ν΄?
μλ°μμ μν κ³Ό ꡬνμ λΆλ¦¬νκΈ° μν΄, μλ° μΈμ΄κ° μ§μνλ λ€νμ±μ νμ©νλ€.
μν μ μΈν°νμ΄μ€λ‘, ꡬνμ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ‘ μμ±ν μ μλ€.
λ°λΌμ κ°μ²΄λ₯Ό μ€κ³ν λ μν κ³Ό ꡬνμ μ€κ³ λ¨κ³μμλΆν° λͺ νν λΆλ¦¬ν΄μΌ νλ€. κ·Έλ¦¬κ³ λΉμ°ν **μν (μΈν°νμ΄μ€)**λ₯Ό λ¨Όμ λΆμ¬νκ³ , κ·Έ μν μ μνν μ μλ ꡬ체μ μΈ κ΅¬νμ μμ±νλ νΈμ΄ λμ κ²μ΄λ€.
κ·Έλ¦¬κ³ λΉμ°νκ², μΈν°νμ΄μ€μ λ³κ²½μ΄ μΌμ΄λλ μκ° ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ€μ ꡬνμ λͺ¨λ μμ ν΄μΌν κ²μ΄λ μ€κ³ λ¨κ³μμλΆν° μΈν°νμ΄μ€λ₯Ό μμ μ μΌλ‘ μ μ€κ³ν΄μΌ ν κ²μ΄λ€.
λ€νμ±μ λ³Έμ§μ?
κ·Έλ λ€λ©΄ μ΄ λ€νμ±μ λ³Έμ§μ 무μμ΄λΌκ³ ν μ μμκΉ? μ무λλ,
- μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μ€ν μμ μμ μ μ°νκ² λ³κ²½ν μ μλ€. μλ₯Ό λ€μ΄, μλμ°¨ μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄ μΈμ€ν΄μ€κ° μλν, κ·Έλμ , λ§ν°μ¦κ° μλ€κ³ ν λ, μ€ν μμ μ μνλ λλ‘ μ°¨μ’ μ κ³ λ₯Ό μ μλ€.
- μλ‘ ν΄λΌμ΄μΈνΈ - μλ²κ° λλ κ°μ²΄κ°μ νλ ₯ κ΄κ³μμ, ν΄λΌμ΄μΈνΈλ μλ²μ ꡬ체μ μΈ κ΅¬νμ΄ μλ μΈν°νμ΄μ€μλ§ μμ‘΄νκ² λκΈ° λλ¬Έμ μλ²μ λ΄λΆ ꡬνμ μ μ°νκ² λ³κ²½ν μ μλ€.
μ λλ‘ μ 리ν μ μμ κ² κ°λ€.
κ·ΈλΌ λ€νμ±λ§ μμΌλ©΄ SOLID μ§ν€κΈ° γ±γ΄?
νλ§λλ‘ μ΄μΌκΈ°νλ©΄ γ γ±γ΄ γ γ
λ€νμ±μ νμ©νλλΌλ κ°λ°©-νμ μμΉ(OCP)μ μμ‘΄ κ΄κ³ μμ μμΉ(DIP)λ₯Ό μ§ν¬ μ μλ€.
μλ₯Ό λ€μ΄ μ΄μ μ μν μ ꡬνμΌλ‘ DriverA
κ° μκ³ , μλμ°¨ μν μ ꡬνμΌλ‘λ μμ 3κ°μ§λ₯Ό κ·Έλλ‘ νμ©νλ€κ³ νμ. κ·Έλ¬λ©΄ DriverA
λ΄λΆμμλ μλμ°¨λ₯Ό μ¬μ©νκΈ° μν΄ ν΄λΉ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μ μ¬μ©ν΄μΌ ν κ²μ΄λ€. μ, μλ μλμ°¨λ‘ μλνλ₯Ό μ¬μ©νκ³ μμλ€κ³ νμ.
public class DriverA implements Driver {
private Car driverACar = new Sonata();
}
κ·Έλ¦¬κ³ μ΄ μ°¨λ₯Ό ν μ¬λΌ λͺ¨λΈ 3λ‘ λ³κ²½νκ³ μΆλ€κ³ νμ. μ΄λ»κ² ν΄μΌ ν κΉ?
μ΄μ© μ μλ€. ν΄λΌμ΄μΈνΈμΈ DriverA
λ΄λΆμμ ν μλμ°¨λ₯Ό μ§μ λ°κΏμ£Όμ΄μΌ νλ€.
public class DriverA implements Driver {
// private Car driverACar = new Sonata();
private Car driverACar = new TeslaModel3();
}
μ¬μ©νλ ꡬν κ°μ²΄λ₯Ό λ³κ²½νκΈ° μν΄ ν΄λΌμ΄μΈνΈμΈ DriverA
μ μ½λλ λ³κ²½ν΄μΌ νκΈ° λλ¬Έμ νμ₯μλ μ΄λ €μκ³ λ³κ²½μλ λ«νμμ΄μΌ νλ€λ OCPλ₯Ό μ§ν€μ§ λͺ»νλ€. λν, DriverA
λ Car
λΌλ μΈν°νμ΄μ€μλ μμ‘΄νμ§λ§ λμμ Sonata
μ TeslaModel3
μλ λμμ μμ‘΄νκΈ° λλ¬Έμ DIPλ§μ μλ°νλ€.
μλ κ·ΈλΌ μ΄μΌν¨;;
λ€νμ±λ§μΌλ‘ OCPμ DIPλ₯Ό μ§ν¬ μ μλ€λ μ¬ν μ¬μ€μ νμΈνλ€. SOLIDλ₯Ό μ§ν€κΈ° μν΄μ νμ€ν λκ° λ νμνλ€.
μ€νλ§κ³Ό κ°μ²΄ μ§ν₯
μ€νλ§κ³Ό κ°μ²΄ μ§ν₯μ κ΄κ³μμλ λ€νμ±μ΄ κ°μ₯ μ€μν ν€μλμ΄λ€. μ€νλ§μ λ€νμ±μ κ·Ήλνν΄μ μ΄μ©ν μ μκ² νλ μμν¬λ¨μμ κ°λ°μλ₯Ό λμμ€λ€.
μ€νλ§μ΄λΌ νλ©΄ κ΅μ₯ν μ λͺ ν ν€μλμΈ μ μ΄μ μμ (IoC)λ μμ‘΄ κ΄κ³ μ£Όμ (DI)λ λ€νμ±μ νμ©ν΄μ μν κ³Ό ꡬνμ νΈλ¦¬νκ² λΆλ¦¬νκ³ , λ€λ£° μ μλλ‘ μ§μν΄μ€λ€. κ·Έλ¦¬κ³ μμ‘΄ κ΄κ³ μ£Όμ (DI)κ³Ό DI 컨ν μ΄λ μ 곡μ ν΅ν΄ λ€νμ± λΏ μλλΌ OCP, κ·Έλ¦¬κ³ DIPλ μ§ν¬ μ μκ² λμμ€λ€. μ΄ λ§μΈ μ¦μ¨ ν΄λΌμ΄μΈνΈμ μ½λ λ³κ²½ μμ΄ κΈ°λ₯μ νμ₯ν μ μκ² λλ€λ λ»μ΄λ€. μ΄λ κ² μ€νλ§μ μ°λ©΄ λ§μΉ λΆνμ κ΅μ²΄νλ―μ΄, 쑰립νλ―μ΄ κ°λ°μ ν μ μλ€.
λ€μμ
μ΄ κ°μμμλ μ€μ΅μ ν΅ν΄μ κ°λ μ μ΄ν΄νλ λ΄μ©μ΄ λ°λ‘ λ°λΌμ¨λ€. μ½λ©κ³Ό κ΄λ ¨λ λΆλΆμ λ무 μ°Έμ‘°νκΈ°μλ ν¬μ€νΈκ° κΈΈμ΄μ§κΈ°λ νκ³ , λ무 κ°μ¬λΆμ μ€λͺ λ Ένμ°λ₯Ό μ μΆνλ μ£μ± κ°μ΄ μμ΄μ μ½λ©μ νλ ννΈλ μ μΈνλ € νλ€. (μ§μ§ λͺ κ°μμ΄λ κΆκΈνμ λΆλ€μ κΌ λ€μ΄λ³΄κΈΈ λ°λλ€.)
λ€μ ν¬μ€νΈμμλ IoC, DI, κ·Έλ¦¬κ³ μ»¨ν μ΄λμ λν λ΄μ©μ μ λ¦¬ν΄ λ³΄λλ‘ νκ² λ€.
λ.