1.1 ๋กœ๊ทธ ์†Œ๊ฐœ

๋กœ๊ทธ๋Š” ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ํ•ด์ƒ ์ €๋„์ด๋‚˜ ์ผ๊ธฐ์™€ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋กœ๊ฑฐ๋Š” ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Java์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ด์™€ ๊ฐ™์œผ๋ฉฐ ์กฐ๊ธˆ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

๋กœ๊ฑฐ ์ž๋ฐ”

์‚ฌ์‹ค Java ํ”„๋กœ๊ทธ๋žจ์€ UI, ์ฝ˜์†” ๋“ฑ์ด ์—†๋Š” ๋Œ€ํ˜• ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งค์šฐ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์ข…์ข… ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์„œ๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๊ฐ„์„ญํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ.

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ๊ฑฐ์˜ ์žฌํ˜„๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜์™€ ์‹คํŒจ๋ฅผ ์ฐพ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ผ์„ ๋กœ๊ทธ/ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค .

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜, ์ฐจ๋‹จ๋œ ๋ชจ๋“  ์˜ค๋ฅ˜ ๋ฐ ๋งŽ์€ ์ค‘๊ฐ„ ์ •๋ณด์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋กœ๊ทธ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ๊ฐ€ ์™„์ „ํ• ์ˆ˜๋ก ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ๋ณต์›ํ•˜๊ณ  ์‹คํŒจ ๋˜๋Š” ์˜ค๋ฅ˜์˜ ์›์ธ์„ ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋กœ๊ทธ๊ฐ€ ํด์ˆ˜๋ก ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋กœ๊ทธ๋Š” ํ•˜๋ฃจ์— ๋ช‡ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑด ๊ดœ์ฐฎ์•„.

1.2 ์‹คํŒจํ•œ ๋กœ๊ทธ

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

์ฒซ์งธ, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ˜์†” ์ž์ฒด์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์„œ๋น„์Šค ์ •๋ณด๋ฅผ ์ „ํ˜€ ๋ณด๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, ์ฝ˜์†” ๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฑฐ๊ธฐ์— ๋งŽ์ด ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์…‹์งธ, ์žฅ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ์ˆ˜์ง‘๋œ ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ์— ํŒŒ์ผ์— ์“ฐ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋“ค์€ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋˜ ๋‹ค๋ฅธ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค System.err. ์—ฌ๊ธฐ์— ๋ฉ”์‹œ์ง€๋ฅผ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ‘œ์ค€ ์ฝ˜์†”์ด ์•„๋‹Œ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ ์“ฐ๊ธฐ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

ํ•˜์ง€๋งŒ ์ด ํ˜•ํƒœ๋กœ๋„ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๋Š” ํŠน์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ํ˜„๋ช…ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ๊ธฐ๋ก๋œ ์ด๋ฒคํŠธ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ „์ฒด ๋กœ๊น… ํ”„๋กœ์„ธ์Šค๋Š” ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์ •๋ณด ์ˆ˜์ง‘ ์ž…๋‹ˆ๋‹ค .
  • ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์ˆ˜์ง‘๋œ ์ •๋ณด์˜ ํ•„ํ„ฐ๋ง ์ž…๋‹ˆ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์„ ํƒํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

1.3 log4j ๋กœ๊ฑฐ ์†Œ๊ฐœ

Java ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ฒ˜์Œ์œผ๋กœ ์ธ๊ธฐ ์žˆ๋Š” ๋กœ๊ฑฐ๋Š” log4j. ํ”„๋กœ์ ํŠธ์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด pom.xml์— ๋ช‡ ์ค„๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

์ด๋Ÿฌํ•œ ๋กœ๊ฑฐ์™€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํ˜ธ ์ž‘์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class Manager {
   private static final Logger logger = LoggerFactory.getLogger(Manager.class);

   public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

์—ฌ๊ธฐ์—์„œ ์„ธ ๊ฐ€์ง€ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ฒด ์ƒ์„ฑ์ด ๋…น์ƒ‰์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค Logger . ๊ฐœ์ฒด๋Š” ํŽธ๋ฆฌํ•œ ์ถ”๊ฐ€ ์ž‘์—…์„ ์œ„ํ•ด ์ •์  ๋ณ€์ˆ˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ getLogger()์ •๋ณด๊ฐ€ ์ˆ˜์ง‘๋œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋„ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ๋œ ์ค„์€ ๋””๋ฒ„๊น… ์ค‘์—๋งŒ ๊ฐ’ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค . ์ด๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.debug()

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ๋กœ๊ทธ์— ์ €์žฅํ•˜๋Š” ์ค„์ด ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค . ์˜ˆ์™ธ๋Š” ์ž ์žฌ์  ์˜ค๋ฅ˜์ด๋ฏ€๋กœ error().