π Chapter 8: κ²½κ³
π μΈλΆ μ½λ μ¬μ©νκΈ°β
ν¨ν€μ§ μ 곡μλ νλ μμν¬ μ 곡μλ μ μ©μ±μ μ΅λν λνλ € μ μ΄λ€. λ λ§μ νκ²½μμ λμκ°μΌ λ λ§μ κ³ κ°μ΄ ꡬ맀νλκΉ. λ°λ©΄, μ¬μ©μλ μμ μ μꡬμ μ§μ€νλ μΈν°νμ΄ μ€λ₯Ό λ°λλ€. μ΄λ° κΈ΄μ₯μΌλ‘ μΈν΄ μμ€ν κ²½κ³μμ λ¬Έμ κ° μκΈΈ μμ§κ° λ§λ€.
ν μλ‘, java.util.Map
μ μ΄ν΄λ³΄μ. Map
μ κ΅μ₯ν λ€μν μΈν°νμ΄μ€λ‘ μλ§μ κΈ°λ₯μ μ 곡νλ€. Map
μ΄ μ 곡νλ κΈ°λ₯μ±κ³Ό μ μ°μ±μ νμ€ν μ μ©νμ§λ§ κ·Έλ§νΌ μνλ ν¬λ€.
Map sensors = new HashMap();
Sensor
κ°μ²΄κ° νμν μ½λλ λ€μκ³Ό κ°μ΄ Sensor
κ°μ²΄λ₯Ό κ°μ Έμ¨λ€.
Sensor s = (Sensor)sensors.get(sensorId);
μμ κ°μ μ½λκ° ν λ²μ΄ μλλΌ μ¬λ¬ μ°¨λ‘ λμ¨λ€. μ¦, Map
μ΄ λ°ννλ Object
λ₯Ό μ¬λ°λ₯Έ μ νμΌλ‘ λ³νν μ±
μμ Map
μ μ¬μ©νλ ν΄λΌμ΄μΈνΈμ μλ€. κ·Έλλ μ½λλ λμνλ€. νμ§λ§ κΉ¨λν μ½λλΌ λ³΄κΈ°λ μ΄λ ΅λ€. κ²λ€κ° μμ κ°μ μ½λλ μλλ λΆλͺ
ν λ λ¬λμ§ μλλ€. λμ λ€μκ³Ό κ°μ΄ μ λ€λ¦μ€λ₯Ό μ¬μ©νλ©΄ μ½λ κ°λ
μ±μ΄ ν¬κ² λμμ§λ€.
Map<String, Sensor> sensors = new HashMap<Sensor>();
// ...
Sensor s = sensors.get(sensorId);
κ·Έλ μ§λ§ μ λ°©λ²λ Map<String, Sensor>
κ° μ¬μ©μμκ² νμνμ§ μμ κΈ°λ₯κΉμ§ μ 곡νλ€λ λ¬Έμ λ ν΄κ²°νμ§ λͺ»νλ€.
λ€μμ Map
μ μ’ λ κΉλνκ² μ¬μ©ν μ½λλ€. Sensors
μ¬μ©μλ μ λ€λ¦μ€κ° μ¬μ©λμλμ§ μ¬λΆμ μ κ²½ μΈ νμκ° μλ€. μλμμ 보λ―, μ λ€λ¦μ€μ μ¬μ© μ¬λΆλ Sensors
μμμ κ²°μ νλ€.
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
// μ΄ν μλ΅
}
κ²½κ³ μΈν°νμ΄μ€μΈ Map
μ Sensors
μμΌλ‘ μ¨κΈ΄λ€. λ°λΌμ Map
μΈν°νμ΄μ€κ° λ³νλλΌλ λλ¨Έμ§ νλ‘κ·Έλ¨μλ μν₯μ λ―ΈμΉμ§ μλλ€. μ λ€λ¦μ€λ₯Ό μ¬μ©νλ νμ§ μλ λ μ΄μ λ¬Έμ κ° μ λλ€. Sensors
ν΄λμ€ μμμ κ°μ²΄ μ νμ κ΄λ¦¬ νκ³ λ³ννκΈ° λλ¬Έμ΄λ€.
λν Sensors
ν΄λμ€λ νλ‘κ·Έλ¨μ νμν μΈν°νμ΄μ€λ§ μ 곡νλ€. κ·Έλμ μ½λλ μ΄ν΄νκΈ°λ μ½μ§λ§ μ€μ©νκΈ°λ μ΄λ ΅λ€. Sensors
ν΄λμ€λ (λλ¨Έμ§ νλ‘κ·Έλ¨μ΄) μ€κ³ κ·μΉκ³Ό λΉμ¦λμ€ κ·μΉμ λ°λ₯΄λλ‘ κ°μ ν μ μλ€.
Map
ν΄λμ€λ₯Ό μ¬μ©ν λλ§λ€ μμ κ°μ΄ μΊ‘μννλΌλ μλ¦¬κ° μλλ€. Map
μ μ¬κΈ°μ κΈ° λκΈ°μ§ λ§λΌλ λ§μ΄λ€. Map
κ³Ό κ°μ κ²½κ³ μΈν°νμ΄μ€λ₯Ό μ΄μ©ν λλ μ΄λ₯Ό μ΄μ©νλ ν΄λμ€λ ν΄λμ€ κ³μ΄ λ°μΌλ‘ λ
ΈμΆλμ§ μλλ‘ μ£Όμνλ€.
π κ²½κ³ μ΄νΌκ³ μ΅νκΈ°β
μΈλΆ ν¨ν€μ§ ν μ€νΈκ° μ°λ¦¬ μ± μμ μλλ€. νμ§λ§ μ°λ¦¬ μμ μ μν΄ μ°λ¦¬κ° μ¬μ©ν μ½λλ₯Ό ν μ€νΈνλ νΈμ΄ λ°λμ§νλ€.
μΈλΆ μ½λλ₯Ό μ΅νκΈ°λ μ΄λ ΅λ€. μΈλΆ μ½λλ₯Ό ν΅ν©νκΈ°λ μ΄λ ΅λ€. 곧λ°λ‘ μ°λ¦¬μͺ½ μ½λλ₯Ό μμ±ν΄ μΈλΆ μ½λλ₯Ό νΈμΆνλ λμ λ¨Όμ κ°λ¨ν ν μ€νΈ μΌμ΄μ€λ₯Ό μμ±ν΄ μΈλΆ μ½λλ₯Ό μ΅νλ©΄ μ΄λ¨κΉ? μ λ΄μ»€ν¬λ μ΄λ₯Ό νμ΅ ν μ€νΈλΌ λΆλ₯Έλ€.
νμ΅ ν μ€νΈλ νλ‘κ·Έλ¨μμ μ¬μ©νλ €λ λ°©μλλ‘ μΈλΆ APIλ₯Ό νΈμΆνλ€. ν΅μ λ νκ²½μμ APIλ₯Ό μ λλ‘ μ΄ν΄νλμ§λ₯Ό νμΈνλ μ μ΄λ€. νμ΅ ν μ€νΈλ APIλ₯Ό μ¬μ©νλ €λ λͺ©μ μ μ΄μ μ λ§μΆλ€.
π log4jμ΅νκΈ°β
λ‘κΉ
κΈ°λ₯μ μ§ μ ꡬννλ λμ μνμΉμ log4j
ν¨ν€μ§λ₯Ό μ¬μ©νλ € νλ€κ³ κ°μ νμ. λ¬Έμλ₯Ό μμΈν μ½κΈ° μ μ 첫 λ²μ§Έ ν
μ€νΈ μΌμ΄μ€λ₯Ό μμ±νλ€. νλ©΄μ hello
λ₯Ό μΆλ ₯νλ ν
μ€νΈ μΌμ΄μ€λ€.
@Test
public void testLogCreate() {
Logger logger = Logger.getLogger("MyLogger");
logger.info("hello");
}
ν
μ€νΈ μΌμ΄μ€λ₯Ό λλ Έλλ Appender
λΌλ λκ°κ° νμνλ€λ μ€λ₯κ° λ°μνλ€. λ¬Έμλ₯Ό μ’ λ μ½μ΄λ³΄λ ConsoleAppender
λΌλ ν΄λμ€κ° μλ€. κ·Έλμ ConsoleAppender
λ₯Ό μμ±ν ν ν
μ€νΈ μΌμ΄μ€λ₯Ό λ€μ λλ¦°λ€.
@Test
public void testLogAddAppender() {
Logger logger = Logger.getLogger("MyLogger");
ConsoleAppender appender = new ConsoleAppender();
logger.addAppender(appender);
logger.info("hello");
}
μ΄λ²μλ Appender
μ μΆλ ₯ μ€νΈλ¦Όμ΄ μλ€λ μ¬μ€μ λ°κ²¬νλ€. μ΄μνλ€. μΆλ ₯ μ€νΈλ¦Όμ΄ μμ΄μΌ μ μμ΄ μλκ°? ꡬκΈμμ κ²μν ν λ€μκ³Ό κ°μ΄ μλνλ€.
@Test
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");
}
μ΄μ μμΌ μ λλ‘ λμκ°λ€. μ§κΈκΉμ§ κ°λ¨ν μ½μ λ‘κ±° μ΄κΈ°ννλ λ°©λ²μ μ΅νμΌλ, μ΄μ λͺ¨λ μ§μμ λ
μμ μΈ λ‘κ±° ν΄λμ€λ‘ μΊ‘μννλ€. κ·Έλ¬λ©΄ λλ¨Έμ§ νλ‘κ·Έλ¨μ log4j
κ²½κ³ μΈν°νμ΄μ€λ₯Ό λͺ°λΌλ λλ€.
π νμ΅ ν μ€νΈλ κ³΅μ§ μ΄μμ΄λ€.β
νμ΅ ν μ€νΈλ κ³΅μ§ μ΄μμ΄λ€. ν¬μνλ λ Έλ ₯λ³΄λ€ μ»λ μ±κ³Όκ° λ ν¬λ€. ν¨ν€μ§ μ λ²μ μ΄ λμ¨λ€λ©΄ νμ΅ ν μ€νΈλ₯Ό λλ € μ°¨μ΄κ° μλμ§ νμΈνλ€. νμ΅ ν μ€νΈλ ν¨ν€μ§κ° μμλλ‘ λλμ§ κ²μ¦νλ€. μΌλ¨ ν΅ν©ν μ΄νλΌκ³ νλλΌλ ν¨ν€μ§κ° μ°λ¦¬ μ½λμ νΈνλ리λΌλ 보μ₯μ μλ€. ν¨ν€μ§ μμ±μμκ² μ½λλ₯Ό λ³κ²½ν νμκ° μκΈΈμ§λ λͺ¨λ₯Έλ€. ν¨ν€μ§ μμ±μλ λ²κ·Έλ₯Ό μμ νκ³ κΈ°λ₯λ μΆκ°νλ€. ν¨ν€μ§ μ λ²μ μ΄ λμ¬ λλ§λ€ μλ‘μ΄ μνμ΄ μκΈ΄λ€. μ λ²μ μ΄ μ°λ¦¬ μ½λμ νΈνλμ§ μμΌλ©΄ νμ΅ ν μ€νΈκ° μ΄ μ¬μ€μ 곧λ°λ‘ λ°νλΈλ€.
νμ΅ ν μ€νΈλ₯Ό μ΄μ©ν νμ΅μ΄ νμνλ κ·Έλ μ§ μλ , μ€μ μ½λμ λμΌν λ°©μμΌλ‘ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ ν μ€νΈ μΌμ΄μ€κ° νμνλ€. μ΄λ° κ²½κ³ ν μ€νΈκ° μλ€λ©΄ ν¨ν€μ§μ μ λ²μ μΌλ‘ μ΄μ νκΈ° μ¬μμ§λ€. κ·Έλ μ§ μλ€λ©΄ λ‘μ λ²μ μ νμ μ΄μμΌλ‘ μ€λ«λμ μ¬μ©νλ €λ μ νΉμ λΉ μ§κΈ° μ½λ€.
π μμ§ μ‘΄μ¬νμ§ μμ μ½λλ₯Ό μ¬μ©νκΈ°β
κ²½κ³μ κ΄λ ¨ν΄ λ λ€λ₯Έ μ νμ μλ μ½λμ λͺ¨λ₯΄λ μ½λλ₯Ό λΆλ¦¬νλ κ²½κ³λ€. λλ‘λ μ°λ¦¬ μ§μμ΄ κ²½κ³λ₯Ό λμ΄ λ―ΈμΉμ§ λͺ»νλ μ½λ μμλ μλ€. λλ‘λ μλ €κ³ ν΄λ μ μκ° μλ€. λλ‘λ λ μ΄μ λ΄λ€λ³΄μ§ μκΈ°λ‘ κ²°μ νλ€.
μ°λ¦¬κ° λ°λΌλ μΈν°νμ΄μ€λ₯Ό ꡬννλ©΄ μ°λ¦¬κ° μΈν°νμ΄μ€λ₯Ό μ μ μΌλ‘ ν΅μ νλ€λ μ₯μ μ΄ μκΈ΄λ€. λν μ½λ κ°λ
μ±λ λμμ§κ³ μ½λ μλλ λΆλͺ
ν΄μ§λ€. μ΄μ κ°μ μ€κ³λ ν
μ€νΈλ μμ£Ό νΈνλ€. μ μ ν Fake
ν΄λμ€λ₯Ό μ¬μ©νλ©΄ ν΄λΉ ν΄λμ€λ₯Ό ν
μ€νΈν μ μλ€. API μΈν°νμ΄μ€κ° λμ¨ λ€μ κ²½ κ³ ν
μ€νΈ μΌμ΄μ€λ₯Ό μμ±ν΄ μ°λ¦¬κ° APIλ₯Ό μ¬λ°λ₯΄κ² μ¬μ©νλμ§ ν
μ€νΈν μλ μλ€.
π κΉ¨λν κ²½κ³β
κ²½κ³μμλ ν₯λ―Έλ‘μ΄ μΌμ΄ λ§μ΄ λ²μ΄μ§λ€. λ³κ²½μ΄ λνμ μΈ μλ€. μννΈμ¨μ΄ μ€κ³κ° μ°μνλ€λ©΄ λ³κ²½νλλ° λ§μ ν¬μμ μ¬μμ μ΄ νμνμ§ μλ€. μμ²λ μκ°κ³Ό λ Έλ ₯κ³Ό μ¬μμ μ μꡬνμ§ μλλ€. ν΅μ νμ§ λͺ»νλ μ½λλ₯Ό μ¬μ©ν λλ λ무 λ§μ ν¬μλ₯Ό νκ±°λ ν₯ν λ³κ²½ λΉμ©μ΄ μλμΉκ² 컀μ§μ§ μλλ‘ κ°λ³ν μ£Όμν΄μΌ νλ€.
κ²½κ³μ μμΉνλ μ½λλ κΉλν λΆλ¦¬νλ€. λν κΈ°λμΉλ₯Ό μ μνλ ν μ€νΈ μΌμ΄μ€λ μμ±νλ€. μ΄μͺ½ μ½λμμ μΈλΆ ν¨ν€μ§λ₯Ό μΈμΈνκ² μμμΌ ν νμκ° μλ€. ν΅μ κ° λΆκ°λ₯ν μΈλΆ ν¨ν€μ§μ μμ‘΄νλ λμ ν΅μ κ° κ°λ₯ν μ°λ¦¬ μ½λμ μμ‘΄νλ νΈμ΄ ν¨μ¬ λ μ’λ€. μμΉ«νλ©΄ μ€νλ € μΈλΆ μ½λμ νλλ¦¬κ³ λ§λ€.
μΈλΆ ν¨ν€μ§λ₯Ό νΈμΆνλ μ½λλ₯Ό κ°λ₯ν μ€μ¬ κ²½κ³λ₯Ό κ΄λ¦¬νμ. Map
μμ λ΄€λ―μ΄, μλ‘μ΄ ν΄λμ€λ‘ κ²½κ³λ₯Ό κ°μΈκ±°λ μλλ©΄ ADAPTER
ν¨ν΄μ μ¬μ©ν΄ μ°λ¦¬κ° μνλ μΈν°νμ΄μ€λ₯Ό ν¨ν€μ§κ° μ 곡νλ μΈν°νμ΄μ€λ‘ λ³ννμ. μ΄λ λ°©λ²μ΄λ μ½λ κ°λ
μ±μ΄ λμμ§λ©°, κ²½κ³ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ μΌκ΄μ±λ λμμ§λ©°, μΈλΆ ν¨ν€μ§κ° λ³νμ λ λ³κ²½ν μ½λλ μ€μ΄λ λ€.