Coding Planet
[μ΄νν°λΈ μλ°]chapter2 : [μμ΄ν 5] μμμ λͺ μνμ§ λ§κ³ μμ‘΄ κ°μ²΄ μ£Όμ μ μ¬μ©νλΌ λ³Έλ¬Έ
[μ΄νν°λΈ μλ°]chapter2 : [μμ΄ν 5] μμμ λͺ μνμ§ λ§κ³ μμ‘΄ κ°μ²΄ μ£Όμ μ μ¬μ©νλΌ
jhj.sharon 2023. 8. 11. 01:11
μμ΄ν 5: μμμ λͺ μνμ§ λ§κ³ μμ‘΄ κ°μ²΄ μ£Όμ μ μ¬μ©νλΌ
μ΄μ μ μ΄ν΄λ³Έ μ μ μ νΈλ¦¬ν° ν΄λμ€λ μ±κΈν΄ λ°©μμ μ¬μ©νλ μμμ λ°λΌ λμμ΄ λ¬λΌμ§λ ν΄λμ€μλ μ ν©νμ§ μλ€. μ μ μ νΈλ¦¬ν° ν΄λμ€λ μνλ₯Ό κ°μ§ μ μλ€. μ¦ μμμ λ°λΌ λμμ λ³κ²½νλ κ²μ΄ μ΄λ ΅λ€. μ±κΈν΄μ μ μ μνλ₯Ό κ°μ§κ² λλ―λ‘ μ¬λ¬ μμμ κ΄λ¦¬νκ±°λ λμμ λμ μΌλ‘ λ³κ²½νκΈ° μ΄λ ΅κ² λ§λ λ€. λν μ μ μ νΈλ¦¬ν° ν΄λμ€λ μ±κΈν΄μ μμμ ν΅ν νμ₯μ΄ μ΄λ ΅κ³ ν μ€νΈλ μ΄λ ΅λ€λ λ¨μ μ΄ μλ€. λ°λΌμ β ν΄λμ€κ° μ¬λ¬ μμ μΈμ€ν΄μ€λ₯Ό μ§μν΄μΌνκ³ , β‘ ν΄λΌμ΄μΈνΈκ° μνλ μμμ μ¬μ©ν΄μΌνλ 쑰건μ λ§μ‘±νλ €λ©΄ μΈμ€ν΄μ€λ₯Ό μμ±ν λ μμ±μμ νμν μμμ λ겨주λ λ°©μμΈ μμ‘΄ κ°μ²΄ μ£Όμ μ΄ μ ν©νλ€.
1. μμ‘΄ κ°μ²΄ μ£Όμ (Dependency Injection, DI)μ΄λ?
- μμ‘΄ κ°μ²΄ μ£Όμ μ΄λ κ°μ²΄μ μμ‘΄μ±μ μΈλΆμμ μ£Όμ ν΄μ£Όλ κ²μ΄λ€. μ΄λ‘ μΈν΄ κ°μ²΄λ μμ μ μμ‘΄μ±μ μ§μ μμ±νκ±°λ κ΄λ¦¬ν νμκ° μκ² λλ©°, ν μ€νΈμ μ¬μ¬μ©μ±μ΄ ν₯μλλ€.
- μ΄λ¬ν λ°©μμ μμμ΄ λͺ κ°λ μμ‘΄ κ΄κ³κ° μ΄λ»λ μκ΄μμ΄ μ μλνλ€. λν λΆλ³μ 보μ₯νμ¬ κ°μ μμμΌλ‘ μ¬μ©νλ €λ μ¬λ¬ ν΄λΌμ΄μΈνΈκ° μμ‘΄ κ°μ²΄λ€μ μμ¬νκ³ κ³΅μ ν μ μκΈ°λ νλ€.
- μμ‘΄ κ°μ²΄ μ£Όμ μ μμ±μ, μ μ ν©ν°λ¦¬, λΉλ λͺ¨λμ λκ°μ΄ μμ©ν μ μλ€.
2. μμ‘΄ κ°μ²΄ μ£Όμ (Dependency Injection, DI) μμ
1) λͺ¨λ λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ μν κ³΅ν΅ μΈν°νμ΄μ€λ₯Ό μ μνλ€.
public interface DatabaseConnector {
void connect();
void save(String data);
}
2) λ€μν μΈν°νμ΄μ€ μ°κ²°μ μν ꡬν ν΄λμ€
public class MySQLConnector implements DatabaseConnector {
@Override
public void connect() {
// MySQLμ μ°κ²°νλ μ½λ
}
@Override
public void save(String data) {
// λ°μ΄ν°λ₯Ό MySQLμ μ μ₯νλ μ½λ
}
}
public class PostgreSQLConnector implements DatabaseConnector {
@Override
public void connect() {
// PostgreSQLμ μ°κ²°νλ μ½λ
}
@Override
public void save(String data) {
// λ°μ΄ν°λ₯Ό PostgreSQLμ μ μ₯νλ μ½λ
}
}
3) λ°μ΄ν°λ₯Ό μ μ₯νλ ν΄λΌμ΄μΈνΈ ν΄λμ€ μ μ
- μ΄ ν΄λΌμ΄μΈνΈ ν΄λμ€λ μμ±μλ₯Ό ν΅ν΄ DatabaseConnector ꡬν체λ₯Ό μ£Όμ λ°λλ€.
public class DataSaver {
private DatabaseConnector db;
public DataSaver(DatabaseConnector dbConnector) {
this.db = dbConnector;
}
public void saveData(String data) {
db.connect();
db.save(data);
}
}
4) νμν λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ μ νν΄μ κ°μ²΄λ₯Ό μμ±νκ³ μ¬μ©
public class Main {
public static void main(String[] args) {
DataSaver mysqlSaver = new DataSaver(new MySQLConnector());
DataSaver postgresSaver = new DataSaver(new PostgreSQLConnector());
mysqlSaver.saveData("someDataForMySQL");
postgresSaver.saveData("someDataForPostgreSQL");
}
}
3. ν©ν°λ¦¬ λ©μλ ν¨ν΄(Factory Method pattern)κ³Ό Supplier<T>
1) ν©ν°λ¦¬ λ©μλ ν¨ν΄
- ν©ν°λ¦¬ λ©μλ ν¨ν΄μ μμ‘΄ κ°μ²΄ μ£Όμ ν¨ν΄μ λ³νμΌλ‘ κ°μ²΄ μμ±μ κ΄ν μ± μμ μλΈν΄λμ€λ‘ μμνλ λμμΈ ν¨ν΄μ΄λ€. μ΄ ν¨ν΄μ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±νμ§λ§, κ°μ²΄ μμ±μ μ€μ ꡬνμ μλΈν΄λμ€μ μμλμ΄ μλ€. μ¦, μμ±μμ μμν©ν°λ¦¬λ₯Ό λ겨주λ κ²μ΄λ€.
- ν©ν°λ¦¬λ νΈμΆν λλ§λ€ νΉμ νμ μ μΈμ€ν΄μ€λ₯Ό λ°λ³΅ν΄μ λ§λ€μ΄μ£Όλ κ°μ²΄μ΄λ€.
*μ₯μ ** - ν΄λΌμ΄μΈνΈ μ½λλ μμ±λλ κ°μ²΄μ ꡬ체μ μΈ ν΄λμ€λ₯Ό μ νμκ° μλ€. - κ°μ²΄ μμ± λ‘μ§μ μ€μννμ¬ μ½λ μ€λ³΅μ μ€μΌ μ μλ€. - νμ₯μ±μ΄ μ’μμ§λ€. μλ‘μ΄ κ°μ²΄ μ νμ μΆκ°νλ €λ©΄ κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½νμ§ μκ³ μλ‘μ΄ ν΄λμ€λ₯Ό μΆκ°νκΈ°λ§ νλ©΄ λλ€. |
2) Java8 Supplier<T>
- Supplierλ Java8μμ λμ λ ν¨μν μΈν°νμ΄μ€ μ€ νλλ‘, μ£Όλ‘ κ°μ²΄ μμ±μ΄λ μ°μ° κ²°κ³Όλ₯Ό μ 곡νλ λ° μ¬μ©λλ€.
- Supplierλ 맀κ°λ³μλ₯Ό λ°μ§ μκ³ λ¨μν 무μμΈκ°λ₯Ό λ°ννλ μΆμλ©μλκ° μ‘΄μ¬νλ€, μΈν°νμ΄μ€μ μ μλ λ€μκ³Ό κ°λ€.
- @FunctionalInterfaceλ ν΄λΉ μΈν°νμ΄μ€κ° μ νν νλμ μΆμ λ©μλλ§μ κ°μ§κ³ μμμ λνλΈλ€. μ΄λ‘ μΈν΄ λλ€ ννμκ³Ό ν¨κ» μ¬μ©ν μ μκ² λλ€.
@FunctionalInterface
public interface Supplier<T> {
T get();// 맀κ°λ³μκ° μκ³ , λ¨μν 무μμΈκ°λ₯Ό λ°νν λ
}
2) ν©ν°λ¦¬ λ©μλ ν¨ν΄κ³Ό Java8 Supplier<T>
- Java 8μ Supplier μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄ ν©ν°λ¦¬ λ©μλ ν¨ν΄μ λ μ μ°νκ³ κ°κ²°νκ² κ΅¬νν μ μλ€.
- μλ₯Ό λ€μ΄, μ¬λ¬ μ νμ λλ¬Όμ μμ±νλ ν©ν°λ¦¬λ₯Ό μκ°ν΄λ³΄μ.
- μλ μ½λμμ, createAnimal λ©μλλ Supplierμ 맀κ°λ³μλ‘ λ°μ ν΄λΉ 곡κΈμλ₯Ό ν΅ν΄ λλ¬Ό μΈμ€ν΄μ€λ₯Ό μμ±νλ€. Dog::new λ° Cat::newλ λ©μλ μ°Έμ‘°λ₯Ό μ¬μ©νμ¬ ν΄λΉ ν΄λμ€μ μμ±μλ₯Ό μ°Έμ‘°νλ€.
public interface Animal {
void speak();
}
public class Dog implements Animal {
@Override
public void speak() {
System.out.println("Woof!");
}
}
public class Cat implements Animal {
@Override
public void speak() {
System.out.println("Meow!");
}
}
public class AnimalFactory {
public static Animal createAnimal(Supplier<Animal> supplier) {
return supplier.get();
}
public static void main(String[] args) {
Animal dog = createAnimal(Dog::new);
dog.speak();
Animal cat = createAnimal(Cat::new);
cat.speak();
}
}
- νμ μ μμΌλμΉ΄λ νμ μ Javaμ μ λ€λ¦μ μ¬μ©ν λ νΉμ νμ μ μλΈνμ λ§μ νμ©νλλ‘ μ ννλ κΈ°λ₯μ΄λ€. μ΄λ₯Ό ν΅ν΄ μ λ€λ¦ νμ μ μ μ°μ±μ λμΌ μ μλ€.
- Supplierλ₯Ό μ λ ₯μΌλ‘ λ°λ λ©μλμμ νμ μ μμΌλμΉ΄λ νμ μ μ¬μ©νλ©΄, νΉμ νμ μ μλΈνμ λ§μ μμ±νλ Supplierλ₯Ό λ°μλ€μΌ μ μκ² λλ€.
- λͺ¨λ λλ¬Όμ μμ±ν μ μλ ν©ν°λ¦¬κ° μλλΌ, μ€μ§ Dogλ§μ μμ±ν μ μλ ν©ν°λ¦¬λ₯Ό μνλ€λ©΄ λ€μκ³Ό κ°μ΄ νμ μ μμΌλμΉ΄λ νμ μ μ¬μ©ν μ μλ€.
public Animal createDogSupplier(Supplier<? extends Dog> dogSupplier) {
return dogSupplier.get();
}
λ¨