๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Java/CleanCode

[CleanCode] 8์žฅ ๊ฒฝ๊ณ„

728x90
๐Ÿ”น ์‹œ์Šคํ…œ์— ๋“ค์–ด๊ฐ€๋Š” ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค.
์˜คํ”ˆ์†Œ์Šค๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜, ์‚ฌ๋‚ด ๋‹ค๋ฅธ ํŒ€์ด ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜, ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ด ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์šฐ๋ฆฌ ์ฝ”๋“œ์— ๊น”๋”ํ•˜๊ฒŒ ํ†ตํ•ฉํ•ด์•ผ ํ•œ๋‹ค. ์ด ์žฅ์—์„œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฒฝ๊ณ„๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•๊ณผ ๊ธฐ๊ต๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

์™ธ๋ถ€ ์ฝ”๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

  • ํŒจํ‚ค์ง€ ์ œ๊ณต์ž๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ œ๊ณต์ž๋Š” ์ ์šฉ์„ฑ์„ ์ตœ๋Œ€ํ•œ ๋„“ํžˆ๋ ค ์• ์“ด๋‹ค.
    • ๋” ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ ๋Œ์•„๊ฐ€์•ผ ๋” ๋งŽ์€ ๊ณ ๊ฐ์ด ๊ตฌ๋งคํ•˜๋‹ˆ๊นŒ.
  • ๋ฐ˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ์š”๊ตฌ์— ์ง‘์ค‘ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ”๋ž€๋‹ค.
    • ์ด๋Ÿฐ ์ฐจ์ด๋กœ ์‹œ์Šคํ…œ ๊ฒฝ๊ณ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์†Œ์ง€๊ฐ€ ๋งŽ๋‹ค.

๐Ÿ’ป java.util.Map

  • Map์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ์œ ์—ฐ์„ฑ์€ ํ™•์‹คํžˆ ์œ ์—ฐํ•˜์ง€๋งŒ ๊ทธ๋งŒํผ ์œ„ํ—˜์„ฑ๋„ ํฌ๋‹ค.
  • ์˜ˆ : Map์˜ clear() ๋ฉ”์„œ๋“œ
    • Map์˜ ์‚ฌ์šฉ์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ Map ๋‚ด์šฉ์„ ์ง€์šธ ๊ถŒํ•œ์ด ์žˆ๋‹ค.
    • ํ˜น์€ ์„ค๊ณ„์‹œ Map์— ํŠน์ • ์œ ํ˜•๋งŒ ์ €์žฅํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์ง€๋งŒ Map์—์„œ ๊ฐ์ฒด ์œ ํ˜•์„ ์ œํ•œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์Œ๋งŒ ๋จน์œผ๋ฉด ์‚ฌ์šฉ์ž๋Š” ์–ด๋–ค ๊ฐ์ฒด ์œ ํ˜•๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ Map์ด ๋ฐ˜ํ™˜ํ•˜๋Š” Object๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ฑ…์ž„์€ Map์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์žˆ๋‹ค. ์ด ๋ฐฉ์‹ ๋ณด๋‹ค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Map<String, Sensor> sensors = new HashMap<Sensor>();
...
Sensor s = sensors.get(sensorId);

๊ทธ๋ ‡์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ๊นŒ์ง€ ์ œ๊ณตํ•œ๋‹ค๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋Š” ๋ชปํ•œ๋‹ค. ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญ์Šค์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ Sensors ์•ˆ์—์„œ ๊ฒฐ์ •ํ•˜๋ฉด ์–ด๋–จ๊นŒ?

public class Sensors {
private Map sensors = new HashMap();

public Sensor getById(String id) {
				return (Sensor) sensors.get(id);
    }

    // ์ดํ•˜ ์ƒ๋žต
}

๊ฒฝ๊ณ„ ์ธํ„ฐํŽ˜์ด์Šค์ธ Map์„ Sensors ํด๋ž˜์Šค ์•ˆ์œผ๋กœ ์ˆจ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ Map ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€ํ•˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค. ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋“  ํ•˜์ง€ ์•Š๋“  ๋”์ด์ƒ ๋ฌธ์ œ๊ฐ€ ์•ˆ ๋œ๋‹ค. Sensors ํด๋ž˜์Šค ์•ˆ์—์„œ ๊ฐ์ฒด ์œ ํ˜•์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Map ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์œ„์™€ ๊ฐ™์ด ์บก์Аํ™”ํ•˜๋ผ๋Š” ์†Œ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. Map์„ ์—ฌ๊ธฐ์ €๊ธฐ ๋„˜๊ธฐ์ง€ ๋ง๋ž€ ๋ง์ด๋‹ค. Map๊ณผ ๊ฐ™์€ ๊ฒฝ๊ณ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ด๋ฅผ ์ด์šฉํ•˜๋Š” ํด๋ž˜์Šค๋‚˜ ํด๋ž˜์Šค ๊ณ„์—ด ๋ฐ–์œผ๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•œ๋‹ค. Map ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต๊ฐœ API ์ธ์ˆ˜๋กœ ๋„˜๊ธฐ๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฒฝ๊ณ„ ์‚ดํ”ผ๊ณ  ์ตํžˆ๊ธฐ

  • ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ ์€ ์‹œ๊ฐ„์— ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ถœ์‹œํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.
  • ์™ธ๋ถ€ ํŒจํ‚ค์ง€ ํ…Œ์ŠคํŠธ๋Š” ์šฐ๋ฆฌ ์ฑ…์ž„์ด ์•„๋‹ˆ์ง€๋งŒ
  • ์šฐ๋ฆฌ ์ž์‹ ์„ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธํ•˜๋Š” ํŽธ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.
  • ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™”์œผ๋‚˜ ์‚ฌ์šฉ๋ฒ•์ด ๋ถ„๋ช…์น˜ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
    • ๋Œ€๊ฐœ๋Š” ํ•˜๋ฃจ๋‚˜ ์ดํ‹€ (์•„๋‹ˆ๋ฉด ๋” ์˜ค๋žซ๋™์•ˆ) ๋ฌธ์„œ๋ฅผ ์ฝ์œผ๋ฉฐ ์‚ฌ์šฉ๋ฒ•์„ ๊ฒฐ์ •ํ•œ๋‹ค.
    • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ์ชฝ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ตํžˆ๊ธฐ๋Š” ์–ด๋ ต๋‹ค.
    • ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค.
  • ๋งŒ์•ฝ ๊ณง๋ฐ”๋กœ ์šฐ๋ฆฌ์ชฝ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ๋จผ์ € ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•ด ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ตํžˆ๋ฉด ์–ด๋–จ๊นŒ?
    • ์ง ๋‰ด์ปคํฌ๋Š” ์ด๋ฅผ ํ•™์Šต ํ…Œ์ŠคํŠธ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ํ•™์Šต ํ…Œ์ŠคํŠธ ๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ฐฉ์‹๋Œ€๋กœ ์™ธ๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • ํ†ต์ œ๋œ ํ™˜๊ฒฝ์—์„œ API๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์…ˆ์ด๋‹ค.
    • ํ•™์Šต ํ…Œ์ŠคํŠธ๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ชฉ์ ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.

log4j ์ตํžˆ๊ธฐ

๋กœ๊น… ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹  ์•„ํŒŒ์น˜์˜ log4j ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋ฌธ์„œ๋ฅผ ์ž์„ธํžˆ ์ฝ๊ธฐ ์ „์— ๋จผ์ € ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

@Test
public void testLogCreate() {
    Logger logger = Logger.getLogger("MyLogger");
    logger.info("hello");
}

ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ธ๋”๋‹ˆ Appender๋ผ๋Š” ๋ญ”๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์„œ 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.removeAppAppenders();
    logger.addAppender(
            new ConsoleAppender(
                new PatternLayout("%p %t %m%n"), ConsoleAppender.SYSTEM_OUT)
            );
        logger.info("hello");
}

์ด์ œ์•ผ ์ œ๋Œ€๋กœ ๋Œ์•„๊ฐ„๋‹ค. "hello"๊ฐ€ ๋“ค์–ด๊ฐ„ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฝ˜์†”์— ์ฐํžŒ๋‹ค. ConsoleAppender์—๊ฒŒ ์ฝ˜์†”์— ์“ฐ๋ผ๊ณ  ์•Œ๋ ค์•ผ ํ•œ๋‹ค๋‹ˆ ๋ญ”๊ฐ€ ์ˆ˜์ƒํ•˜๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ConsoleAppender.SYSTEM_OUT ์ธ์ˆ˜๋ฅผ ์ œ๊ฑฐํ–ˆ๋”๋‹ˆ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. PatternLayout์„ ์ œ๊ฑฐํ–ˆ๋”๋‹ˆ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์ด ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค. ๋ฌธ์„œ๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ์ฝ์–ด๋ณด๊ณ  ๊ตฌ๊ธ€์„ ๋’ค์ ธ๋ณด๋ฉด์„œ log4j๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ณ  ์—ฌ๊ธฐ์„œ ์–ป์€ ์ง€์‹์„ ๊ฐ„๋‹จํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ช‡ ๊ฐœ๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค.

public class LogTest {
private Logger logger;

    @Before
    public void initialize() {
        logger = Logger.getLogger("logger");
        logger.removeAllAppenders();
        Logger.getRootLogger().removeAllAppenders();
    }

    @Test
    public void basicLogger() {
        BasicConfigurator.configure();
        logger.info("basicLogger");
    }

    @Test
    public void addAppenderWithStream() {
        logger.addAppender(new ConsoleAppender(new PatternLayout("%p %t %m%n"), ConsoleAppender.SYSTEM_OUT));
        logger.info("addAppenderWithStream");
    }

    @Test
    public void addAppenderWithoutStream() {
        logger.addAppender(new ConsoleAppender(new PatternLayout("%p %t %m%n")));
        logger.info("addAppenderWithoutStream");
    }
}

์ง€๊ธˆ๊นŒ์ง€ ๊ฐ„๋‹จํ•œ ์ฝ˜์†” ๋กœ๊ฑฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํ˜”์œผ๋‹ˆ, ์ด์ œ ๋ชจ๋“  ์ง€์‹์„ ๋…์ž์ ์ธ ๋กœ๊ฑฐ ํด๋ž˜์Šค๋กœ ์บก์Аํ™”ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‚˜๋จธ์ง€ ํ”„๋กœ๊ทธ๋žจ์€ log4j ๊ฒฝ๊ณ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.

ํ•™์Šต ํ…Œ์ŠคํŠธ๋Š” ๊ณต์งœ ์ด์ƒ์ด๋‹ค.

  • ํ•™์Šต ํ…Œ์ŠคํŠธ๋Š” ๊ณต์งœ ์ด์ƒ์ด๋‹ค
    • ํ•™์Šต ํ…Œ์ŠคํŠธ์— ๋“œ๋Š” ๋น„์šฉ์€ ์—†๋‹ค.
      • ์–ด์จŒ๋“  API๋ฅผ ๋ฐฐ์›Œ์•ผ ํ•˜๋ฏ€๋กœ ์˜คํžˆ๋ ค ํ•„์š”ํ•œ ์ง€์‹๋งŒ ํ™•๋ณดํ•˜๋Š” ์†์‰ฌ์šด ๋ฐฉ๋ฒ•์ด๋‹ค.
      • ํ•™์Šต ํ…Œ์ŠคํŠธ๋Š” ์ดํ•ด๋„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” ์ •ํ™•ํ•œ ์‹คํ—˜์ด๋‹ค.
    • ํ•™์Šต ํ…Œ์ŠคํŠธ๋Š” ๊ณต์งœ ์ด์ƒ์ด๋‹ค.
      • ํˆฌ์žํ•˜๋Š” ๋…ธ๋ ฅ๋ณด๋‹ค ์–ป๋Š” ์„ฑ๊ณผ๊ฐ€ ๋” ํฌ๋‹ค.
      • ํŒจํ‚ค์ง€ ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์˜จ๋‹ค๋ฉด ํ•™์Šต ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ํ•™์Šต ํ…Œ์ŠคํŠธ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋„๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.
      • ์ผ๋‹จ ํ†ตํ•ฉํ•œ ์ดํ›„๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ํŒจํ‚ค์ง€๊ฐ€ ์šฐ๋ฆฌ ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค.
      • ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž์—๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธธ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.
      • ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€ํ•œ๋‹ค.
      • ํŒจํ‚ค์ง€ ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์œ„ํ—˜์ด ์ƒ๊ธด๋‹ค.
      • ์ƒˆ ๋ฒ„์ „์ด ์šฐ๋ฆฌ ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉด ํ•™์Šต ํ…Œ์ŠคํŠธ๊ฐ€ ์ด ์‚ฌ์‹ค์„ ๊ณง๋ฐ”๋กœ ๋ฐํ˜€๋‚ธ๋‹ค.
    • ํ•™์Šต ํ…Œ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ํ•™์Šต์ด ํ•„์š”ํ•˜๋“  ๊ทธ๋ ‡์ง€ ์•Š๋“ , ์‹ค์ œ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
      • ์ด๋Ÿฐ ๊ฒฝ๊ณ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ํŒจํ‚ค์ง€์˜ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์ด์ „ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.
      • ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋‚ก์€ ๋ฒ„์ „์„ ํ•„์š” ์ด์ƒ์œผ๋กœ ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์œ ํ˜น์— ๋น ์ง€๊ธฐ ์‰ฝ๋‹ค.

์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

  • ๊ฒฝ๊ณ„์™€ ๊ด€๋ จํ•ด ๋˜ ๋‹ค๋ฅธ ์œ ํ˜•์€ ์•„๋Š” ์ฝ”๋“œ์™€ ๋ชจ๋ฅด๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒฝ๊ณ„๋‹ค.
  • ๋•Œ๋กœ๋Š” ์šฐ๋ฆฌ ์ง€์‹์ด ๊ฒฝ๊ณ„๋ฅผ ๋„ˆ๋จธ ๋ฏธ์น˜์ง€ ๋ชปํ•˜๋Š” ์ฝ”๋“œ ์˜์—ญ๋„ ์žˆ๋‹ค.
  • ๋•Œ๋กœ๋Š” ์•Œ๋ ค๊ณ  ํ•ด๋„ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค.
  • ๋•Œ๋กœ๋Š” ๋” ์ด์ƒ ๋‚ด๋‹ค๋ณด์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ๋‹ค.
์˜ˆ) ์†ก์‹ ๊ธฐ
์ €์ชฝ ํŒ€์ด ์•„์ง API๋ฅผ ์„ค๊ณ„ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ชจ๋ฅธ๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌํ˜„์„ ๋ฏธ๋ฃจ๊ณ  ์ด์ชฝ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฃผํŒŒ์ˆ˜์™€ ์ž๋ฃŒ ์ŠคํŠธ๋ฆผ์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š”๋‹ค.

  • ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ „์ ์œผ๋กœ ํ†ต์ œํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์ƒ๊ธด๋‹ค.
  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๋„ ๋†’์•„์ง€๊ณ  ์ฝ”๋“œ ์˜๋„๋„ ๋ถ„๋ช…ํ•ด์ง„๋‹ค.
  • ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ†ต์ œํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ •์˜๋˜์ง€๋„ ์•Š์€ ์†ก์‹ ๊ธฐ API์—์„œ CommunicationsController๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค.
  • ์ €์ชฝ ํŒ€์ด ์†ก์‹ ๊ธฐ API๋ฅผ ์ •์˜ํ•œ ํ›„์—๋Š” TransmitterAdapter๋ฅผ ๊ตฌํ˜„ํ•ด ๊ฐ„๊ทน์„ ๋งค์› ๋‹ค.
  • ADAPTER ํŒจํ„ด์œผ๋กœ API ์‚ฌ์šฉ์„ ์บก์Аํ™”ํ•ด API๊ฐ€ ๋ฐ”๋€” ๋•Œ ์ˆ˜์ •ํ•  ์ฝ”๋“œ๋ฅผ ํ•œ ๊ณณ์œผ๋กœ ๋ชจ์•˜๋‹ค.
  • ์ด์™€ ๊ฐ™์€ ์„ค๊ณ„๋Š” ํ…Œ์ŠคํŠธ๋„ ์‰ฝ๋‹ค.
  • ์ ์ ˆํ•œ FakeTransmitter ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CommunicationsController ํด๋ž˜์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Transmitter API ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚˜์˜จ ๋‹ค์Œ ๊ฒฝ๊ณ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ์šฐ๋ฆฌ๊ฐ€ API๋ฅผ ์˜ฌ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊นจ๋—ํ•œ ๊ฒฝ๊ณ„

  • ๊ฒฝ๊ณ„๋Š” ๋ณ€๊ฒฝ์ด ๋งŽ๋‹ค.
    • ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„๊ฐ€ ์šฐ์ˆ˜ํ•˜๋‹ค๋ฉด ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ๋งŽ์€ ํˆฌ์ž์™€ ์žฌ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
    • ์—„์ฒญ๋‚œ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ๊ณผ ์žฌ์ž‘์—…์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ํ†ต์ œํ•˜์ง€ ๋ชปํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š”
      • ๋„ˆ๋ฌด ๋งŽ์€ ํˆฌ์ž๋ฅผ ํ•˜๊ฑฐ๋‚˜
      • ํ–ฅํ›„ ๋ณ€๊ฒฝ ๋น„์šฉ์ด ์ง€๋‚˜์น˜๊ฒŒ ์ปค์ง€์ง€ ์•Š๋„๋ก ๊ฐ๋ณ„ํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ฒฝ๊ณ„์— ์œ„์น˜ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๊น”๋”ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค.
    • ๋˜ํ•œ ๊ธฐ๋Œ€์น˜๋ฅผ ์ •์˜ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋„ ์ž‘์„ฑํ•œ๋‹ค.
    • ์ด์ชฝ ์ฝ”๋“œ์—์„œ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์„ธ์„ธํ•˜๊ฒŒ ์•Œ์•„์•ผ ํ•  ํ•„์š”๋Š” ์—†๋‹ค.
  • ํ†ต์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ ํŒจํ‚ค์ง€์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ํ†ต์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์šฐ๋ฆฌ ์ฝ”๋“œ์— ์˜์กดํ•˜๋Š” ํŽธ์ด ํ›จ์”ฌ ์ข‹๋‹ค. ์ž์นซํ•˜๋ฉด ์™ธ๋ถ€ ์ฝ”๋“œ์— ํœ˜๋‘˜๋ฆฌ๊ณ  ๋งŒ๋‹ค.
  • ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€๋Šฅํ•œ ์ค„์—ฌ ๊ฒฝ๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜์ž.
    • Map์—์„œ ๋ดค๋“ฏ์ด, ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋กœ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ์‹ธ๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ADAPTER ํŒจํ„ด์„ ์ด์šฉํ•ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํŒจํ‚ค์ง€๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜์ž.
    • ์–ด๋А ๋ฐฉ๋ฒ•์ด๋“  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๋ฉฐ, ๊ฒฝ๊ณ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๊ด€์„ฑ๋„ ๋†’์•„์ง€๋ฉฐ, ์™ธ๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ ๋ณ€ํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝํ•  ์ฝ”๋“œ๋„ ์ค„์–ด๋“ ๋‹ค.

์ฐธ๊ณ  ๋งํฌ

๋ฐ˜์‘ํ˜•