8μ₯ κ²½κ³
μμ€ν μ λ€μ΄κ°λ λͺ¨λ μννΈμ¨μ΄λ₯Ό μ§μ κ°λ°νλ κ²½μ°λ λλ¬Όλ€.
λλ‘λ ν¨ν€μ§λ₯Ό μ¬κ³ μ€ν μμ€λ₯Ό μ΄μ©νλ€.
μ΄λ€ μμΌλ‘λ μ΄ μΈλΆ μ½λμ μ°λ¦¬ μ½λμ κ²½κ³λ₯Ό κΉλνκ² μ²λ¦¬νκ³ ν΅ν©ν΄μΌ νλ€.
1. μΈλΆ μ½λ μ¬μ©νκΈ°
ν¨ν€μ§ μ 곡μλ νλ μμν¬ μ 곡μλ μ μ©μ±μ μ΅λν λν λ λ§μ νκ²½μμ λμκ°κΈΈ μνλ€.
νμ§λ§ μ¬μ©μλ μμ μ μꡬμ μ§μ€νλ μΈν°νμ΄μ€λ₯Ό λ μνλ€.
μλ‘ java.util.Mapμ μ΄ν΄λ³΄μ. Mapμ΄ μ 곡νλ κΈ°λ₯μ±κ³Ό μ μ°μ±μ νμ€ν μ μ©νμ§λ§ κ·Έλ§νΌ μνλ ν¬λ€.
- λκΈ°λ μͺ½μμλ Map λ΄μ©μ μμ νμ§ μμΌλ¦¬λΌ λ―Ώμ μ μμ§λ§, Mapμ΄ μ 곡νλ λ©μλ μ€ Clear()κ° μ‘΄μ¬νλ€. μ¦, Map μ¬μ©μλΌλ©΄ λꡬλ Map λ΄μ©μ μ§μΈ μ μλ€.
- μ΄λ€ ν΄λμ€λ₯Ό μ μ₯νλ Map κ°μ²΄λ₯Ό μ¬μ©νλ€λ©΄ μ λ€λ¦μ€λ Warpper ν΄λμ€λ₯Ό ν΅ν΄ κ΄λ¦¬ν΄μΌ νλ€.
// 1. κΈ°λ³Έ νν
// μΊμ€ν
μ λΆλ΄μ μκ² λλ€.
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);
// 2. generic
// Map κ°μ²΄κ° νμ μ΄μμ κΈ°λ₯μ μ 곡νλ κ²μ λ§μ§ λͺ»νλ€.
Map<String, Sensor> sensors = new HashMap<String, Sensor>();
Sensor s = sensors.get(sensorId);
// 3. Wrapping
// κ²½κ³μ μΈν°νμ΄μ€(μ΄ κ²½μ°μλ Mapμ λ©μλ)λ μ¨κ²¨μ§λ€.
// Mapμ μΈν°νμ΄μ€κ° λ³κ²½λλλΌλ μ¬νλ₯Ό μ΅μνν μ μλ€. μλ₯Ό λ€μ΄ Genericμ μ¬μ©νλ μ§μ μΊμ€ν
νλ 그건 ꡬν λν
μΌμ΄λ©° Sensorν΄λμ€λ₯Ό μ¬μ©νλ μΈ‘μμλ μ κ²½μΈ νμκ° μλ€.
// μ΄λ λν μ¬μ©μμ λͺ©μ μ λ± λ§κ² λμμΈλμ΄ μμΌλ―λ‘ μ΄ν΄νκΈ° μ½κ³ μλͺ» μ¬μ©νκΈ° μ΄λ ΅κ² λλ€.
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor)sensors.get(id);
}
}
2. κ²½κ³ μ΄νΌκ³ μ΅νκΈ°
μΈλΆμμ κ°μ Έμ¨ ν¨ν€μ§λ₯Ό μ¬μ©νκ³ μΆλ€λ©΄ μ΄λμ μ΄λ»κ² μμν΄μΌ μ’μκΉ?
- νμ¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό κ°μ Έμ μ¬μ©λ²μ΄ λΆλͺ μΉ μμΌλ λκ°λ ν루λ μ΄ν λ¬Έμλ₯Ό μ½μΌλ©° μ¬μ©λ²μ κ²°μ νλ€.
- μ°λ¦¬ μͺ½ μ½λλ₯Ό μμ±ν΄ λΌμ΄λΈλ¬λ¦¬κ° μμλλ‘ λμνλμ§ νμΈνλ€.
- λλ‘λ μ°λ¦¬ λ²κ·ΈμΈμ§ λΌμ΄λΈλ¬λ¦¬ λ²κ·ΈμΈμ§ μ°Ύμλ΄λλΌ μ€λ λλ²κΉ μΌλ‘ 골μΉλ₯Ό μλλ€.
μΈλΆ μ½λλ₯Ό μ΅νκΈ°λ μ΄λ ΅κ³ μΈλΆ μ½λλ₯Ό ν΅ν©νκΈ°λ μ΄λ ΅λ€.
λ€λ₯΄κ² μ κ·Όν΄λ³΄μ.
곧λ°λ‘ μ°λ¦¬ μͺ½ μ½λλ₯Ό μμ±ν΄ μΈλΆ μ½λλ₯Ό νΈμΆνλ λμ λ¨Όμ κ°λ¨ν ν μ€νΈ μΌμ΄μ€λ₯Ό μμ±ν΄ μΈλΆ μ½λλ₯Ό νμ΅νλ€.
μ΄λ₯Ό νμ΅ ν μ€νΈλΌ λΆλ₯Έλ€.
- νμ΅ ν μ€νΈλ νλ‘κ·Έλ¨μμ μ¬μ©νλ €λ λ°©μλλ‘ μΈλΆ APIλ₯Ό νΈμΆνλ€. (ν΅μ λ νκ²½μμ APIλ₯Ό μ λλ‘ μ΄ν΄νλμ§λ₯Ό νμΈνλ €λ μ μ΄λ€.)
- νμ΅ ν μ€νΈλ APIλ₯Ό μ¬μ©νλ €λ λͺ©μ μ μ΄μ μ λ§μΆλ€.
- νμ΅ ν μ€νΈλ μ΄ν΄λλ₯Ό λμ¬μ£Όλ μ νν μ€νμ΄λ€.
// 1. log4j λΌμ΄λΈλ¬λ¦¬λ₯Ό λ€μ΄λ°μ.
// "hello"κ° μΆλ ₯λκΈΈ λ°λΌλ©΄μ μλμ ν
μ€νΈ μ½λλ₯Ό μμ±ν΄λ³΄μ.
public void testLogCreate() {
Logger logger = Logger.getLogger("MyLogger");
logger.info("hello");
}
// 2. "AppenderλΌλ κ² νμνλ€"λΌλ μλ¬λ₯Ό λ±λλ€.
// μ‘°κΈ λ μ½μ΄λ³΄λ ConsoleAppenderλΌλ κ² μλ κ±Έ μμλλ€.
// κ·Έλμ ConsoleAppenderλΌλ κ°μ²΄λ₯Ό λ§λ€μ΄ λ£μ΄μ€λ΄€λ€.
public void testLogAddAppender() {
Logger logger = Logger.getLogger("MyLogger");
ConsoleAppender appender = new ConsoleAppender();
logger.addAppender(appender);
logger.info("hello");
}
// 3. "Appenderμ μΆλ ₯ μ€νΈλ¦Όμ΄ μλ€"λΌκ³ νλ€.
// μ΄μνλ€. κ°μ§κ³ μλ κ² μ΄μ±μ μΌ κ² κ°μλ°...
// ꡬκΈμ λμμ λΉλ €, λ€μκ³Ό κ°μ΄ ν΄λ³΄μλ€.
public void testLogAddAppender() {
Logger logger = Logger.getLogger("MyLogger");
logger.removeAllAppenders();
logger.addAppender(new ConsoleAppender(
new PatternLayout("%p %t %m%n"),
ConsoleAppender.SYSTEM_OUT));
logger.info("hello");
}
// μ±κ³΅νλ€.
// νμ§λ§ ConsoleAppenderλ₯Ό λ§λ€μ΄λκ³ ConsoleAppender.SYSTEM_OUTμ λ°λ 건 μ΄μνλ€.
// κ·Έλμ λΉΌλ΄€λλ μ λμκ°λ€.
// νμ§λ§ PatternLayoutμ μ κ±°νλ λμκ°μ§ μλλ€.
// κ·Έλμ λ¬Έμλ₯Ό μ΄ν΄λ΄€λλ "ConsoleAppenderμ κΈ°λ³Έ μμ±μλ unconfigured μν"λλ€.
// λͺ
λ°±νμ§λ μκ³ μ€μ©μ μ΄μ§λ μλ€... λ²κ·Έμ΄κ±°λ, μ μ΄λ "μΌκ΄μ μ΄μ§ μλ€"λΌκ³ λκ»΄μ§λ€.
// μ‘°κΈ λ ꡬκΈλ§, λ¬Έμ μ½κΈ°, ν
μ€νΈλ₯Ό κ±°μ³ log4jμ λμλ²μ μμλκ³ κ·Έκ²μ κ°λ¨ν μ λ ν
μ€νΈλ‘ κΈ°λ‘νλ€.
// μ΄μ μ΄ μ§μμ κΈ°λ°μΌλ‘ log4jλ₯Ό λν νλ ν΄λμ€λ₯Ό λ§λ€ μ μλ€.
3. μμ§ μ‘΄μ¬νμ§ μλ μ½λλ₯Ό μ¬μ©νκΈ°
λλ‘λ μ°λ¦¬ μ§μμ΄ κ²½κ³λ₯Ό λλ¨Έ λ―ΈμΉμΉ λͺ»νλ μ½λ μμλ μλ€.
μλ €κ³ ν΄λ μ μκ° μλ€. λλ‘λ λ μ΄μ λ΄λ€λ³΄μ§ μκΈ°λ‘ κ²°μ νλ€.
- μ μλ 무μ ν΅μ μμ€ν μ ꡬμΆνλ νλ‘μ νΈλ₯Ό νκ³ μμλ€.
- κ·Έ ν μμ νλΆ νμΌλ‘ μ‘μ κΈ°λ₯Ό λ΄λΉνλ νμ΄ μμλλ° λλ¨Έμ§ νμλ€μ μ‘μ κΈ°μ λν μ§μμ΄ κ±°μ μμλ€.
- μ‘μ κΈ°νμ μΈν°νμ΄μ€λ₯Ό μ 곡νμ§ μμλ€. νμ§λ§ μ μλ μ‘μ κΈ°νμ κΈ°λ€λ¦¬λ λμ μνλ κΈ°λ₯μ μ μνκ³ μΈν°νμ΄μ€λ‘ λ§λ€μλ€.
- μνλ κΈ°λ₯: μ§μ ν μ£Όνμλ₯Ό μ΄μ©ν΄ μ΄ μ€νΈλ¦Όμμ λ€μ΄μ€λ μλ£λ₯Ό μλ λ‘κ·Έ μ νΈλ‘ μ μ‘νλΌ
- μΈν°νμ΄μ€λ₯Ό μ μν¨μΌλ‘μ¨ λ©μΈ λ‘μ§μ λ κΉλνκ² μ§€ μ μμκ³ λͺ©νλ₯Ό λͺ ννκ² λνλΌ μ μμλ€.
- Adapter PatternμΌλ‘ API μ¬μ©μ μΊ‘μνν΄ APIκ° λ°λ λ μμ ν μ½λλ₯Ό ν κ³³μΌλ‘ λͺ¨μλ€.
- API μΈν°νμ΄μ€κ° λμ¨ λ€μ κ²½κ³ ν μ€νΈ μΌμ΄μ€λ₯Ό μμ±ν΄ μ°λ¦¬κ° APIλ₯Ό μ¬λ°λ₯΄κ² μ¬μ©νλμ§ ν μ€νΈν μλ μλ€.
4. κΉ¨λν κ²½κ³
μννΈμ¨μ΄ μ€κ³κ° μ°μνλ€λ©΄ λ³κ²½νλλ° λ§μ ν¬μμ μ¬μμ μ΄ νμνμ§ μλ€.
- κ²½κ³μ μμΉνλ μ½λλ κΉλν λΆλ¦¬νκ³ κΈ°λμΉλ₯Ό μ μνλ ν μ€νΈ μΌμ΄μ€λ μμ±νλ€.
- μ΄μͺ½ μ½λμμ μΈλΆ ν¨ν€μ§λ₯Ό μΈμΈνκ² μμμΌ ν νμκ° μλ€.
- ν΅μ κ° λΆκ°λ₯ν μΈλΆ ν¨ν€μ§μ μμ‘΄νλ λμ ν΅μ κ° κ°λ₯ν μ°λ¦¬ μ½λμ μμ‘΄νλ νΈμ΄ μ’λ€.
- μΈλΆ ν¨ν€μ§λ₯Ό νΈμΆνλ μ½λλ₯Ό κ°λ₯ν μ€μ¬ κ²½κ³λ₯Ό κ΄λ¦¬νμ.
- μλ‘μ΄ ν΄λμ€λ‘ κ²½κ³λ₯Ό κ°μΈκ±°λ Adapter ν¨ν΄μ ν΅ν΄ μ°λ¦¬κ° μνλ μΈν°νμ΄μ€λ₯Ό ν¨ν€μ§κ° μ 곡νλ μΈν°νμ΄μ€λ‘ λ³ννμ.