2022. 5. 31. 00:41ใBackend/๐ฟ Spring
์ค๋ ๋ ๋ก์ปฌ
์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๊ฐ ์กด์ฌํ ๋, ํด๋น ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๋ ํน๋ณํ ์ ์ฅ์๋ฅผ ์๋ฏธํ๋ค. ๋ ํ์ด์ ์ด์ผ๊ธฐ ํด๋ณด์. ๋ง์ฝ ์๋ก ๋ค๋ฅธ ๋ ์ค๋ ๋๊ฐ ํ๋์ ๋ณ์์ ์ ๊ทผํ๋ค๊ณ ํ ๋, ์ด ๋ณ์๋ ๊ณต์ ์์์ผ๋ก ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ค๋ถํ๋ค. ThreadLocal ํด๋์ค๋ ์ค์ง ํ ์ค๋ ๋์ ์ํด ์ฝ๊ณ /์ฐ์ฌ์ง ์ ์๋ ๋ณ์๋ฅผ ์์ฑํ๋ค.
๊ฐ๋ น Thread A ๊ฐ ThreadLocal ๋ณ์( tLocal ) ์ ์ ๊ทผํ์ฌ a ๋ผ๋ ๋ฌธ์๋ฅผ ์ ์ฅํ๋ค๊ณ ํ์. ๋์์ Thread B ์์ ๋ง์ฐฌ๊ฐ์ง๋ก tLocal ๋ณ์์ ์ ๊ทผํ์ฌ, b ๋ผ๋ ๋ฌธ์๊ฐ์ ์ ์ฅํ๋ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? a ๋ผ๋ ๋ฌธ์๋ฅผ b ๊ฐ ๋ฎ์ด ๋ฒ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ์๋ ์ฒ๋ผ ๊ฐ ์ค๋ ๋๋ณ ์ ์ฉ ์ ์ฅ์์ ๊ฐ๊ฐ์ ๊ฐ์ด ์ ์ฅ๋๋ค. ์ฆ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณต์ ์์์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ค๋ ๋ ๋ก์ปฌ ๋ผ์ดํ ์ฌ์ดํด
์ค๋ ๋ ๋ก์ปฌ ์์ฑ
ThreadLocal<String> threadLocal = new ThreadLocal<>();
์ ๋ค๋ฆญ์ ์ฌ์ฉํ์ฌ ํ์ ์ง์ ํ ์ ์๋ค. ์ฐ์ String ์ผ๋ก ์ง์ ํด๋ณด์.
์ค๋ ๋ ๋ก์ปฌ ์ฐ๊ธฐ/์ฝ๊ธฐ
threadLocal.set("a") // thread local ๊ฐ ์ ์ฅ
threadLocal.get() // ์ ์ฅ๋ ๊ฐ ๋ถ๋ฌ์ค๊ธฐ
์ ์ธ๋ threadLocal ๋ณ์์ set(), get() ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ค๋ ๋๋ก์ปฌ ๊ฐ์ ์ฐ๊ณ ์ฝ์ ์ ์๋ค.
์๋ฌด ๊ฐ๋ ์ ์ฅ๋์ง ์์ ์ค๋ ๋๋ก์ปฌ์ ๊ฐ์ ์ฝ์ผ๋ฉด(get()) null ์ ๋ฐํํ๋ค.
@Slf4j
public class ThreadLocalServiceTest {
private ThreadLocal<String> threadLocal = new ThreadLocal<>();
@Test
void field() {
Runnable userC = () -> {
log.info("start");
String value = threadLocal.get();
log.info("value : {}", value);
log.info("set threadLocal value : A");
threadLocal.set("A");
value = threadLocal.get();
log.info("threadLocal : {}", value);
};
Thread threadC = new Thread(userC);
threadC.setName("thread-C");
threadC.start();
}
}
์ค๋ ๋ ๋ก์ปฌ ๊ฐ ์ ๊ฑฐ
์ค๋ ๋๋ก์ปฌ์ ๋ชจ๋ ์ฌ์ฉํ๊ณ ๋๋ฉด ๋ฐ๋์ ThreadLocal.remove()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ, ์ค๋ ๋ ๋ก์ปฌ์ ์ ์ฅ๋ ๊ฐ์ ์ ๊ฑฐํด์ผ ํ๋ค.
์ค๋ ๋ ๋ก์ปฌ์ ๊ฐ์ ์ ๊ฑฐํ์ง ์์ผ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ค์ ์ผ์ด์ค๋ฅผ ํ์ธํด๋ณด์.
1. ์ฌ์ฉ์ A ๊ฐ ์ ์ฅ HTTP ์์ฒญ์ ๋ณด๋ธ๋ค.
2. WAS ๋ ์ค๋ ๋ํ์์ ์ค๋ ๋๋ฅผ ํ๋ ์กฐํํ๋ค.
3. ํด๋น ์ค๋ ๋๋ thread-A ๊ฐ ํ ๋น ๋์๊ณ , ์ฌ์ฉ์ A ์ ๋ฐ์ดํฐ๋ฅผ ์ค๋ ๋ ๋ก์ปฌ์ ์ ์ฅํ๋ค.
4. ์ค๋ ๋ ๋ก์ปฌ thread-A ์ ์ฉ ๋ณด๊ด์์ ์ฌ์ฉ์A ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ค.
5. ์ฌ์ฉ์ A ์ HTTP ์์ฒญ์ด ์ข ๋ฃ๋๋ฉด, thread-A ๋ ๋ค์ ์ค๋ ๋ ํ์ ๋ฐํ๋๋ค.
6. thread-A ๋ ์ค๋ ๋ ํ์ ํตํด์ ์ฌ์ฌ์ฉ ๋ ์ ์๋ค.
1. ์ฌ์ฉ์ B ์์ HTTP ์กฐํ ์์ฒญ์ ๋ณด๋ธ๋ค.
2. ์ค๋ ๋ ํ์์ ํํ thread-A ๊ฐ ํ ๋น๋์๋ค.
3. ์กฐํ ์์ฒญ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ ํ์ thread-A ์ ์ฉ ๊ณต๊ฐ์์, ์ด์ ์ ์ ์ฅํด๋ ๊ฐ์ด ์กฐํ๋๋ค.
4. ์ฆ ์ฌ์ฉ์ B ๊ฐ ์์ํ ์กฐํ ๊ฒฐ๊ณผ๊ฐ ์๋, ์ฌ์ฉ์ A ๊ฐ ์ ์ฅํด๋ ๊ฐ์ด ์กฐํ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฌ์ฉ์ A ์ ์์ฒญ์ด ๋๋ ๋ ์ฐ๋ ๋ ๋ก์ปฌ์ ๊ฐ์ ThreadLocal.remove() ๋ฅผ ํตํด์ ๊ผญ ์ ๊ฑฐํด์ผ ํ๋ค.
์๋ฃ ์ถ์ฒ : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8