Avatar
๐Ÿ˜‰

Organizations

  • ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ ์ •๋ฆฌ #1

    ์‚ฌ์ „ ์ค€๋น„

    • ๋ถ„์„ ๋จผ์ €
    • ์˜ˆ์™ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค
    • ๊ธฐ๋ก - ๋ชปํ‘ผ๊ฒƒ๋„ ๊ธฐ๋ก์€ ํ•ด๋‘์ž
    • ๋‚˜๋งŒ์˜ ์–ธ์–ด๋กœ ์š”์•ฝ

    ๋ฌธ์ œ ๋ถ„์„

    • ๋ฌธ์ œ๋ฅผ ์ชผ๊ฐœ์„œ ๋ถ„์„
    • ์ œ์•ฝ์‚ฌํ•ญ๊ณผ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค
    • ์ž…๋ ฅ๊ฐ’ ๋ถ„์„ํ•˜๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค์ •
    • greedy, ์™„์ „ ํƒ์ƒ‰ ๋ญ˜๋กœ ํ• ์ง€
    • ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ๊ตฌ์„ฑ ํŒŒ์•…
    • ์˜์‚ฌ ์ฝ”๋“œ๋กœ ์„ค๊ณ„

    ์ฑ„์ ๊ธฐ์ค€

    • ์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ
    • ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ

    ์‹œ๊ฐ„๋ณต์žก๋„

    • O(N) ํ—ˆ์šฉ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” 2000๋งŒ
    • ์ดˆ๋‹น ์—ฐ์‚ฐ ์ตœ๋Œ€ ํšŸ์ˆ˜๋Š” 1์–ต๋ฒˆ, ์ œํ•œ์‹œ๊ฐ„์ด 1์ดˆ๋ฉด ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ 3000๋งŒ์ด ์•ˆ๋„˜๋„๋ก
    • ์ง€์ˆ˜ํ•จ์ˆ˜, ๋‹คํ•ญํ•จ์ˆ˜, ๋กœ๊ทธํ•จ์ˆ˜
    • ์ž…๋ ฅ ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ์—ฐ์‚ฐ ํšŸ์ˆ˜์˜ ์ถ”์ด๋ฅผ ํ™œ์šฉํ•ด์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• - ์ ๊ทผ์  ํ‘œ๊ธฐ๋ฒ•
    • ํŠน์ •๊ฐ’์„ ๊ณ„์† ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ๋™์ž‘์„ ํ•œ๋‹ค๋ฉด O(logN)

    ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ•„์ˆ˜ ๋ฌธ๋ฒ•

    ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ํƒ€์ž… / ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…

    • int, long, float, double
    • Integer, Long, Float, Double - ์—ฐ์‚ฐ ์†๋„๋Š” ๋А๋ฆผ
    • ์—ก์‹ค๋ก  epsilon - ๋ถ€๋™์†Œ์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ด์ง„๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•ด์„œ ์ƒ๊ธฐ๋Š” ์˜ค์ฐจ
    • ๋น„ํŠธ์—ฐ์‚ฐ
    &, |, ^ XOR, ~ NOT, <<, >>
    
    • ๋…ผ๋ฆฌ์—ฐ์‚ฐ
    &&, ||, !(x>y)
    

    ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ

    ๋ฐฐ์—ด

    • ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„
    • ์ƒ์„ฑ์ดํ›„ ํฌ๊ธฐ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€, ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…,์‚ญ์ œ ๋ถˆ๊ฐ€. ๋ณ€๊ฒฝ๋งŒ ๊ฐ€๋Šฅ
    • index๋กœ ์š”์†Œ ์ ‘๊ทผ - index๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ ‘๊ทผ,๋ณ€๊ฒฝ์€ O(1)
    int[] array = {1,2,3,4,5};
    int[] array2 = new int[]{1,3,5,7,9};
    int[] array3 = new int[5];
    

    ๋ฆฌ์ŠคํŠธ ArrayList (์‚ฌ์‹ค LinkedList ๋„ ์žˆ์Œ)

    • ๊ฐ€๋ณ€ ํฌ๊ธฐ
    • ๋งจ ๋’ค ์ถ”๊ฐ€์‹œ O(1), ์‚ญ์ œ๋‚˜ ์ค‘๊ฐ„ ์‚ฝ์ž…์€ O(N)

    ํ•ด์‹œ๋งต hashmap

    • key, value
    // Integer = 32bit = 4byte
    HashMap<String, Integer> map = new HashMap<>();
    
    // ์‚ฝ์ž… 
    map.put("apple", 1);
    
    // ๊ฒ€์ƒ‰
    if(map.containsKey(key)) { ... }
    
    map.get(key);
    
    // ์‚ญ์ œ
    map.remove(key);
    

    ๋ฌธ์ž์—ด

    • immutable ๊ฐ์ฒด - ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด, ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ด€์ ์—์„œ๋„ ์ฃผ์˜
    • ์ถ”๊ฐ€, ์‚ญ์ œ์‹œ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์ˆ˜์ •
    .replace("a", "");
    

    StringBuffer, StringBuilder

    Sytem.out.println(System.identityHashCode(s));
    
    long start = System.currentTimeMillis();
    StringBuilder s = new StringBuilder();
    for(int i=0; i<=100_000; i++) {
        s.append(i);
    } 
    long end = System.currentTimeMillis();
    System.out.println(((end-start)/1000.0) + "์ดˆ"); 
    
    • ์ฐจ์ด StringBuffer ๋Š” Thread-Safe (์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ฑฐ์˜ ์•ˆ์”€)
    • ์†๋„๋ฉด์—์„œ StringBuilder ๊ฐ€ ์กฐ๊ธˆ ๋” ๋น ๋ฆ„(์ฝ”๋”ฉํ…Œ์Šคํฌ ๊ธฐ์ค€ ๊ถŒ์žฅ)
    sb.deleteCharAt(index)
    sb.insert(index, ๋ฌธ์ž);
    

    Stack

    Queue

    ArrayDeque (๋ฑ ํ˜น์€ ๋ฐํฌ ๋ผ๊ณ  ์ฝ์Œ)

    • ์–‘๋ฐฉํ–ฅ queue, ์ฆ‰ ์•ž์ชฝ, ๋’ค์ชฝ์—์„œ pop ๊ฐ€๋Šฅ

    ๋ฉ”์„œ๋“œ

    • ๋žŒ๋‹ค์‹ / ์ต๋ช…ํ•จ์ˆ˜ - ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜์ž์ฒด๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ(๊ณ ์ฐจํ•จ์ˆ˜)
    Node[] nodes = new Node[5];
    Arrays.sort(nodes, (o1,o2) -> Integer.compare(o1.cost, o2.cost));
    
    
    Arrays.sort(nodes, new Comparator<Node>() {
        @Override
        public int compare(Node o1, Node o2) {
            return Integer.compare(o1.cost, o2.cost);
        } 
    }
    
    • Integer.compare(int x, int y) ๋Š” x<y๋ฉด -1, x>y๋ฉด 1, x=y๋ฉด 0

    ์ฝ”๋“œ ๊ตฌํ˜„ ๋…ธํ•˜์šฐ

    • ์กฐ๊ธฐ ๋ฐ˜ํ™˜
    • ๋ณดํ˜ธ ๊ตฌ๋ฌธ
    List<Integer> numbers
    ...
    int total = numbers.stream().mapToInt(i->i).sum();
    
    • ์ œ๋„ค๋ฆญ
    List<Integer> genericList = new ArrayList<>();
    // ๋นŒ๋“œ ๋ ˆ๋ฒจ์—์„œ ํƒ€์ž…์ฒดํฌํ•˜์—ฌ ํƒ€์ž… ๊ฐ•์ œ
    
    Created Tue, 22 Apr 2025 17:48:45 +0900
  • ReentrantLock์€ Java์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ณ ๊ธ‰ ๋™๊ธฐํ™” ๋„๊ตฌ๋กœ, synchronized ๋ธ”๋ก๋ณด๋‹ค ๋” ๋งŽ์€ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” Lock ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค.


    ๐Ÿ” ReentrantLock์ด๋ž€?

    • Java์˜ java.util.concurrent.locks.ReentrantLock ํด๋ž˜์Šค
    • ์žฌ์ง„์ž… ๊ฐ€๋Šฅ(reentrant) ํ•œ ๋ฝ
      โ†’ ๊ฐ™์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ lock์„ ํš๋“ํ•ด๋„ deadlock ์—†์ด ๋™์ž‘
    • synchronized์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋” ์„ธ๋ฐ€ํ•œ ์ปจํŠธ๋กค ๊ฐ€๋Šฅ

    ๐Ÿ”ธ ๊ธฐ๋ณธ ์‚ฌ์šฉ ์˜ˆ์ œ

    import java.util.concurrent.locks.ReentrantLock;
    
    public class Counter {
        private int count = 0;
        private final ReentrantLock lock = new ReentrantLock();
    
        public void increment() {
            lock.lock(); // ๐Ÿ” lock ํš๋“
            try {
                count++;
            } finally {
                lock.unlock(); // ๐Ÿ”“ ๊ผญ ํ•ด์ œํ•ด์ค˜์•ผ ํ•จ!
            }
        }
    
        public int getCount() {
            return count;
        }
    }
    

    โš ๏ธ finally ๋ธ”๋ก์—์„œ unlock()์„ ๊ผญ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ฝ์ด ํ’€๋ฆฌ์ง€ ์•Š์œผ๋ฉด ๋ฐ๋“œ๋ฝ(deadlock) ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”.

    Created Sun, 20 Apr 2025 18:15:45 +0900
  • HashMap๊ณผ LinkedHashMap์€ ๋‘˜ ๋‹ค Java์—์„œ ์ œ๊ณตํ•˜๋Š” Map ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด์ด์ง€๋งŒ, ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํŠน์ง•์— ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:


    ๐Ÿ”น 1. ์ €์žฅ ์ˆœ์„œ ์œ ์ง€ ์—ฌ๋ถ€

    ํŠน์ง• HashMap LinkedHashMap
    ์ˆœ์„œ ์œ ์ง€ โŒ ์ €์žฅ ์ˆœ์„œ ๋ณด์žฅ ์•ˆ ๋จ โœ… ์ž…๋ ฅ ์ˆœ์„œ(๋˜๋Š” ์ ‘๊ทผ ์ˆœ์„œ) ์œ ์ง€
    • HashMap์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆœ์„œ๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ ์ˆœ์„œ์™€ ๊บผ๋‚ผ ๋•Œ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ.
    • LinkedHashMap์€ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•จ.

    ๐Ÿ”น 2. ์„ฑ๋Šฅ

    ์„ฑ๋Šฅ HashMap LinkedHashMap
    ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋น ๋ฆ„ โœ… โŒ (์กฐ๊ธˆ ๋А๋ฆผ)
    • LinkedHashMap์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์Œ.

    ๐Ÿ”น 3. null ํ—ˆ์šฉ ์—ฌ๋ถ€

    ์š”์†Œ HashMap LinkedHashMap
    null ํ‚ค ํ—ˆ์šฉ 1๊ฐœ ๊ฐ€๋Šฅ 1๊ฐœ ๊ฐ€๋Šฅ
    null ๊ฐ’ ํ—ˆ์šฉ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ

    ๋‘˜ ๋‹ค null ํ‚ค ํ•˜๋‚˜์™€ null ๊ฐ’ ์—ฌ๋Ÿฌ ๊ฐœ ํ—ˆ์šฉํ•จ.

    Created Sun, 20 Apr 2025 11:15:45 +0900
  • DDD(Domain-Driven Design, ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„)๋Š” ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(์—…๋ฌด ์˜์—ญ) ์„ ์ค‘์‹ฌ์— ๋‘๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด์—์š”. ์—๋ฆญ ์—๋ฐ˜์Šค(Eric Evans)์˜ ์ฑ… *“Domain-Driven Design: Tackling Complexity in the Heart of Software”*์—์„œ ์ฒ˜์Œ ์ œ์•ˆ๋˜์—ˆ๊ณ , ํŠนํžˆ ๋„๋ฉ”์ธ ๋ณต์žก์„ฑ์ด ๋†’์€ ์‹œ์Šคํ…œ์—์„œ ๊ฐ•๋ ฅํ•œ ํšจ๊ณผ๋ฅผ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.


    โœ… DDD๋ž€?

    ๊ฐ„๋‹จํžˆ ๋งํ•ด DDD๋Š”:

    • ๋น„์ฆˆ๋‹ˆ์Šค์˜ ํ•ต์‹ฌ ๋กœ์ง(๋„๋ฉ”์ธ) ์„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ ,
    • ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘๋ ฅํ•˜์—ฌ,
    • ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋ธ์„ ์—…๋ฌด ์šฉ์–ด์™€ ์ผ์น˜์‹œํ‚ค๊ณ ,
    • ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์—ฐํ•œ ์„ค๊ณ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ด์š”.

    โœ… DDD์˜ ํ•ต์‹ฌ ๊ฐœ๋…

    ๊ฐœ๋… ์„ค๋ช…
    Entity ์‹๋ณ„์ž๊ฐ€ ์žˆ์–ด ๊ณ ์œ ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜๋Š” ๊ฐ์ฒด (ex. Order, User)
    Value Object ์‹๋ณ„์ž ์—†์ด ๊ฐ’ ์ž์ฒด๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด (ex. Address, Money)
    Aggregate ๋„๋ฉ”์ธ ๊ฐ์ฒด๋“ค์˜ ๊ตฐ์ง‘. ํ•˜๋‚˜์˜ ๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ(Aggregate Root)๊ฐ€ ์กด์žฌ
    Repository ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค (findById, save)
    Service (๋„๋ฉ”์ธ ์„œ๋น„์Šค) ํŠน์ • ์—”ํ‹ฐํ‹ฐ์— ์†ํ•˜์ง€ ์•Š๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹ด๋‹น
    Factory ๋ณต์žกํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง ๋‹ด๋‹น
    Bounded Context ํŠน์ • ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์ ์šฉ๋˜๋Š” ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„

    โœ… Spring Boot์—์„œ DDD ์ฝ”๋“œ์ƒ ํŠน์ง•

    Spring Boot์—์„œ DDD๋ฅผ ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋ฐ ์—ญํ•  ๋ถ„๋ฆฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค:

    Created Thu, 17 Apr 2025 18:54:11 +0900
  • **๊ณต๋ถ„์‚ฐ(Covariance)**์€ ๋‘ ๋ณ€์ˆ˜ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ธก์ •ํ•˜๋Š” ํ†ต๊ณ„์  ๊ฐœ๋…์œผ๋กœ, ํ•œ ๋ณ€์ˆ˜์˜ ๋ณ€ํ™”๊ฐ€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์˜ ๋ณ€ํ™”์™€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ณต๋ถ„์‚ฐ์€ ๋ณ€์ˆ˜ ๊ฐ„์˜ ๋ฐฉํ–ฅ์„ฑ๊ณผ ํฌ๊ธฐ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    ๊ณต๋ถ„์‚ฐ์˜ ์ •์˜

    ๊ณต๋ถ„์‚ฐ์€ ๋‘ ๋ณ€์ˆ˜ (X)์™€ (Y)์˜ ๊ฐ’๋“ค์ด ๊ฐ๊ฐ ํ‰๊ท ์—์„œ ๋ฒ—์–ด๋‚œ ์ •๋„๋ฅผ ๊ณฑํ•œ ๊ฐ’์˜ ํ‰๊ท ์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
    ์ˆ˜์‹์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

    [ \text{Cov}(X, Y) = \frac{\sum_{i=1}^n (X_i - \bar{X})(Y_i - \bar{Y})}{n} ]

    • (X_i, Y_i): ๊ฐ ๋ณ€์ˆ˜ (X)์™€ (Y)์˜ ๊ด€์ธก๊ฐ’
    • (\bar{X}, \bar{Y}): ๋ณ€์ˆ˜ (X)์™€ (Y)์˜ ํ‰๊ท ๊ฐ’
    • (n): ๊ด€์ธก๊ฐ’์˜ ๊ฐœ์ˆ˜

    ๊ณต๋ถ„์‚ฐ์˜ ํŠน์ง•

    1. ์–‘์ˆ˜(Positive):

    Created Mon, 14 Apr 2025 09:10:45 +0900
  • java์—์„œ AES ์•”๋ณตํ˜ธํ™” ์ฝ”๋“œ ์˜ˆ์ œ

    ์•”ํ˜ธํ™”

        public static String encryptAes(String plainText) throws Exception {
            Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            byte[] key = Base64.decodeBase64("YOUR_KEY");
            byte[] iv = Base64.decodeBase64("YOUR_INITIAL_VALUE");
    
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
            c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
            byte[] encryptedByte = c.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
    
            return new String(Base64.encodeBase64(encryptedByte));
        }
    

    ๋ณตํ˜ธํ™”

        public static String decryptAes(String cipherText) throws Exception {
            Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            byte[] key = Base64.decodeBase64("YOUR_KEY");
            byte[] iv = Base64.decodeBase64("YOUR_INITIAL_VALUE");
    
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
            c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
            byte[] encryptedByte = c.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
    
            return new String(Base64.encodeBase64(encryptedByte));
        }
    
    Created Sun, 13 Apr 2025 16:18:45 +0900