Coding Planet

ThreadLocal๊ณผ ThreadLocalUtil ๋ณธ๋ฌธ

๐Ÿ’ป Java Study/Java ์ด๋ก  ์ •๋ฆฌ

ThreadLocal๊ณผ ThreadLocalUtil

jhj.sharon 2024. 2. 28. 17:11
๋ฐ˜์‘ํ˜•

 

 

|ThreadLocal์ด๋ž€

ThreadLocal์€ Java์˜ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋ณ€์ˆ˜๋“ค์€ ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์—์„œ ๊ด€๋ฆฌ๋˜์—ˆ๋Š”๋ฐ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ์ €์žฅ๋˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฆ‰, ํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์„ค์ •ํ•œ ThreadLocal ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์™€ ๊ณต์œ ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์ž์‹ ๋งŒ์˜ ๋…

๋ฆฝ์ ์ธ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ฒฉ๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ ธ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ(thread-safety)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋” ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด threadLocal๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๊ณ  ๊ฐ ๊ฐ’์€ get(), set() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

**thread-safety

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

 

 

 

|ThreadLocal ์˜ˆ์‹œ

public class ThreadLocalExample {

    // ThreadLocal ๋ณ€์ˆ˜ ์ •์˜
    private static ThreadLocal<String> threadLocal1 = new ThreadLocal<>();
    private static ThreadLocal<String> threadLocal2 = new ThreadLocal<>();

    public static void main(String[] args) {
        // ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ์—์„œ ThreadLocal ๋ณ€์ˆ˜์— ๊ฐ’ ํ• ๋‹น
        Thread thread1 = new Thread(() -> {
            threadLocal1.set("Value 1 from Thread 1");
            threadLocal2.set("Value 2 from Thread 1");

            System.out.println("Thread 1 - ThreadLocal1: " + threadLocal1.get());
            System.out.println("Thread 1 - ThreadLocal2: " + threadLocal2.get());
        });

        // ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ์—์„œ ThreadLocal ๋ณ€์ˆ˜์— ๊ฐ’ ํ• ๋‹น
        Thread thread2 = new Thread(() -> {
            threadLocal1.set("Value 1 from Thread 2");
            threadLocal2.set("Value 2 from Thread 2");

            // ์ž ์‹œ ๋Œ€๊ธฐํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  ๋‚˜์„œ ์ถœ๋ ฅํ•˜๋„๋ก ํ•จ
            try {
                Thread.sleep(100); // 100ms ๋Œ€๊ธฐ
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("Thread 2 - ThreadLocal1: " + threadLocal1.get());
            System.out.println("Thread 2 - ThreadLocal2: " + threadLocal2.get());
        });

        // ์Šค๋ ˆ๋“œ ์‹œ์ž‘
        thread1.start();
        thread2.start();
    }
}

 

๊ฐ ์“ฐ๋ ˆ๋“œ์˜ ๋™์ผํ•œ ๋ณ€์ˆ˜๋ช…์—(threadLocal1, threadLocal2) ๊ฐ’์„ ์ง€์ •ํ–ˆ๋‹ค. ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(์Šค๋ ˆ๋“œ ์Šค์ผ€์ฅด๋Ÿฌ์— ๋”ฐ๋ผ ์‹ค์ œ๋Š” ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.)

 

 

์ด ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” thread1๊ณผ thread2๊ฐ€ ๊ฐ๊ฐ ThreadLocal1๊ณผ ThreadLocal2์— ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์ด ๊ฐ’๋“ค์ด ์Šค๋ ˆ๋“œ ๊ฐ„์— ๋…๋ฆฝ์ ์ž„์„ ๋ณด์—ฌ์ค€๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ์ด ์„ค์ •ํ•œ ThreadLocal ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ ๊ฐ’์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

 

 

 

|ThreadLocal ์ž‘๋™์›๋ฆฌ - set(), get()

ThreadLocal์˜ set() ๊ตฌํ˜„์›๋ฆฌ๋Š” ๋‹ค์Œ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.

    public void set(T value) {
        Thread currentThread = Thread.currentThread();
        ThreadLocalMap map = getMap(currentThread);
        if (map != null) {
            map.set(this, value);
        } else {
            createMap(currentThread, value);
        }
    }
    
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
}

 

> set () ๊ตฌํ˜„์›๋ฆฌ

  1. ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ ThreadLocalMap์„ ์–ป๋Š”๋‹ค. ThreadLocalMap์€ ThreadLocal ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋œ ๋งต์ด๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ThreadLocalMap์ด ์•„์ง ์—†์œผ๋ฉด, ์ƒˆ๋กœ์šด ThreadLocalMap์„ ์ƒ์„ฑํ•˜๊ณ  ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ํ• ๋‹นํ•œ๋‹ค.
  2. ์–ป์–ด์ง„ ThreadLocalMap์— ํ˜„์žฌ ThreadLocal ์ธ์Šคํ„ด์Šค๋ฅผ ํ‚ค๋กœ ํ•˜์—ฌ, set ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ๋งŒ์•ฝ ์ด ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ์ด๋ฏธ ๋งต์— ์กด์žฌํ•œ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋œ๋‹ค.

 

> get() ๊ตฌํ˜„์›๋ฆฌ

 

  1. ํ˜„์žฌ ์Šค๋ ˆ๋“œ ํš๋“: Thread.currentThread()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ํš๋“ํ•œ๋‹ค.
  2. ์Šค๋ ˆ๋“œ๋ณ„ ์ €์žฅ์†Œ ์กฐํšŒ: getMap(t)๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋œ ThreadLocalMap ์ธ์Šคํ„ด์Šค๋ฅผ ์กฐํšŒํ•œ๋‹ค. 
  3. ๊ฐ’ ์กฐํšŒ:
    • ThreadLocalMap์ด ์กด์žฌํ•œ๋‹ค๋ฉด, map.getEntry(this)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ˜„์žฌ ThreadLocal ๊ฐ์ฒด(this)์— ๋Œ€ํ•œ ์ €์žฅ๋œ ๊ฐ’์„ ํฌํ•จํ•˜๋Š” Entry ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•œ๋‹ค. ์ด๋•Œ, this๋Š” ํ˜„์žฌ ThreadLocal ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
    • Entry ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ์ด ๊ฐ์ฒด์˜ value ํ•„๋“œ์—์„œ ์‹ค์ œ ์ €์žฅ๋œ ๊ฐ’์„ ์กฐํšŒํ•œ๋‹ค. Entry ๊ฐ์ฒด๋Š” ThreadLocalMap ๋‚ด๋ถ€์—์„œ ThreadLocal ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค.
  4. ๊ฐ’ ๋ฐ˜ํ™˜:
    • ์กฐํšŒํ•œ ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด, ์ด ๊ฐ’์„ ์บ์ŠคํŒ…ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ @SuppressWarnings("unchecked") ์• ๋„ˆํ…Œ์ด์…˜์€ ์ด ์บ์ŠคํŒ… ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ์•ˆ์ •์„ฑ ๊ฒฝ๊ณ ๋ฅผ ์–ต์ œํ•œ๋‹ค.
    • ๋งŒ์•ฝ ThreadLocalMap์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ˜„์žฌ ThreadLocal ๊ฐ์ฒด์— ๋Œ€ํ•œ Entry๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ(null์ธ ๊ฒฝ์šฐ), setInitialValue() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ThreadLocal ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ์ด ์ดˆ๊ธฐ๊ฐ’์€ ThreadLocal์˜ initialValue() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ๊ตฌํ˜„์€ null์„ ๋ฐ˜ํ™˜๋‹ค.

 

 

|ThreadLocalUtil์ด๋ž€

ThreadLocalUtil์€ ์ž๋ฐ”์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์ด๋ฆ„์œผ๋กœ. threadlocal์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์•ž ์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ threadlocal์€ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ทธ ์Šค๋ ˆ๋“œ ๋‚ด๋ถ€์—์„œ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•ด์ฃผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

ThreadLocalUtil์˜ ์ฃผ์š”๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์Šค๋ ˆ๋“œ๋ณ„ ๋ฐ์ดํ„ฐ ์ €์žฅ๊ณผ ์ ‘๊ทผ: ThreadLocalUtil์„ ํ†ตํ•ด ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋†’์ธ๋‹ค.
  • ์‚ฌ์šฉ์ž ์„ธ์…˜ ๊ด€๋ฆฌ: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋‚˜ ์ธ์ฆ ์ •๋ณด์™€ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ThreadLocal์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž„์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ: ๊ณ„์‚ฐ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋‚˜ ๋ฉ”์„œ๋“œ ๊ฐ„์— ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์šฉ๋„๋กœ ThreadLocalUtil์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

|ThreadLocalUtil ์˜ˆ์‹œ

์•„๋ž˜๋Š” ThreadLocalUtil ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ์‚ฌ์šฉ์ž ์•„์ด๋””๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์ด๋‹ค.

ThreadLocalUtil ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉ์ž ID๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ•„์š”ํ• ๋•Œ๋งˆ๋‹ค ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์Šค๋ ˆ๋“œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด clear() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ด์•ผํ•œ๋‹ค.

public class ThreadLocalUtil {
    private static final ThreadLocal<String> userId = new ThreadLocal<>();

    public static void setUserId(String id) {
        userId.set(id);
    }

    public static String getUserId() {
        return userId.get();
    }

    public static void clear() {
        userId.remove();
    }
}

 

 

์•„๋ž˜์ฒ˜๋Ÿผ ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ, ์‚ฌ์šฉ์ž ID๋ฅผ ThreadLocalUtil์— ์ €์žฅํ•˜๋„๋ก ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ณณ์—์„œ ThreadLocalUtil์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์„ธ์…˜์˜ ์‚ฌ์šฉ์ž ID๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์‹œ ์‚ฌ์šฉ์ž ID๋ฅผ ThreadLocalUtil์— ์ €์žฅํ•˜๋Š” ์˜ˆ์‹œ
public void onUserLogin(String userId) {
    // ์‚ฌ์šฉ์ž ID๋ฅผ ThreadLocalUtil์— ์ €์žฅ
    ThreadLocalUtil.set(ThreadLocalUtil.KEY.sessUserId, userId);
}
// ThreadLocalUtil๋กœ๋ถ€ํ„ฐ ํ˜„์žฌ ์„ธ์…˜์˜ ์‚ฌ์šฉ์ž ID๋ฅผ ๊ฐ€์ ธ์™€ ์ €์žฅํ•˜๋Š” ์˜ˆ์‹œ
public void someMethod() {
    // ThreadLocalUtil์—์„œ ์‚ฌ์šฉ์ž ID ๊ฐ€์ ธ์˜ค๊ธฐ
    String sessUserID = (String) ThreadLocalUtil.get(ThreadLocalUtil.KEY.sessUserId);
    
    // ๊ฐ€์ ธ์˜จ ์‚ฌ์šฉ์ž ID ์‚ฌ์šฉ (์˜ˆ: ์‚ฌ์šฉ์ž ID ํ™•์ธ, ๋กœ๊ทธ ์ถœ๋ ฅ ๋“ฑ)
    System.out.println("Current Session User ID: " + sessUserID);
}
๋ฐ˜์‘ํ˜•
Comments