-
JPA์์ N+1 ๋ฌธ์ ๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์๋ ๋ํ์ ์ธ ORM ์ฌ์ฉ ์์ ์ด์ ์ค ํ๋์ ๋๋ค. ์๋์ ์์ธํ ์ค๋ช ๋๋ฆด๊ฒ์.
N+1 ๋ฌธ์ ๋?
N+1 ๋ฌธ์ ๋ JPA์์ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ง์ฐ ๋ก๋ฉ(LAZY loading) ๋ฐฉ์์ผ๋ก ์กฐํํ ๋ ๋ฐ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๊ฐ์ ํด ๋ด ์๋ค:
- ๊ฒ์๊ธ(Post)๊ณผ ์์ฑ์(Member)๋ ๋ค๋์ผ(N:1) ๊ด๊ณ์ด๋ค.
- ๊ฒ์๊ธ 1๊ฐ๋ ์์ฑ์ 1๋ช ์ ๊ฐ์ง๋ค.
@Entity public class Post { @ManyToOne(fetch = FetchType.LAZY) private Member author; }๊ฒ์๊ธ ๋ฆฌ์คํธ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ฉด:
List<Post> posts = postRepository.findAll();์ด๋ JPA๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค:
CreatedWed, 23 Apr 2025 20:48:45 +0900 -
stream().mapToInt()๋ Java Stream API์์ ์ฌ์ฉ๋๋ ๋ฉ์๋ ์ค ํ๋๋ก, Stream์ ์์๋ฅผintํ ์ ์๋ก ๋ณํํ์ฌIntStream์ ์์ฑํ๋ ์ญํ ์ ํฉ๋๋ค.๐ก ์ฌ์ฉ ๋ชฉ์
mapToInt()๋ ์ฃผ๋ก ๊ฐ์ฒด ์คํธ๋ฆผ์์ ์ ์๊ฐ์ ์ถ์ถํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ค ๊ฐ์ฒด ๋ฆฌ์คํธ์์ ํน์ ํ๋(์: ๋์ด, ์ ์ ๋ฑ)๋ฅผ ์ ์๋ก ๋ฝ์๋ผ ๋ ์ ์ฉํฉ๋๋ค.
๐ ๊ธฐ๋ณธ ๊ตฌ์กฐ
Stream<T> stream = ...; IntStream intStream = stream.mapToInt(element -> ๋ณํํ int ๊ฐ);
โ ์์
List<String> list = List.of("1", "2", "3"); int sum = list.stream() .mapToInt(Integer::parseInt) // String โ int .sum(); // IntStream ์ฐ์ฐ ์ฌ์ฉ System.out.println(sum); // ์ถ๋ ฅ: 6์ ์ฝ๋์์:
CreatedWed, 23 Apr 2025 13:48:45 +0900 -
๋ฐฐ์ด
์ ์ธ
int[] arr = {0,0,0,0,0,0}; int[] arr = new int[6];- ArrayList - ์ ์ฅํ ๋ฐ์ดํฐ ๊ฐ์๋ฅผ ์ ํํ ์ ์ ์๋ค๋ฉด…
์ฐจ์
- 2์ฐจ์
int[][] arr = { {1,2,3}, {4,5,6}};ArrayList
- ์ถ๊ฐ
ArrayList<Integer> list = new ArrayList<>(); list.add(1);- ์ด๊ธฐํ
ArrayList<Integer> list = new ArrayList<>(); ArrayList<Integer> list2 = new ArrayList<>(list);- ์ ๊ทผ - get(index)
- ์ญ์ - remove()
- length ๋ณ์
- Arrays.sort()
- toString()
- size()
- isEmpty()
- Collections.sort
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5)); Collections.sort(list); // array๋ Arrays.sort()- sort() ์ฌ์ฉ์ from ์ธ๋ฑ์ค, to ์ธ๋ฑ์ค๋ก ํน์ ๋ฒ์๋ง ์ ๋ ฌ ๊ฐ๋ฅ
ArrayList ํจ์จ์ฑ
- ์๊ฐ ๋ณต์ก๋
- ์ ๊ทผ O(1)
- ๋งจ ๋ค ์ฝ์ O(1)
- ๋งจ ์์ด๋ ์ค๊ฐ. O(N)
- ๊ณ ๋ คํ ์
- ํ ๋นํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ - ์ ์ํ 1์ฐจ์ 1000๋ง๊ฐ, 2์ฐจ์์ 3000*3000 ์ ๋
- ์ค๊ฐ์ ๋ฐ์ดํฐ ์ฝ์ ์ด ๋น๋ฒํ ๊ฒฝ์ฐ ์๊ฐ ์ด๊ณผํ ์ ์์.
๋ชธํ๊ธฐ ๋ฌธ์
์ ๋ ฌ
- Arrays.sort() -> Dual-Pivot QuickSort ํน์ Tim-Sort : ์ฑ๋ฅ์ข์ผ๋๊น ๊ทธ๋ฅ ์ฐ์
// bubble sort ์ private static int[] bubbleSort(int[] org) { int[] arr = org.clone(); int n = arr.length; for(int i=0; i< n; i++) { for(int j=0; j<n-i-1; j++) { if(arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } }- ์๋ณธ์ ๊ทธ๋๋ก ๋๊ณ ์ถ์ผ๋ฉด
int[] clone = arr.clone();๋ฐฐ์ด ์ ์ดํ๊ธฐ
- ์ค๋ณต ์ ๊ฑฐ
Integer[] result = Arrays.stream(arr).boxed().distinct().toArray(Integer[]::new); Arrays.sort(result, Collections.reverseOrder()); Arrays.stream(result).mapToInt(Integer::intValue).toArray(); // int[]๋ก- ๊ฐ๊ธ์ ํ์ค API๋ฅผ ์ฌ์ฉํด์ ์๊ฐ์ด๊ณผ ๋ฐ์ํ์ง ์๋๋ก
TreeSet<Integer> set = new TreeSet<>(Collections.reverseOrder()); int[] result = new int[set.size()]; for(int i = 0; i < result.length; i++) { result[i] = set.pollFirst(); } // ์ค๋ณต์ ๊ฑฐ O(N), ์ ๋ ฌ O(NlogN) => O(NlogN)CreatedTue, 22 Apr 2025 20:48:45 +0900 -
์ฝ๋ฉ ํ ์คํธ ํฉ๊ฒฉ์ ๋๊ธฐ ์ ๋ฆฌ #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<>(); // ๋น๋ ๋ ๋ฒจ์์ ํ์ ์ฒดํฌํ์ฌ ํ์ ๊ฐ์ CreatedTue, 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) ๋ฐ์ํ ์ ์์ด์.CreatedSun, 20 Apr 2025 18:15:45 +0900 - Java์
-
HashMap๊ณผLinkedHashMap์ ๋ ๋ค Java์์ ์ ๊ณตํ๋ Map ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ด์ง๋ง, ๋์ ๋ฐฉ์๊ณผ ํน์ง์ ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค:
๐น 1. ์ ์ฅ ์์ ์ ์ง ์ฌ๋ถ
ํน์ง HashMapLinkedHashMap์์ ์ ์ง โ ์ ์ฅ ์์ ๋ณด์ฅ ์ ๋จ โ ์ ๋ ฅ ์์(๋๋ ์ ๊ทผ ์์) ์ ์ง HashMap์ ๋ด๋ถ์ ์ผ๋ก ์์๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ์์์ ๊บผ๋ผ ๋ ์์๊ฐ ๋ค๋ฅผ ์ ์์.LinkedHashMap์ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์์๋ฅผ ๊ธฐ์ตํจ.
๐น 2. ์ฑ๋ฅ
์ฑ๋ฅ HashMapLinkedHashMap์ผ๋ฐ์ ์ผ๋ก ๋ ๋น ๋ฆ โ โ (์กฐ๊ธ ๋๋ฆผ) LinkedHashMap์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ ์งํด์ผ ํ๋ฏ๋ก ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์.
๐น 3. null ํ์ฉ ์ฌ๋ถ
์์ HashMapLinkedHashMapnullํค ํ์ฉ1๊ฐ ๊ฐ๋ฅ 1๊ฐ ๊ฐ๋ฅ null๊ฐ ํ์ฉ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ ๋ ๋ค
nullํค ํ๋์null๊ฐ ์ฌ๋ฌ ๊ฐ ํ์ฉํจ.CreatedSun, 20 Apr 2025 11:15:45 +0900