Avatar
๐Ÿ˜‰

Organizations

  • Spring Boot์—์„œ ํŒŒ์ผ์„ ์ŠคํŠธ๋ฆฌ๋ฐ(Stream) ๋ฐฉ์‹์œผ๋กœ writeํ•  ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆด์ง€ ์—ฌ๋ถ€๋Š” ์‚ฌ์šฉ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ์ŠคํŠธ๋ฆฌ๋ฐ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•์œผ๋กœ, ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ  ์ผ์ • ํฌ๊ธฐ์˜ ๋ฒ„ํผ๋ฅผ ํ†ตํ•ด ์ ์ง„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


    โœ… ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (Streaming ๋ฐฉ์‹)

    Java์—์„œ InputStream โ†’ OutputStream ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ณดํ†ต ๋‹ค์Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

    try (InputStream in = ...;
         OutputStream out = new FileOutputStream("output.txt")) {
    
        byte[] buffer = new byte[8192]; // 8KB ๋ฒ„ํผ
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            out.write(buffer, bytesRead, 0);
        }
    }
    

    ์ด ๋ฐฉ์‹์€:

    Created Wed, 30 Apr 2025 13:25:18 +0900
  • Servlet์ด๋ž€?

    Servlet์€ Java๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ ์„œ๋ฒ„ ์ธก ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ(์ฃผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €)์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, Java EE (์ดํ›„ Jakarta EE๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ) ์ŠคํŽ™์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

    Servlet์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„(Tomcat, Jetty ๋“ฑ) ์œ„์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ์›น ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ์ž๋กœ ๊ธฐ๋Šฅํ•ฉ๋‹ˆ๋‹ค.


    Servlet์˜ ์ฃผ์š” ํŠน์ง•

    • Java ์–ธ์–ด ๊ธฐ๋ฐ˜: ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ด๋ฉฐ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์žฅ์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    • ์š”์ฒญ-์‘๋‹ต ์ฒ˜๋ฆฌ: HTTP ์š”์ฒญ(GET, POST, PUT, DELETE ๋“ฑ)์„ ๋ฐ›์•„์„œ ํ•„์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
    • ํ™•์žฅ์„ฑ: ์ถ”๊ฐ€ ์„ค์ •๊ณผ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜: ํ•˜๋‚˜์˜ Servlet ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค์ˆ˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ: init(), service(), destroy() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    Servlet์˜ ๋™์ž‘ ๋ฐฉ์‹

    1. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ: ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    2. ์›น ์„œ๋ฒ„ ์ „๋‹ฌ: ์š”์ฒญ์€ ์›น ์„œ๋ฒ„(Tomcat ๋“ฑ)์— ์˜ํ•ด ํ•ด๋‹น Servlet์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    3. Servlet ์š”์ฒญ ์ฒ˜๋ฆฌ:
      • service() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ์š”์ฒญ ๋ฐฉ์‹์— ๋”ฐ๋ผ doGet(), doPost() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    4. ์‘๋‹ต ์ƒ์„ฑ: ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ HttpServletResponse ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    5. ๋ผ์ดํ”„์‚ฌ์ดํด ์ข…๋ฃŒ: ์„œ๋ฒ„๊ฐ€ ๋‚ด๋ ค๊ฐ€๊ฑฐ๋‚˜ ํŠน์ • ์ƒํ™ฉ์—์„œ destroy()๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์ •๋ฆฌ ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค.

    Servlet์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ (์˜ˆ์ œ)

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/hello")
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            resp.setContentType("text/html");
            resp.getWriter().write("<h1>Hello, Servlet!</h1>");
        }
    }
    

    ์ด ์ฝ”๋“œ๋Š” /hello ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ์˜ค๋ฉด “Hello, Servlet!” ์ด๋ผ๋Š” HTML์„ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    Created Tue, 29 Apr 2025 20:19:45 +0900
  • Java์—์„œ abstract class์™€ interface๋Š” ๋‘˜ ๋‹ค **์ถ”์ƒํ™”(abstraction)**๋ฅผ ์œ„ํ•œ ์ˆ˜๋‹จ์ด์ง€๋งŒ, ์„ค๊ณ„ ๋ชฉ์ ๊ณผ ์‚ฌ์šฉ ๋ฐฉ์‹์— ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ๊ทธ ์ฐจ์ด์ ์„ ์ •๋ฆฌํ•ด ๋“œ๋ฆด๊ฒŒ์š”.


    โœ… ๊ณตํ†ต์ 

    • ๋‘˜ ๋‹ค ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†์Œ
    • ๋‘˜ ๋‹ค ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋งŒ ์„ ์–ธํ•˜๊ณ , ๊ตฌํ˜„์€ ํ•˜์œ„ ํด๋ž˜์Šค(๋˜๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค)์—์„œ ๋‹ด๋‹น
    • ๋‘˜ ๋‹ค **๋‹คํ˜•์„ฑ(polymorphism)**์„ ์œ„ํ•œ ์ˆ˜๋‹จ

    ๐Ÿ” ์ฃผ์š” ์ฐจ์ด์ 

    ํ•ญ๋ชฉ abstract class interface
    ํ‚ค์›Œ๋“œ abstract class ClassName interface InterfaceName
    ๋‹ค์ค‘ ์ƒ์† ๋ถˆ๊ฐ€ (๋‹จ์ผ ์ƒ์†๋งŒ ๊ฐ€๋Šฅ) ๊ฐ€๋Šฅ (์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ฐ€๋Šฅ)
    ์ƒ์„ฑ์ž ์ƒ์„ฑ์ž ์ •์˜ ๊ฐ€๋Šฅ ์ƒ์„ฑ์ž ์—†์Œ
    ํ•„๋“œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, ์ •์  ๋ณ€์ˆ˜ ๊ฐ€๋Šฅ public static final ์ƒ์ˆ˜๋งŒ ์„ ์–ธ ๊ฐ€๋Šฅ (Java 8 ์ด์ „ ๊ธฐ์ค€)
    ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ Java 8๋ถ€ํ„ฐ๋Š” default, static ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
    ์ ‘๊ทผ ์ œ์–ด์ž ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ์ œ์–ด์ž(private, protected, public) ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public abstract (Java 9 ์ดํ›„ private ๋ฉ”์„œ๋“œ๋„ ๊ฐ€๋Šฅ)
    ๋ชฉ์  “IS-A” ๊ด€๊ณ„ (์ƒ์† ๊ธฐ๋ฐ˜์˜ ๊ณ„์ธตํ™”) ๊ธฐ๋Šฅ ์ •์˜์šฉ, ๊ณ„์•ฝ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ (๋‹คํ˜•์„ฑ, ํ”Œ๋Ÿฌ๊ทธ์ธ)

    โœจ Java 8+ ์ดํ›„ ๋‹ฌ๋ผ์ง„ ์ 

    • Java 8๋ถ€ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค์— default ๋ฉ”์„œ๋“œ์™€ static ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
      interface Vehicle {
          default void start() {
              System.out.println("Starting...");
          }
      }
      
    • Java 9๋ถ€ํ„ฐ๋Š” private ๋ฉ”์„œ๋“œ๋„ ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์—์„œ ์„ ์–ธ ๊ฐ€๋Šฅ

    โœ… ์–ธ์ œ ์–ด๋–ค ๊ฑธ ์จ์•ผ ํ• ๊นŒ?

    • abstract class๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ:

    Created Thu, 24 Apr 2025 21:48:45 +0900
  • ๋ชจ์˜ ํ…Œ์ŠคํŠธ

    ๋‘๊ฐœ ๋ฝ‘์•„์„œ ๋”ํ•˜๊ธฐ

    public static int[] solution_03(int[] numbers) {
        TreeSet<Integer> result = new TreeSet<>();
    
        for (int i = 0; i < numbers.length - 1; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                result.add(numbers[i] + numbers[j]);
            }
        }
    
        return result.stream().sorted().mapToInt(Integer::intValue).toArray();
    }
    
    • stream ์‚ฌ์šฉ๋ฒ•

    ๋ชจ์˜๊ณ ์‚ฌ (์ˆ˜ํฌ์ž)

    public static int[] solution_04(int[] answers) {
        int[] pattern1 = {1, 2, 3, 4, 5};
        int[] pattern2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] pattern3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    
        int[] scores = new int[3];
    
        for (int i = 0; i < answers.length; i++) {
            scores[0] += answers[i] == pattern1[i % pattern1.length % pattern1.length] ? 1 : 0;
            scores[1] += answers[i] == pattern2[i % pattern2.length % pattern2.length] ? 1 : 0;
            scores[2] += answers[i] == pattern3[i % pattern3.length % pattern3.length] ? 1 : 0;
        }
    
        int maxScore = Arrays.stream(scores).max().getAsInt();
    
        ArrayList<Integer> answer = new ArrayList<>();
        for (int i = 0; i < scores.length; i++) {
            if (scores[i] == maxScore) {
                answer.add(i + 1);
            }
        }
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
    
    • ํŒจํ„ด ํŒŒ์•…, maxScore ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ• .max().getAsInt()

    ํ–‰๋ ฌ์˜ ๊ณฑ์…‰

    public static int[][] solution_05(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length];
    
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr2[0].length; j++) {
                for (int k = 0; k < arr1[0].length; k++) {
                    answer[i][j] += arr1[i][k] * arr2[k][j];
                }
            }
        }
        return answer;
    }
    
    • O(N^3) ์˜ index ์œ ์˜

    ์‹คํŒจ์œจ

    public static int[] solution_06(int N, int[] stages) {
    
        int[] challenger = new int[N+2];
        Arrays.stream(stages).forEach(stage -> challenger[stage]++);
    
        HashMap<Integer, Double> fails = new HashMap<>();
        double totalPlayer = stages.length;
    
        for( int i = 1; i <= N; i++) {
            if(challenger[i] == 0) {
                fails.put(i, 0.0);
            }else {
                fails.put(i, (double)challenger[i]/totalPlayer);
                totalPlayer -= challenger[i];
            }
        }
    
        return fails.entrySet().stream()
            .sorted((o1, o2) -> Double.compare(o2.getValue(), o1.getValue()))
            .mapToInt(HashMap.Entry::getKey).toArray();
    }
    
    • challenger ์„ [N+2] ๊ฐœ๋กœ ์žก๋Š” ์ด์œ 
    • for๋ฌธ์—์„œ totalPlayer -= challenger[i];
    • HashMap์˜ entrySet ์‚ฌ์šฉ ์š”๋ น ๊ธฐ์–ตํ•˜๊ธฐ

    ๋ฐฉ๋ฌธ ๊ธธ์ด

    import java.util.HashMap;
    import java.util.HashSet;
    
    class Solution {
    
        private static HashMap<Character, int[]> location = new HashMap<>();
    
        private static void initLocation() {
            location.put('U', new int[]{0, 1});
            location.put('D', new int[]{0, -1});
            location.put('L', new int[]{-1, 0});
            location.put('R', new int[]{1, 0});
        }
    
        public int solution(String dirs) {
            initLocation();
            int x = 5, y = 5;
    
            HashSet<String> answer = new HashSet<>();
    
            for (int i = 0; i < dirs.length(); i++) {
                int[] move = location.get(dirs.charAt(i));
                int nx = x + move[0];
                int ny = y + move[1];
    
                if (!isValidMove(nx, ny)) {
                    continue;
                }
                answer.add(x + " " + y + " " + nx + " " + ny);
                answer.add(nx + " " + ny + " " + x + " " + y);
    
                x = nx;
                y = ny;
            }
    
            return answer.size() / 2;
        }
    
        private static boolean isValidMove(int nx, int ny) {
            return nx < 11 && nx >= 0 && ny < 11 && ny >= 0;
        }
    }
    
    • A->B, B->A ๋„ ํ•˜๋‚˜์˜ ์ด๋™๊ฒฝ๋กœ๋กœ ํŒŒ์•…๋˜๋Š” ์  ์œ ์˜ answer.size() / 2 (๋ฌธ์ œ์—๋Š” ์ƒ์„ธ ์„ค๋ช…์ด ์—†์Œ)
    Created Thu, 24 Apr 2025 20:48:45 +0900
  • Virtual Thread๋Š” Java 19๋ถ€ํ„ฐ ๋„์ž…๋˜๊ณ  Java 21์—์„œ ์ •์‹์œผ๋กœ ์•ˆ์ •ํ™”๋œ Project Loom์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ธฐ์กด์˜ Java ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ๋˜๋˜ platform thread(๋˜๋Š” OS thread)์™€๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. Virtual thread๋Š” **๊ฒฝ๋Ÿ‰ ์Šค๋ ˆ๋“œ(lightweight thread)**๋กœ์„œ, ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


    1. Virtual Thread์˜ ํ•ต์‹ฌ ๊ฐœ๋…

    ๊ธฐ์กด Platform Thread vs Virtual Thread

    ํ•ญ๋ชฉ Platform Thread Virtual Thread
    ๊ตฌํ˜„ OS ๋ ˆ๋ฒจ์—์„œ ๊ด€๋ฆฌ JVM์—์„œ ์ง์ ‘ ๊ด€๋ฆฌ
    ์ƒ์„ฑ ๋น„์šฉ ๋ฌด๊ฒ๊ณ  ๋ฆฌ์†Œ์Šค ๋งŽ์ด ์‚ฌ์šฉ ๊ฐ€๋ณ๊ณ  ๊ฑฐ์˜ ๋ฌด์ œํ•œ ์ƒ์„ฑ ๊ฐ€๋Šฅ
    ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ OS ์Šค์ผ€์ค„๋Ÿฌ์— ์˜์กด JVM ์Šค์ผ€์ค„๋Ÿฌ ์‚ฌ์šฉ (๋น ๋ฆ„)
    ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ์ œํ•œ์ ์ธ ๋™์‹œ์„ฑ ๊ณ ๋ฐ€๋„ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

    2. ์ฃผ์š” ํŠน์ง•

    ๊ฒฝ๋Ÿ‰ ์Šค๋ ˆ๋“œ

    • Virtual thread๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํ›จ์”ฌ ์ ๊ณ  ์ƒ์„ฑ ์†๋„๋„ ๋น ๋ฆ…๋‹ˆ๋‹ค.
    • 1:1 ๋งคํ•‘์ด ์•„๋‹Œ M:N ๊ตฌ์กฐ๋กœ, ์—ฌ๋Ÿฌ virtual thread๊ฐ€ ํ•˜๋‚˜์˜ OS thread๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐจ๋‹จ I/O์™€์˜ ํ†ตํ•ฉ

    • ๊ธฐ์กด์—๋Š” Thread.sleep()์ด๋‚˜ InputStream.read() ๊ฐ™์€ blocking I/O ํ˜ธ์ถœ์ด OS thread๋ฅผ ์ ์œ ํ•˜์—ฌ ๋น„ํšจ์œจ์ ์ด์—ˆ์Œ.
    • Virtual thread์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๋ฉด JVM์ด ํ•ด๋‹น virtual thread๋ฅผ parkingํ•˜๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹คํ–‰์‹œ์ผœ ๋ณ‘๋ชฉ์„ ํ”ผํ•จ.

    ์ฝ”๋“œ ์Šคํƒ€์ผ ์œ ์ง€

    • ๊ธฐ์กด์˜ CompletableFuture, Reactive API ์—†์ด๋„ ์ „ํ†ต์ ์ธ ๋™๊ธฐ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๊ณ ์„ฑ๋Šฅ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅ.

    3. ์‚ฌ์šฉ ์˜ˆ์‹œ

    Runnable task = () -> {
        System.out.println("Hello from " + Thread.currentThread());
    };
    
    Thread thread = Thread.ofVirtual().start(task);
    

    ํ˜น์€ Executors๋ฅผ ํ†ตํ•ด ์ˆ˜๋งŽ์€ ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅ:

    Created Thu, 24 Apr 2025 11:26:42 +0900
  • ๋Œ€์šฉ๋Ÿ‰ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ **๋น„๋™๊ธฐ Event Driven Architecture (EDA)**๋Š” ์‹œ์Šคํ…œ์ด ์ด๋ฒคํŠธ(event)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ํ™•์žฅ์„ฑ, ์œ ์—ฐ์„ฑ, ์„ฑ๋Šฅ์„ ํ™•๋ณดํ•˜๋Š” ๋ฐ์— ํšจ๊ณผ์ ์ธ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ๊ฐœ๋…๊ณผ ๊ตฌ์„ฑ ์š”์†Œ, ์žฅ์  ๋ฐ ์ ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š”.


    โœ… 1. ๊ธฐ๋ณธ ๊ฐœ๋…

    **Event Driven Architecture (EDA)**๋Š” ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋Š” ์–ด๋–ค ์ƒํƒœ์˜ ๋ณ€ํ™”๋ฅผ ์˜๋ฏธํ•˜๊ณ , ์ด๋ฅผ **ํ”„๋กœ๋“€์„œ(์ƒ์‚ฐ์ž)**๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , **์ปจ์Šˆ๋จธ(์†Œ๋น„์ž)**๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    ๋น„๋™๊ธฐ ๋ฐฉ์‹์—์„œ๋Š” ์ด ์ด๋ฒคํŠธ๊ฐ€ ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ , ํ๋‚˜ ๋ฒ„ํผ๋ฅผ ํ†ตํ•ด ์ผ์‹œ ์ €์žฅ๋˜๋ฉฐ, ์ปจ์Šˆ๋จธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์‹œ์ ์— ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ์‹œ์Šคํ…œ์ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๋‚˜ ์š”์ฒญ์ด ๋งŽ์„ ๋•Œ ๋ถ€ํ•˜๋ฅผ ์™„ํ™”ํ•˜๊ณ  ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    Created Thu, 24 Apr 2025 11:22:53 +0900