์ด ๊ธ์ ์ฑ ์ ์ฝ๊ณ ๊ณต๋ถํ๊ณ ๊ธฐ์ตํ๊ธฐ ์ํ ๊ธฐ๋ก์ฉ์ผ๋ก ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ญ์ ํ๊ฒ ์ต๋๋ค.
๋จ์ํ ๋ค์ ์๋ํ๋ ๊ฒ์ด๋ค. ์์ ์ ๋ค์ ์๋ํ๋ค๋ ๊ฒ์ ์ฌ์ด ์ผ์ฒ๋ผ ๋ณด์ผ ์ ์๋ค. ํ์ง๋ง ํ์ค์์ ์ฌ์๋์ ์๊ธฐ์ ๋น๋๋ฅผ ํ๋จํ๋ ค๋ฉด ์ฝ๊ฐ์ ๋ ธํ์ฐ๊ฐ ํ์ํ๋ค.
- ์ฌ๋ฌ ์ฐจ๋ก ์ฌ์๋ํ๋ ค๋ ์๋๋ ์ฃผ๋ก ์๊ฒฉ ์์คํ ์ ํธ์ถํ ๊ฒฝ์ฐ ๋ํ๋๋ค.
- ๋ฌธ์ ๋ ์ฌ์๋ ํ ๋ ์คํจํ๋ฉด ์๋๋ง ๋๋ ค์ง๊ณ ์์คํ ๋ณต๊ตฌํ๊ธฐ๋ ์ ์ ์ด๋ ค์์ง๋ค.
๋ฐฑ์คํ๋ ๋น์ ํ์ผ๋ก ๋๊ธฐ ์๊ฐ์ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๋ ๋ฐฑ์คํ ์๊ฐ์ ์ํ์ ์ ์ ํด์ ๋๊ธฐ ์๊ฐ์ด ๋๋ฌด ๊ธธ์ด์ง์ง ์๊ฒ ํ์.
๋ฐฑ์คํ ์ ๋ต(Backoff Strategy)์ ์ฃผ๋ก ์ปดํจํฐ ๋คํธ์ํฌ์์ ์ฌ์ฉ๋๋ ์ ๋ต ์ค ํ๋๋ก, ์ผ์์ ์ธ ๋ฌธ์ ๋๋ ํผ์ก ์ํฉ์ด ๋ฐ์ํ์ ๋ ์ด๋ป๊ฒ ๋์ํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ๋ก ์ผ๋ก ์ด ์ ๋ต์ ์ฃผ๋ก ์ฌ์๋(retry) ๋ฉ์ปค๋์ฆ๊ณผ ๊ด๋ จ์ด ์๋ค.
๋์ ๊ณผ์
- ์ผ์์ ๋ฌธ์ ๋ฐ์: ๋ฐ์ดํฐ ํจํท ์ ์ก์ด ์คํจํ๊ฑฐ๋ ์๋ต์ด ์๋ ๋ฑ์ ์ผ์์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์ฌ์๋ ๊ฒฐ์ : ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋ฐ๋ก ๋ค์ ์๋๋ฅผ ํ์ง ์๊ณ , ์ ์ ๊ธฐ๋ค๋ฆฐ ํ์ ๋ค์ ์๋ํ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ๊ธฐ๋ค๋ฆผ(๋ฐฑ์คํ)
- ์ฌ์๋๋ฅผ ์ํด ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ์ ํฉ๋๋ค.
- ์ด๋ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ๊ฒฐ์ ๋ ์ ์๋๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ์ง์์ ์ธ ๋ฐฉ์์ด ์ฌ์ฉ๋ฉ๋๋ค. - ์ฆ, ์ฒ์์๋ ์งง์ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ, ์คํจํ ๊ฒฝ์ฐ ์ ์ฐจ ๋ ๊ธด ์๊ฐ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ์์ ๋๋ค. - ์ด๋ก์จ ๋คํธ์ํฌ ํผ์ก์ ํผํ๊ณ , ๋ฌธ์ ๋ฅผ ์ผ์์ ์ผ๋ก ํด๊ฒฐํ ๊ธฐํ๋ฅผ ๋๋ฆด ์ ์์ต๋๋ค.
- ์ฌ์๋: ์ผ์ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฐ ํ์ ๋ค์ ์๋ํฉ๋๋ค.
๋ฐฑ์คํ ์ ๋ต์ ์ฅ์
- ๋คํธ์ํฌ ํต์ ์์ ํจํท ์์ค, ์ง์ฐ, ํผ์ก ๋ฑ์ ๋ฌธ์ ์ ์ ์ฉํ๊ฒ ์ ์ฉ
- ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ ์ ์ก ์ค์ ํจํท ์์ค์ด ๋ฐ์ํ์ ๋ ์ฆ์ ์ฌ์๋ํ์ง ์๊ณ , ์ ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ฌ์๋ํจ์ผ๋ก์จ ์ผ์์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ์ด๋ ๋ฐ์ดํฐ ์ ์ก์ ์์ ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋์ด๋ ๋ฐ์ ๊ธฐ์ฌ
๋ฐฑ์คํ ์์ ์ฝ๋๊ฐ ๋ญ๊ฐ ์์ด?
๋ฐฑ์คํ ์ ๋ต์ ์ฃผ๋ก ๋คํธ์ํฌ ํต์ ์์ ์ฌ์ฉ๋๋ ๊ฐ๋ ์ด๋ฉฐ, ์ฝ๋๋ก ๊ตฌํ๋ ๋๋ ๋ค์ํ ์ํฉ์ ๋ง๊ฒ ์ ์ฉ๋ ์ ์์ต๋๋ค. ์๋๋ ๊ฐ๋จํ ์์ ์ฝ๋๋ก, ์ผ์ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฐ ํ์ ์ฌ์๋ํ๋ ๊ฐ๋จํ ๋ฐฑ์คํ ์ ๋ต์ ๋ณด์ฌ์ค๋๋ค.
์ด ์์ ์ฝ๋์์๋ sendDataToServer() ํจ์๊ฐ ๋ฐ์ดํฐ ์ ์ก์ ์๋ฎฌ๋ ์ด์ ํ๋ฉฐ, ๋๋คํ ์ฑ๊ณต๋ฅ ๋ก ๋ฐ์ดํฐ ์ ์ก์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฐ์ดํฐ ์ ์ก์ด ์คํจํ ๊ฒฝ์ฐ ๋ฐฑ์คํ ์ ๋ต์ ์ ์ฉํ์ฌ ์ฌ์๋ํ๊ณ , ์ผ์ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฐ ํ์ ๋ค์ ์๋ํฉ๋๋ค. ์ด๋ ๊ฒ ์ฌ์๋์ ๊ธฐ๋ค๋ฆผ์ ๋ฐ๋ณตํ๋ฉฐ ๋ฐ์ดํฐ ์ ์ก์ ์๋ํ๊ฒ ๋ฉ๋๋ค.
import java.util.Random;
public class BackoffExample {
public static void main(String[] args) {
int maxRetries = 3;
int retryDelay = 1000; // 1000 milliseconds = 1 second
int currentRetry = 0;
while (currentRetry < maxRetries) {
boolean success = sendDataToServer();
if (success) {
System.out.println("Data sent successfully!");
break;
} else {
System.out.println("Data sending failed. Retrying...");
currentRetry++;
if (currentRetry < maxRetries) {
System.out.println("Waiting before retrying...");
try {
Thread.sleep(retryDelay); // Wait before retrying
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("Max retries reached. Giving up.");
}
}
}
}
public static boolean sendDataToServer() {
// Simulate data sending with a random success rate
Random random = new Random();
double successRate = 0.7; // Simulate 70% success rate
return random.nextDouble() < successRate;
}
}
์งํฐ๋
์์์ ์ง์ฐ์๊ฐ, ์๊ฐ์ ๋ถ๊ท์นํ ๋ณ๋์ด๋ ๋ถ๊ท์นํ ๊ฐ๊ฒฉ์ ๋ํ๋ด๋ ์ฉ์ด๋ก ์ฃผ๋ก ๋คํธ์ํฌ๋ ํ์ด๋ฐ๊ณผ ๊ด๋ จ๋ ์ํฉ์์ ์ฌ์ฉ๋๋ค.
์ฒ๋ฅ๋ผ ํ์์ผ๋ก ๋ณต๊ตฌ ์ค์ด๋ ์๋น์ค ๋ค์ด์ ๋ง๊ธฐ ์ํด ์งํฐ๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋ผ์ด์ธํธ๋ค์ ํน์ ๋ฒ์์์ ์์์ ๊ฐ์ ๋ฐฑ์คํ ์๊ฐ์ ๋ํ๋ค.
- ์งํฐ๋ ์์๋ ์๊ฐ ๊ฐ๊ฒฉ๊ณผ ์ค์ ๋ฐ์ํ ์๊ฐ ๊ฐ๊ฒฉ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๋ํ๋ด๋ฉฐ, ์ฃผ๋ก ๋คํธ์ํฌ ํจํท์ ์ ์ก ๊ฐ๊ฒฉ์ด๋ ๋์งํธ ์ ํธ์ ํ์ด๋ฐ ๋ฑ์์ ๋ฐ์ํ๋ค.
- ์๋ฅผ ๋ค์ด, ์์ฑ ๋๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ์กํ๋ ๊ฒฝ์ฐ, ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ๋คํธ์ํฌ ์ง์ฐ์ด๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ ๋ฑ์ผ๋ก ์ธํด ์ค์ ์ ์ก ๊ฐ๊ฒฉ์ด ์์๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๊ฐ์ ์ธ ๋ถ๊ท์น์ฑ์ ์งํฐ๋ผ๊ณ ํ๋ค.
- ์งํฐ๋ ํต์ ์์คํ ์์ ์ค์ํ ๊ฐ๋ ์ผ๋ก, ์งํฐ๊ฐ ํฌ๋ฉด ์ ํธ์ ๋์ฐฉ ์๊ฐ์ด ๋ถ์์ ํ๊ฒ ๋์ด ์์ฑ์ด๋ ์์ ๋ฐ์ดํฐ์์ ์๋ฆฌ๋ ์์์ด ๋๊ธฐ๊ฑฐ๋ ๋ถ์์ ํด์ง ์ ์๋ค.
- ๋ฐ๋ผ์ ํต์ ์์คํ ์ค๊ณ๋ ๊ด๋ฆฌ์์ ์งํฐ๋ฅผ ์ต์ํํ์ฌ ์ ํธ์ ์์ ์ฑ๊ณผ ํ์ง์ ์ ์งํ๋ ๊ฒ์ด ์ค์
์ฒ๋ฅ๋ผ ํ์์ด๋
๋คํธ์ํฌ ์๋ฒ์ ์ผ์์ ์ธ ๋ฌธ์ ๊ฐ ์๊ฒจ ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ์ผ๋ก ์ฅ์ ๋ฅผ ๊ฒช๋ ์ํฉ์์ ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋์ผํ ๋ฐฑ์คํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค๋ฉด ๋ชจ๋๊ฐ ๋์์ ์์ฒญ์ ๋ค์ ๋ณด๋ด๋ ํ์
- ๊ฐ์
- A์ B๋ผ๋ ๋ ๋์ ์ปดํจํฐ๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ํฉ์ ๊ฐ์ ํฉ๋๋ค.
- A๊ฐ ๋ฐ์ดํฐ๋ฅผ B์๊ฒ ๋ณด๋ด๋ ค๊ณ ํ ๋, ๋คํธ์ํฌ ์ง์ฐ๊ณผ ํจํท ์์ค์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋ฐฑ์คํ ์ ๋ต
- A๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ผ์ ์๊ฐ(๋ฐฑ์คํ ํ์) ๋์ ๊ธฐ๋ค๋ฆฐ ํ ์ฌ์ ์ก์ ์๋ํ๋ ์ ๋ต์ ๋๋ค.
- ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ฐฑ์คํ ํ์์ ์ง์ ํ๊ณ ๊ทธ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฐ ํ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ์กํฉ๋๋ค.
- ์งํฐ ์ถ๊ฐ
- ์งํฐ๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐฑ์คํ ํ์์ ๋ถ๊ท์น์ฑ์ ๋ถ์ฌํฉ๋๋ค. ์ด๋ก ์ธํด ๋์ผํ ๋ฐฑ์คํ ํ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ์ ์ก์ด ๋์์ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋คํธ์ํฌ ์ํฉ์ ๋ ํผ์กํ์ง ์๊ฒ ๋ง๋ญ๋๋ค.
- ์์
์๋๋ ๋ฐฑ์คํ ์ ๋ต๊ณผ ์งํฐ๋ฅผ ํจ๊ป ์ ์ฉํ ์์ ์ฝ๋. ์ฝ๋๋ ๋จ์ํ ์์์ด๋ฏ๋ก ์ค์ ์ํฉ์ ๋ง๊ฒ ์กฐ์ ์ด ํ์ํ ์ ์๋ค.
import java.util.Random;
public class BackoffWithJitterExample {
public static void main(String[] args) {
int backoffTime = 1000; // ์ด๊ธฐ ๋ฐฑ์คํ ํ์ (1์ด)
Random random = new Random();
for (int attempt = 1; attempt <= 5; attempt++) {
System.out.println("Attempt #" + attempt);
// Simulate network collision
if (random.nextInt(100) < 50) {
System.out.println("Collision occurred");
// Apply backoff with jitter
int jitter = random.nextInt(backoffTime);
int waitTime = backoffTime + jitter;
System.out.println("Applying backoff with jitter: " + waitTime + " ms");
try {
Thread.sleep(waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("Data sent successfully");
break;
}
// Exponential backoff: double the backoff time for next attempt
backoffTime *= 2;
}
}
}
์ค๊ณ ์์ ์์ ์ฒ๋ฆฌ๋ฅผ ์ผ๋์ ๋์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ฐจ๋ผ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๋์ํ๋๋ก ๋๋๋ ํธ์ด ๋ซ๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ๋นจ๋ฆฌ ์คํจํ๊ธฐ๋ผ๊ณ ํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ํฌ๋์
- ์ ํ๋ฆฌ์ผ์ด์ ์ด "ํฌ๋์"ํ๋ค๋ ๊ฒ์ ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์์น ๋ชปํ ์ค๋ฅ ๋๋ ์์ธ ์ํฉ์ผ๋ก ์ธํด ์ ์์ ์ผ๋ก ์๋ํ์ง ์๊ณ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ ์ํฉ
- ๋นจ๋ฆฌ ์คํจํ๋ฉด ์ฌ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ฒํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์๋ค.
- ์คํจ ์ํฉ์ ์ ํํ๋ ๋ฐฉ์์ ์๊ฐํด์ผ ํ๋ฉฐ, ์ฝ๊ฒ ๋๋ฒ๊น ํ ์ ์๋๋ก ์๋ฌ ๊ด๋ จ ์ ๋ณด๋ ๋ฐ๋์ ํ์ธ์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ์ด๋ค ์น ์๋น์ค์ ์ฃผ๋ฌธ ์์ฑ ๊ธฐ๋ฅ์ ๊ฐ์ ํด๋ด ์๋ค. ์ด ๊ธฐ๋ฅ์ ์ฃผ๋ฌธ์ ์์ฑํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์์ ์ ์ํ ์ด ๋ ๋ฉฑ๋ฑ์ฑ์ ์์น์ ์งํค๋ฉด ์๋์ ๊ฐ์ ์ํฉ์์๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค
์์
- ์ฃผ๋ฌธ ์์ฑ ์๋ 1ํ: ์ฌ์ฉ์ A๊ฐ ์ํ X๋ฅผ ์ฃผ๋ฌธํ๋ ค๊ณ ํจ. ์ฃผ๋ฌธ์ด ์์ฑ๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋จ.
- ์ฃผ๋ฌธ ์์ฑ ์๋ 2ํ: ์ฌ์ฉ์ A๊ฐ ๋์ผํ ์ํ X๋ฅผ ๋ค์ ์ฃผ๋ฌธํ๋ ค๊ณ ํจ.
- ๋ฉฑ๋ฑ์ฑ์ ์งํจ๋ค๋ฉด ์ด ์์ ์ ์ด์ ์ ์ฃผ๋ฌธ์ด ์ด๋ฏธ ์์ฑ๋์์์ ๊ฐ์งํ๊ณ ๋์ผํ ์ฃผ๋ฌธ์ ์ค๋ณต ์์ฑํ์ง ์์์ผ ํจ.
- ์ฃผ๋ฌธ์ ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก ์๋ก์ด ์ฃผ๋ฌธ์ด ์์ฑ๋์ง ์์์ผ ํจ.
- ์ด๋ ๊ฒ ๋ฉฑ๋ฑ์ฑ์ ์งํค๋ ๊ฒ์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ์ค๋ณต ์์ฑ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋๋ค. ์ด์ ์ ์ฌํ๊ฒ ๋ค์ํ ์์ ์ด๋ API ํธ์ถ์์ ๋ฉฑ๋ฑ์ฑ์ ๊ณ ๋ คํ์ฌ ์ค๋ณต ์์ ์ด๋ ๋ฐ์ดํฐ ์ค๋ณต์ ๋ฐฉ์งํ ์ ์๋ค.
๋ฉฑ๋ฑ์ฑ์ด๋?
๋์ผํ ์์ ์ ์ฌ๋ฌ ๋ฒ ์คํํด๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋จ์ ๋งํ๋ค. ๋ชจ๋ ์์ ์ ๋ฉฑ๋ฑ ์์ ์ผ๋ก ๊ตฌํํ๋ฉด ์์คํ ์ํธ์์ฉ์ด ํจ์ฌ ํธํด์ง๋ฉฐ ์๋ฌ๋ ํ์ ํ ์ค์ด๋ ๋ค,
- ์๋ฅผ ๋ค์ด ์ด๋ค ๊ฐ์ ํด์์ ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฉฑ๋ฑ ์์ ์ด๋ค.
- ์ด์ ๋ ๋ช ๊ฐ์ ๊ฐ์ ์ง์ด๋๋์ง ํ๋๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์๊ฒฉ API๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ ์์ฒญ๋ง๋ค ์ ์ผํ ID๋ฅผ ์ง์ ํ๊ฒ ํ๋ฉด ๋ฉฑ๋ฑ์ฑ ๊ตฌํ ๊ฐ๋ฅ
- ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์๋ํ ๋ ์คํจํ ๊ฒ๊ณผ ๋์ผํ ์์ฒญ ID๋ฅผ ์ ๋ฌํ๋ฉด ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์๋ฒ๋ ์ด๋ฏธ ํด๋น ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ์๋ ํด๋น ์์ ์คํํ์ง ์๋๋ค.
๋ ์ด์ ํ์๋ก ํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ, ๋ฐ์ดํฐ ๊ตฌ์กฐ, ๋คํธ์ํฌ ์์ผ, ํ์ผ ํธ๋ค ๋ชจ๋ ํด์ ํ์.
- ์ด์์ฒด์ ๋ ํ์ผ ํธ๋ค๊ณผ ๋คํธ์ํฌ ์์ผ์ ์ํ ๊ณต๊ฐ์ด ์ ํด์ก๋๋ฐ ๊ฐ๋ ์ฐจ๋ฉด, ์๋ก ํธ๋ค, ์์ผ ๋ชจ๋ ์์ ์ด ์คํจํ๋ค.
- ๋คํธ์ํฌ ์์ผ์ด ๋์๋๋ฉด ๋ถํ์ํ ์ฐ๊ฒฐ์ ๊ณ์ ๋จ์์์ด ์ฐ๊ฒฐ ํ์ด ๊ฐ๋ ์ฐจ๊ฒ ๋๋ค.
- f.close๋ฅผ ์คํํ๊ธฐ ์ ์ฝ์ค ์คํ ์คํจ๋ก ํ์ผ ํฌ์ธํฐ๋ฅผ ๋ซ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ์ธ์ด๊ฐ ์๋ํด์ ๋ฅผ ์ง์ํ์ง ์๋๋ค๋ฉด
try/finally
๋ก ํ์ผ ํธ๋ค ์์ ํ๊ฒ ๋ซ๊ฒ ํด์ค์ผ ํจ
f = open(`foo.txt`, 'w')
#...
f.close()
- ํ๋ ๊ฐ๋ฐ ์ธ์ด๋ ์๋๋ฆฌ์์ค ํด์ ์ง์, rust๋
์๋ฉธ์ ๋ฉ์๋
๋ก, ํ์ด์ฌ์with ๊ตฌ๋ฌธ
with open('foo.txt') as f:
#...
๐ ๋ก๊ทธ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ์ฝ๋์ ์คํ์ ์ดํดํ๊ฑฐ๋ ์์ ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊น ํ ์ ์๋ ์ฝ๊ณ ํธ๋ฆฌํ ๋ฐฉ๋ฒ
์ฝ๋๋ฅผ ์ฝ๊ฒ ์ด์ํ๊ณ ๋๋ฒ๊ทธํ ์ ์๋๋ก ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ์. ๋ก๊ทธ ๋ ๋ฒจ์ ์ค์ ํด์ ์ด์์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๊ทธ ์ ์กฐ์ ํ ์ ์๊ฒ ํ์. ๋ก๊ทธ๋ ์์์ ์ด๊ณ ๋น ๋ฅด๋ฉฐ ์์ ํ๊ฒ ๋ค๋ค์ผ ํ๋ค.
- ๊ฐ๋ฐ ์ธ์ด๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํด ์ธ์ ์ด๋ค ๊ฒ์ ๋ก๊ทธ์ ๊ธฐ๋กํ ์ง ์ ์ดํ๋ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ๋ ์ ๊ตํ
๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ฅผ ๊ฐ์ถ๊ณ ์๋ค. - ์ด๋ฌํ ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๋ก๊ทธ ๋ ๋ฒจ์ ์ด์ฉํด ๋ก๊ทธ ์ ์กฐ์ ํ๊ฑฐ๋ ๋ก๊ทธ ํ์ ์ ์ด ๊ฐ๋ฅ
์ด ์ธ์๋ ๋ค์ํ ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ผ๋ฉฐ, ์ ํํ ๋ ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ๊ณผ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ณ ๋ คํ์ฌ ์ ์ ํ ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์
1. Log4j 2
- Apache Log4j 2๋ Java์ ๋ก๊น ํ๋ ์์ํฌ๋ก ๋งค์ฐ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ๋ก๊น ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๋ค์ํ ์ถ๋ ฅ ๋์์ผ๋ก ๋ผ์ฐํ ํ๊ณ , ๋ก๊น ๋ ๋ฒจ ๋ฐ ๋ก๊ทธ ํ์ ์ค์ ๋ฑ์ด ๊ฐ๋ฅํ๋ค.
2. SLF4J (Simple Logging Facade for Java)
- SLF4J๋ ๋ก๊น ํ๋ ์์ํฌ์ ์ถ์ ๊ณ์ธต์ผ๋ก, ๋ค์ํ ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
- ์ฃผ๋ก ๋ก๊ทธ API์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํด๋ ์ฝ๋ ์์ ์ ์ต์ํํ ์ ์์ผ๋ฉฐ, ์ค์ ๋ก SLF4J๋ฅผ ๊ตฌํํ๋ ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Logback์ ๋ง์ด ์ฌ์ฉํ๋ค.
**3. Logback **
- Logback์ SLF4J์ ๊ตฌํ์ฒด๋ก, Log4j์ ํ์ ์ ํ์ผ๋ก ๊ฐ๋ฐ๋ ๊ฒ์ผ๋ก Logback์ ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ผ๋ก๋ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ง๋ง, ๋ณต์กํ ์ค์ ๋ฐ ์ ์ฐํ ๋ก๊น ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
4. java.util.logging (JUL)
- ์๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋ ๋ก๊น ํ๋ ์์ํฌ๋ก, JUL์ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ํ์ํ์ง ์๋๋ค.
- ๊ธฐ๋ฅ์ ๊ฐ๋จํ์ง๋ง ๊ฐ๋ณ๊ณ ํ์คํ๋ ๋ก๊น ์ ์ํ ์ ํ์ง๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
5. Log4j 1
- Apache Log4j 1์ ๋ก๊น ํ๋ ์์ํฌ๋ก ์ ๋ช ํ๋ฉฐ ์์ ๋ถํฐ ๋ง์ด ์ฌ์ฉ๋์ด์์ผ๋ ํ์ฌ๋ Log4j 2์ ๋น๊ตํ์ฌ ์ ์ง๋ณด์ ๋ฐ ๋ณด์ ์ด์๋ก ์ธํด ์ฌ์ฉ์ด ๊ถ์ฅ๋์ง ์๋๋ค.
๋ก๊น ํ๋ ์์ํฌ๋ ์ด์์๊ฐ ์ค์๋์ ๋ฐ๋ผ ๋ฉ์ธ์ง๋ฅผ ํํฐ๋งํ ์ ์๋๋ก ๋ก๊ทธ ๋ ๋ฒจ์ ์ง์ํ๋ค.
- ์ด์์๊ฐ ๋ก๊ทธ ๋ ๋ฒจ์ ์ค์ ํ๋ฉด ์ค์ ํ ๋ ๋ฒจ๋ณด๋ค ์์ ๋ ๋ฒจ์ ๋ก๊ทธ๋ ๋ชจ๋ ๊ธฐ๋ก๋๋ ๋ฐ๋ฉด** ๊ทธ๋ณด๋ค ๋ฎ์ ๋ ๋ฒจ์ ๋ก๊ทธ๋ ๊ธฐ๋ก๋์ง ์๋๋ค.**
- ๋ก๊ทธ ๋ ๋ฒจ์ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ์์ธํ ๋๋ฒ๊น ๋ก๊ทธ๋ถํฐ ์ ์์ ์ธ ์ด์ ์ํฉ์์ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ธฐ๋ก๋๋ ๋ก๊ทธ๊น์ง, ์ฃผ์ด์ง ์ํฉ์ ๋ง์ถฐ์ ๋ก๊ทธ์ ์ ์กฐ์ ๊ฐ๋ฅ
์๋ฐ์ log4j.properties ํ์ผ์ ์ผ๋ถ๋ก์, ๋ฃจํธ์๋ ERROR ๋ ๋ฒจ์ ์์ธํ ๋ก๊ทธ ์ง์ ํ๊ณ com.foo.bar ํจํค์ง ๋ด์ ์ฝ๋์์๋ INFO ๋ ๋ฒจ์ ๋ก๊ทธ ์ง์
# ๋ฃจํธ ๋ก๊ฑฐ์๋ ERROR **ํ
์คํธ**๋ ๋ฒจ์ ์ง์ ํ๊ณ fout๋ผ๋ ์ด๋ฆ์ FileAppender๋ฅผ ์ฌ์ฉํ๋ค,
log4j.rootLogger = Error, fout
# com.foo.bar ํจํค์ง๋ INFO ๋ ๋ฒจ ์ง์
log4j.logger.com.foo.bar = INFO
- TRACE
์ ๋ฆฌํ์๋ฉด,
- ์์: ํน์ ๋ฉ์๋๋ ํจ์์ ํธ์ถ๊ณผ ๋ฐํ ๊ฐ์ ๋ก๊น ํ์ฌ ๋๋ฒ๊น ์ ํธ์ถ ํ๋ฆ์ ํ์ธํ ๋ ์ฌ์ฉ.
- ์ ์ฉ ๋ฐฉ๋ฒ: ๋ก๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ TRACE ๋ ๋ฒจ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์์ ์ด๋ ๋ฉ์๋์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ก๊น
- ํน์ ํจํค์ง๋ ํด๋์ค์๋ง ์ผ์ง๋ฉฐ ์ต๋ํ ์์ธํ ๋ด์ฉ์ ์ถ๋ ฅํ๋ ๋ ๋ฒจ
- ๊ฐ๋ฐ ํ๊ฒฝ ์ด์ธ์์๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๋ค.
- ์ค ๋จ์ ๋ก๊ทธ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ
- TRACE ๋ก๊ทธ ๋ ๋ฒจ์ ์์ฃผ ์ฌ์ฉํ๋ ํธ์ด๋ผ๋ฉด ๋ก๊ทธ ์ถ๋ ฅ ๋์ ,
๋๋ฒ๊ฑฐ
๋ฅผ ์ด์ฉํด ์ฝ๋์ ์คํ ๊ณผ์ ์ ํ์ธํ๋ ๊ฒ์ด ์ข๋ค
- DEBUG
์ ๋ฆฌํ์๋ฉด,
- ์์: ์ฌ์ฉ์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๊ฐ ๊ณผ์ ์ ๋ก๊น ํ์ฌ ๋๋ฒ๊น ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณผ์ ์ ํ์ธํ ๋ ์ฌ์ฉ.
- ์ ์ฉ ๋ฐฉ๋ฒ: ๋ก๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ DEBUG ๋ ๋ฒจ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ํ ์ํ ๋ณ๊ฒฝ ๋๋ ์ค๊ฐ ๊ณผ์ ์ ๋ก๊น
- ํ๋ก๋์ ์ํฉ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ ํฉํ ๋ ๋ฒจ์ด๋ค.
- ๋๋ฒ๊ทธ ๋ ๋ฒจ ๋ก๊น ์ ๋๋ฌด ๋ง์ด ์ฌ์ฉ ์ ๋๋ฒ๊น ํ ๋ ํ์ํ ์ ๋ณด๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์์ง๋ค.
- ์ด๋ฐ ๋ฉ์ธ์ง๋ TRACE ๋ ๋ฒจ๋ก ์ง์ ํ์.
- INFO
์ ๋ฆฌํ์๋ฉด,
- ์์: ์ ํ๋ฆฌ์ผ์ด์ ์ ์์๊ณผ ์ข ๋ฃ ์์ , ์๋น์ค ํฌํธ ์ค์ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ์ ๋ณด๋ฅผ ๋ก๊น ํ ๋ ์ฌ์ฉ.
- ์ ์ฉ ๋ฐฉ๋ฒ: ๋ก๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ INFO ๋ ๋ฒจ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ ๋ณด๋ฅผ ๋ก๊น
- ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ๋ํด ์์๋๋ฉด ์ข์ ๋งํ ์ ๋ณด๋ฅผ ์ํ ๋ ๋ฒจ์ด๋ค.
- ์ฆ ๋ฌธ์ ์ ์ ํ์ ํ๊ธฐ ์ํ ์ฉ๋๊ฐ ์๋๋ค.
- ๋ณดํต
์๋น์ค ์์
์ด๋5050๋ฒ ํฌํธ ์ฌ์ฉ
๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ฉ์ธ์ง๋ฅผ ์ด INFO ๋ ๋ฒจ๋ก ์ถ๋ ฅํ๋ค. - INFO๋ ๊ธฐ๋ณธ ๋ก๊ทธ ๋ ๋ฒจ์ด๋, ์์ํ ๋ด์ฉ์ ๊ธฐ๋กํ์ง ๋ง์.
๋ง์ฝ์ ์ํ
๋ก๊ทธ๋ TRACE๋ DEBUG๋ ๋ฒจ๋ก ์ถ๋ ฅํ์- INFO ๋ ๋ฒจ ๋ก๊ทธ๋ ์ ์์ ์ธ ์ด์ ์ํฉ์์ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
- ๋ฌ์คํธ์์ INFO ๋ ๋ฒจ ์ถ๋ ฅํ๋ ์์
์์ฒญ์ด ์คํจํ ์์ธ์ ์ ๋ฐํ ์๋ฌ๋ ํฌํจ๋์ด ์๋๋ฐ ๊ทธ๋ฐ๋ฐ๋ info ๋ ๋ฒจ์ ์ด ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋์ผ๋ก ์ฌ์๋ ํ๋ฏ๋ก ์ถ๊ฐ ๋์ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
info!("Failed request : {}, retrying", e);
- WARN
์ ๋ฆฌํ์๋ฉด,
- ์์: ์๋น์ค ๋ฆฌ์์ค๊ฐ ํ๊ณ์น์ ๋ค๋ค๋ฅธ ์ํฉ์ด๋ ์์์น ๋ชปํ ๋์์ ๋ก๊น ํ์ฌ ๊ฒฝ๊ณ ํ ๋ ์ฌ์ฉ.
- ์ ์ฉ ๋ฐฉ๋ฒ: ๋ก๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ WARN ๋ ๋ฒจ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๊ณ ํ ๋งํ ์ํฉ์ ๋ก๊น
- ์ ์ฌ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ๋ ๋งํ ์ํฉ์ ๋ํ ๋ฉ์ธ์ง ์ถ๋ ฅ์ ์ํ ๋ ๋ฒจ
- ์ด๋ค
๋ฆฌ์์ค๊ฐ ํ๊ณ์น์ ๋ค๋ค๋ฅด๊ณ ์๋ค๋ฉด
๊ฒฝ๊ณ ๋ฉ์ธ์ง ์ถ๋ ฅํ๊ธฐ ์ ํฉ - WARN ๋ ๋ฒจ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅ ํ ๋๋ ๊ทธ ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ์ฌ๋์ด ์ทจํด์ผ ํ ๊ตฌ์ฒด์ ์ธ ๋์์ด ์์ด์ผ ํ๋ฉฐ, ์๋ค๋ฉด INFO๋ ๋ฒจ๋ก ์ฎ๊ธฐ์
- ERROR
์ ๋ฆฌํ์๋ฉด,
- ์์: ์์ธ ๋ฐ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์คํจ ๋ฑ ์ค๋ฅ ์ํฉ์ ๋ํ ์ ๋ณด๋ฅผ ๋ก๊น ํ ๋ ์ฌ์ฉ.
- ์ ์ฉ ๋ฐฉ๋ฒ: ๋ก๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ERROR ๋ ๋ฒจ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ ์ํฉ์ ๋ํ ์ ๋ณด ๋ฐ ์คํ ํธ๋ ์ด์ค ๋ฑ์ ๋ก๊น ํฉ๋๋ค.
- ์ดํด๋ด์ผ ํ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ํ ๋ ๋ฒจ
- ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ธฐ๋ก ์์ ์ด ์คํจํ๋ฉด ๋์ฒด๋ก ERROR ๋ ๋ฒจ ๋ก๊ทธ์ ๊ธฐ๋ก
- ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด ์ ๊ณต
- ๊ด๋ จ ์คํ ์ถ๊ฐ์ ๊ณผ ์ํํธ์จ์ด๊ฐ ์คํ๋ ๊ฒฐ๊ณผ ๋ฑ ์์ธํ ๋ด์ฉ ๋ช ํํ๊ฒ ๊ธฐ๋ก
- FATAL
- ๊ฐ์ฅ ์ํํ ์์ค์ ๋ฉ์ธ์ง ์ถ๋ ฅํ๊ธฐ ์ํ ๋ ๋ฒจ -** ํ๋ก๊ทธ๋จ์ด ์ฌ๊ฐํ ์ํฉ์ ๋ง๋ฅ๋จ๋ ค ์ฆ์ ์ข ๋ฃ์์ผ์ผ ํ๋ค๋ฉด** ๊ทธ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์์ธ์ FATAL ๋ ๋ฒจ ๋ก๊ทธ ๊ธฐ๋ก
- ๋ณต๊ตฌ ์ง์ ์ด๋ ๋ถ์ ๊ด๋ จ ๋ฐ์ดํฐ ํ๋ก๊ทธ๋จ ์ํ ๊ด๋ จ๋ ์ปจํ ์คํธ๋ ๋ฐ๋์ ๊ธฐ๋ก
1. ๋ฉ์๋ ํธ์ถ์ ํตํ ๋ก๊ทธ ๋ ๋ฒจ ์ง์
SLF4J์ Logback์ ์ฌ์ฉํ ๋๋ ๋ก๊ทธ ๋ ๋ฒจ์ ์ง์ ํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. SLF4J์ ๋ก๊ฑฐ(Logger) ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์จ ํ ํด๋น ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ์ ์๋ค. ๋ฉ์๋์๋ ๋ก๊ทธ ๋ ๋ฒจ์ ์ง์ ํ๋ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ค.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
public void myMethod() {
logger.trace("This is a trace level log.");
logger.debug("This is a debug level log.");
logger.info("This is an info level log.");
logger.warn("This is a warn level log.");
logger.error("This is an error level log.");
}
}
2. ์ค์ ํ์ผ์ ํตํ ๋ก๊ทธ ๋ ๋ฒจ ์ง์
Logback์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ logback.xml ๋๋ logback.groovy ์ค์ ํ์ผ์ ํตํด ๋ก๊ทธ ๋ ๋ฒจ์ ์ง์ ํ ์ ์๋ค. ์ค์ ํ์ผ์์๋ ๋ค์ํ ๋ก๊ทธ ๋ ๋ฒจ์ ๊ฐ๊ฐ์ ๋ก๊ทธ ์ถ๋ ฅ ๋์์ ์ง์ ํ ์ ์๋ค.
<!-- logback.xml -->
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
์์์ ์ผ๋ก ์์ฑํ์
๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ์์ ๋งค์ฐ ์ค์ํ ์์น ์ค ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด ์์น์ ์์ ์ด ๋ ์์ ์กฐ๊ฐ์ผ๋ก ๋ถํด๋๊ฑฐ๋ ์ค๊ฐ์ ์ค๋จ๋์ง ์๊ณ ์์ ํ ์คํ๋๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์ฌ๊ธฐ์
์์์
์ด๋ ์์ ์ด ๋ ์ด์ ๋๋ ์ ์๋ ์ต์ ๋จ์ - ์ด ๋จ์์์ ์์ ์ ๋ ์ด์ ๋ถํด๋๊ฑฐ๋ ์ค๋จ๋ ์ ์์ด์ผ ํ๋ค. ์์์ ์์ ์ ๋ค์ ๋ ๊ฐ์ง ํน์ฑ
๋ถํด ๋ถ๊ฐ๋ฅ(Indivisible)
: ์์์ ์์ ์ ๋ ์์ ๋จ์๋ก ๋๋ ์ ์์ด์ผ ํ๋ค. ์์ ์ ๊ตฌ์ฑํ๋ ๊ฐ ๋จ๊ณ๋ ๋ถํด๋๊ฑฐ๋ ์ฌ์ ์๋์ง ์๊ณ ์คํ๋์ด์ผ ํ๋ค.์ค๋จ ๋ถ๊ฐ๋ฅ(Undivisible)
: ์์์ ์์ ์ ์ค๊ฐ์ ์ค๋จ๋์ง ์๊ณ ์์ ํ ์คํ๋์ด์ผ ํ๋ค. ๋ง์ฝ ์์ ์ ์ผ๋ถ๋ง ์คํ๋๊ณ ์ค๋จ๋๋ฉด ์ผ๊ด์ฑ๊ณผ ์ ํฉ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ก๊ทธ๋ฅผ ์์์ ์ผ๋ก ์์ฑํ๋ค๋ ๊ฒ์ ๋ก๊ทธ ๋ฉ์์ง๊ฐ ํ ๋ฒ ์์ฑ๋๋ฉด ๋ถํด๋๊ฑฐ๋ ์ค๋จ๋์ง ์๊ณ ์์ ํ ๊ธฐ๋ก๋์ด์ผ ํ๋ค๋ ์๋ฏธ
- ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ฐ์์ ์ผ๋ก ์์ฑํ ๋ ๊ฐ ๋ก๊ทธ ๋ฉ์์ง๊ฐ ์์๋๋ก ๊ธฐ๋ก๋๋ ๊ฒ์ ๋ณด์ฅํ๊ณ , ์ค๊ฐ์ ์์ ์ด ์ค๋จ๋๊ฑฐ๋ ๋๋ฝ๋์ง ์๋๋ก ํด์ผ ํ๋ค. ์ด๋ฅผ ํตํด ๋ก๊ทธ๋ฅผ ํตํด ์์คํ ์ํ๋ ์ด๋ฒคํธ์ ๋ํ ์ ํํ๊ณ ์ผ๊ด๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
- ํ ๋ฉ์ธ์ง์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์์ ์ผ๋ก ์ ์ฅํ์.
- ๋ก๊ทธ ์์ง๊ธฐ๋ ๊ด๋ จ ์ ๋ณด๋ฅผ ํ ์ค์ ํํํ๋ ๋ก๊ทธ๋ฅผ ๋ ์ ์ฒ๋ฆฌ
but, ํน์ ์์๋๋ก ๋ณด์ด์ง ์์ ์ ์์ผ๋ฉฐ, ๋ก๊ทธ ์ ๋ ฌ ์ ์์คํ ์๊ฐ์ ์์กดํ์ง๋ง์. ์์คํ ์๊ฐ์ ๋ฆฌ์ ๋๊ฑฐ๋ ํธ์คํธ ๋ง๋ค ์กฐ๊ธ์ฉ ๋ค๋ฅผ ์ ์์
- ๋ก๊ทธ ๋ฉ์ธ์ง์ ์ค๋ฐ๊ฟ ๋ฌธ์๋ ํผํ์ => ํนํ WARNING ๋ก๊ทธ์ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๋ฉ์ธ์ง์ ํผํฉ์ด ๋๊ธฐ ๋๋ฌธ์ ํ ์ค๋ก ์ถ๋ ฅ ๋ถ๊ฐํ๋ค๋ฉด ๊ณ ์ ํ ID๋ฅผ ํฌํจ์์ผ ๋์ค์ ์ฐ๊ฒฐํ ์ ์๊ฒ ํ์.
๋ก๊ทธ๋ฅผ ๋๋ฌด ๊ธฐ๋กํ๋ฉด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ค. ๋ก๊ทธ๋ ๋์คํฌ๋ ์ฝ์, ์๊ฒฉ ์์คํ ๋ฑ ์ด๋๊ฐ์ ๋ฐ๋์ ๊ธฐ๋ก๋์ด์ผ ํ๋ฉฐ, ๊ธฐ๋ก๋๊ธฐ ์ ํ ๋ฌธ์์ด๋ก ๊ฒฐํฉํด์ผ ํ๋ค.
๋งค์ฐ ๋๋ฆฌ๊ฒ ์งํ๋๋ฉฐ, ์ฑ๋ฅ์ด ์ค์ํ ๋ฃจํ์ ์ ์ํฅ์ ๋ฏธ์น๋ค,
- ๊ฒฐํฉ์ ์๋ํ๋ ๋ฌธ์์ด์ด ๋ก๊ทธ ๋ฉ์๋์ ์ ๋ฌ๋๋ฉด ๋ก๊ทธ ๋ ๋ฒจ๊ณผ ์๊ด ์์ด ๊ฒฐํฉ ์คํ ์ด์ : ์๋์ ์ธ์๋ ๋ฉ์๋์ ์ ๋ฌ๊ธฐ ์์ ํ๊ฐ๊ฐ ์ด๋ค์ง๊ธฐ ๋๋ฌธ
- ํ๋ ์์ํฌ๊ฐ ์ง์ํ๋ค๋ฉด, ํ๋ผ๋ฏธํฐํ ๋ก๊น ์ ์ฌ์ฉํ์
- JAVA์ ๋ก๊ทธ ํธ์ถ ์ ๋ฌธ์์ด ๊ฒฐํฉ ๋ฐฉ๋ฒ 3๊ฐ์ง
while(message.size() > 0){
Message m = message.poll();
// ์ด ๋ฌธ์์ด์ trace ๋ ๋ฒจ์ด ๋นํ์ฑํ๋ผ ์์ด๋ ๊ฒฐํฉ์ด ์คํ
log.trace("got message: "+m);
// ์ด ๋ฌธ์์ด ์ญ์ trace ๋ ๋ฒจ์ด ๋นํ์ฑํ๋ผ ์์ด๋ ๊ฒฐํฉ์ด ์คํ
log.trace("got message : {}".format(m));
// ์ด ๋ฌธ์์ด์ trace ๋ ๋ฒจ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ์๋ง ๊ฒฐํฉ์ ์คํํ๋ฏ๋ก ๋ ๋น ๋ฅด๋ค. => ํ๋ผ๋ฏธํฐํ // ๋ก๊น
log.trace("got message : {}", m);
}
๋ก๊ทธ ๋ฉ์์ง์ ๋ด์ฉ์ ๋์ ์ผ๋ก ์์ฑํ๊ณ ๋ก๊น ํ๋ ๊ธฐ๋ฒ,** ์ด๋ฅผ ํตํด ๋ก๊ทธ ๋ฉ์์ง์ ๋ณ์๋ ๋ฐ์ดํฐ ๊ฐ์ ์ฝ๊ฒ ํฌํจ์ํฌ ์ ์๋ค.** ํ๋ผ๋ฏธํฐํ ๋ก๊น ์ ๋ก๊ทธ ๋ฉ์์ง์ ๋ณ์๋ฅผ ์ง์ ๊ฒฐํฉํ๋ ๋์ , ๋ณ์ ๊ฐ์ ํฌํจํ ์์น๋ฅผ ์ง์ ํ๊ณ ์ค์ ๊ฐ์ ๋ก๊น ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ์ฌ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์์ฑํ๋ค.
- ์ฅ์
- ๊ฐ๋ ์ฑ ํฅ์: ๋ก๊ทธ ๋ฉ์์ง ๋ด์ ๋ณ์ ๊ฐ์ ์ง์ ๊ฒฐํฉํ๋ ๋์ ๋ณ์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋ฏ๋ก ๋ก๊ทธ ๋ฉ์์ง๊ฐ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ๋ช ํํด์ง๋ค.
- ๋์ ๋ก๊น : ๋ก๊ทธ ๋ฉ์์ง์ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๋ณ์ ๊ฐ์ ํฌํจํ ์ ์๋ค. ์ด๋ฅผ ํตํด ํน์ ์ด๋ฒคํธ์ ์ํฉ์ ๋ง๋ ๋ณ์ ๊ฐ์ ๋ก๊ทธ๋ก ๋จ๊ธธ ์ ์๋ค.
- ๋ณด์ ๊ฐํ: ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ธธ ๋, ๊ฐ์ ์ง์ ๋ ธ์ถํ๋ ๋์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋ฉด ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋ก๊ทธ ํ์ผ์ ๋จ์ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggingExample {
private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);
public static void main(String[] args) {
String username = "john_doe";
int userId = 123;
// ํ๋ผ๋ฏธํฐํ ๋ก๊น
logger.info("User {} with ID {} logged in", username, userId);
}
}
์ดํ๋๋ ๋ก๊น ์์คํ ์์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ด๋์ ๊ธฐ๋กํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ญํ ์ ํ๋ ์์๋ก ๋ก๊ทธ ๋ฉ์์ง๋ ์ดํ๋๋ฅผ ํตํด ํน์ ํ ์ถ๋ ฅ ๋์์ ๊ธฐ๋ก๋๊ฒ ๋๋ค. ๋ณดํต ์ดํ๋๋ ๋ก๊ทธ๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๊ฑฐ๋ ํ์ผ์ ๊ธฐ๋กํ๋ ๋ฑ์ ์ญํ ์ ์ํํ๋ค.
๋ก๊น ์์คํ ์์ ์ดํ๋๋ ๋ก๊ทธ ์ถ๋ ฅ์ ๋์๊ณผ ํ์์ ์ง์ ํ๋ ์ญํ ์ ํ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ๋ ๋ก๊ทธ ์ดํ๋๋ print ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ์ถ์์ ์ค๋ ๋์์ ์คํ
๋น๋๊ธฐ ์ดํ๋
ํ์ฌ ์คํ ์ค์ธ ์ดํ๋๋ ํ์ฌ ์คํ ์ค์ธ ์ค๋ ๋๋ฅผ ๋ธ๋กํ์ง ์๊ณ ๋ฉ์ธ์ง๋ฅผ ๊ธฐ๋กํ๋ค.
๋น๋๊ธฐ ์ดํ๋์ ์๋์๋ฆฌ
- ๋ก๊ทธ ๋ฉ์์ง๋ ๋ฉ์ธ ์ค๋ ๋์์ ๋น๋๊ธฐ ์ดํ๋์๊ฒ ์ ๋ฌ
๋น๋๊ธฐ ์ดํ๋
๋ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๋ก๊ทธ ํ(๋๋ ๋ฒํผ)์ ์ ์ฅํ๋ค. ์ด๋ ํ๋ ๋ณ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๊ด๋ฆฌ๋๋ค.๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋
๋ ๋ก๊ทธ ํ์ ์ ์ฅ๋ ๋ฉ์์ง๋ฅผ ์ค์ ์ถ๋ ฅ ๋์(์ฝ์, ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ)์ผ๋ก ์ ๋ฌํ๋ฉฐ, ์ด ์์ ์ ๋ฉ์ธ ์ค๋ ๋์ ์์ ๊ณผ ๋ณ๊ฐ๋ก ์ฒ๋ฆฌ๋๋ค.- ์ด๋ฅผ ํตํด ๋ฉ์ธ ์ค๋ ๋๋ ๋ก๊ทธ ์ถ๋ ฅ ์์ ์ ๋ํ ์ง์ฐ์ ๊ฒช์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ๊ณ์ ์ํํ ์ ์๋ค.
์ฅ์
- ๋ก๊ทธ ์ถ๋ ฅ ์์ ์ ์ง์ฐ์ด ๋ฐ์ํด๋ ๋ฉ์ธ ์ค๋ ๋์ ์ฑ๋ฅ์ ์ํฅ์ ๋ ์ค๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๋ก๊ทธ ์ถ๋ ฅ ์์ ์ ๊ด๋ฆฌํ๋ฏ๋ก, ๋ก๊น ์์ ์ผ๋ก ์ธํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์ถค ํ์์ ๋ฐฉ์งํ ์ ์๋ค.
- ๋ก๊ทธ ์ถ๋ ฅ ์์ ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
์ผ๊ด ์ดํ๋
๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๋์คํฌ์ ๊ธฐ๋กํ๊ธฐ ์์ ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ดํ๋ค. ์ฐ๊ธฐ ์ฒ๋ฆฌ๋ ์ญ์ ์ฆ๊ฐํ๋ค.
- ์ด์์ฒด์ ์ ํ์ด์ง ์บ์ ์ญ์ ๋ฒํผ์ฒ๋ผ ๋์ํด์ ๋ก๊ทธ ์ฒ๋ฆฌ๋์ ํฅ์ํ๋๋ฐ ๋์์ด ๋๋ค.
- ๋น๋๊ธฐ์ ์ผ๊ด์ฐ๊ธฐ๋ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๋์๊ฐ ๋ฐ์ํ๋ช ๋ก๊ทธ ๋ฉ์ธ์ง๊ฐ ๊ธฐ๋ก๋์ง ์๋ ์ผ๋ ์๊ธด๋ค.
๋น์ฐํ ์๊ธฐ๊ฐ์ง๋ง ํํ ์ค์ ํ๋ ๋ถ๋ถ์ผ๋ก URL์ด๋ HTTP ์๋ต์ ์๋ฌด ์๊ฐ ์์ด ๋ก๊ทธ์ ๊ธฐ๋กํ๋ฉด ์์ ์ฅ์น๊ฐ ์๋ ๋ก๊ทธ ์ซ์ง๊ธฐ๋ ์์นซ ๊ฐ์ธ์ ๋ณด ๋ ธ์ถ ๋ ์ ์๋ค.