week 4 leekyunghee - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
JAVA (μ΄κ²½ν¬)
- λ©ν°μ€λ λ & μ€λ λμΈμ΄νν° & μ€λ λν κ°κ°μ νΉμ§μ μ€λͺ νμμ€
- Hashtableκ³Ό HashMapμ μ°¨μ΄μ μ 무μμΈκ°μ?
SPRING (μ μΈμ² )
- Spring Security κ³Όμ μ κ°λ΅ν μ€λͺ νμμ€
- Spring λ©μμ§ ν Rabiit MQ vs KAFKA
DATABASE/SQL (μ₯μ§μ)
- RDBμ λ°λλ½μ΄ μΌμ΄λλ μν©κ³Ό κ΅μ°©μνμ λν΄μ μ€λͺ νμμ€
- DB μ΅ν°λ§μ΄μ μ λν΄ μλκ°?
JAVA (μ΄κ²½ν¬)
λ©ν°μ€λ λ, μ€λ λμΈμ΄νν°, μ€λ λν κ°κ°μ νΉμ§μ μ€λͺ νμμ€.
μ°λ λ
νλ‘μΈμ€(μ€νμ€μΈ νλ‘κ·Έλ¨)μμ νλμ μ€ν νλ¦. μλ°λ λ©ν° μ°λ λλ₯Ό μ§μνλ―λ‘ νλμ νλ‘κ·Έλ¨μμ μ¬λ¬ κ°μ μ€ν νλ¦μ λ§λ€κ³ μ€ν ν μ μλ€.
λ©ν°μ°λ λλ₯Ό μ¬μ© νλ μ΄μ
μΈλΆμμ μ°κ³κ°μ΄ λκΈ° μκ°μ΄ λ°μνμ λ κΈ°λ€λ¦¬λ λμ λ€λ₯Έ μΌμ μ²λ¦¬ν μ μκ² ν΄μ μ²λ¦¬ μλλ₯Ό λΉ λ₯΄κ² νκΈ° μν¨μ΄λ€.
- λ¨, CPUμ½μ΄ μκ° μ μΌλ©΄ μ°λ λλ₯Ό κ·Έ λ§νΌ λ§λ€ μ μκΈ° λλ¬Έμ λλΌλ§ν±νκ² λΉ¨λΌμ§μ§ μκ³ , μ²λ¦¬νλ λ°μ΄ν° μμ΄ μ μ λμλ μλκ° λ§μ΄ λΉ¨λΌμ§μ§ μκΈ° λλ¬Έμ μ°λ λλ₯Ό μ μ ν κ²½μ°μ μ¬μ©νλ κ²μ΄ μ’λ€.
λ©ν° νλ‘μΈμ€ λμ λ©ν° μ€λ λλ₯Ό μ¬μ©νλ μ΄μ ? μλ―Έλ?
νλ‘κ·Έλ¨μ μ¬λ¬ κ° ν€λ κ²λ³΄λ€ νλμ νλ‘κ·Έλ¨ μμμ μ¬λ¬ μμ μ ν΄κ²°νλ κ²μ΄λ€.
μ¬λ¬ νλ‘μΈμ€(λ©ν° νλ‘μΈμ€)λ‘ ν μ μλ μμ λ€μ νλμ νλ‘μΈμ€μμ μ¬λ¬ μ€λ λλ‘ λλ κ°λ©΄μ νλ μ΄μ ?
μμμ ν¨μ¨μ± μ¦λ λ©ν° νλ‘μΈμ€λ‘ μ€νλλ μμ μ λ©ν° μ€λ λλ‘ μ€νν κ²½μ°, νλ‘μΈμ€λ₯Ό μμ±νμ¬ μμμ ν λΉνλ μμ€ν μ½μ΄ μ€μ΄λ€μ΄ μμμ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλ€.
μ°λ λ μΈμ΄ν (Thread Safe)
-
λ©ν°μ°λ λλ‘ λμνλ νλ‘κ·Έλ¨μμ κ°λ°μκ° μλν λλ‘ λμνλ κ²μ κ°λ¦¬ν¨λ€.
-
μ ν λ€λ₯Έ μΌμ μ²λ¦¬ν λλ λ°μ μν©μ΄ μκ² μΌλ 곡μ μμμ μ°Έμ‘°ν λλΌλ©΄ κ°λ°μλ λ°λμ μ²λ¦¬ν΄μΌνλ€.
λκΈ°ν λ¬Έμ
- (μ€λ λ κ°μ μμ 곡μ λ μ μ λ³μ(λ°μ΄ν° μΈκ·Έλ¨ΌνΈ)λ₯Ό μ΄μ©νλ―λ‘ ν¨κ» μμ©ν λ μΆ©λμ΄ λ°μν μ μλ€.)
- (static fieldμ κ°μ²΄λ₯Ό λ£μλλ thread safe νμ§λ₯Ό κΌ νλ¨νμ.)
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class UnsafeSample {
public static void main(String[] args){
//μμ νμ§ μμ κ°μ²΄
DateFormat unsafeDateFormat = new SimpleDateFormat("yyyy/MM/dd");
Calendar cal1 = Calendar.getInstance();
cal1.set(1989,Calendar.MARCH,10);//1989/03/10
Date date1 = cal1.getTime();
Calendar cal2 = Calendar.getInstance();
cal2.set(2020, Calendar.JUNE,20);//2020/06/20
Date date2 = cal2.getTime();
Thread thread1 = new Thread(() -> {
for(int i=0;i<100;i++) {
try {
String result = unsafeDateFormat.format(date1);
System.out.println("Thread1: " + result);
} catch(Exception e) {
e.printStackTrace();
break;
}
}
});
Thread thread2 = new Thread(() -> {
for(int i=0;i<100;i++) {
try {
String result = unsafeDateFormat.format(date2);
System.out.println("Thread2: " + result);
} catch(Exception e) {
e.printStackTrace();
break;
}
}
});
thread1.start();
thread2.start();
}
}
λ¨μν κ²°κ³Όλ₯Ό μμΈ‘ν΄λ³΄λ©΄ Thread1μ 1989/03/10 λ§ 100λ² λμ€κ³ Thread2λ 2020/06/20 λ§ 100λ² λμμΌ νλ€.
κ·Έλ¬λ μμΈν보면 2020/06/10, 1989/03/20 μ΄λ° λ΄μ©μ΄ μμ¬λμ¨λ€. μμΌκΉ?
λ΅μ SimpleDateFormat ν΄λμ€λ₯Ό λμμ μ¬μ©νλ €κ³ νκΈ°λλ¬Έμ΄λ€.
λ΄λΆμ μΌλ‘ μ²λ¦¬ μλκ° μλΉν λΉ λ₯Έλ° κ·Έ μμ€μ κ²Ήμ³μ date1μ 1989/03/κΉμ§ μ°κ³ μλλ° κ°μκΈ°
date2λ SimpleDateFormatν΄λμ€λ₯Ό μ΄μ©ν΄μ 20μ μ°μ΄λ²λ¦¬λ κ²°κ³Όκ° λμ¬ μ μκΈ° λλ¬Έμ΄λ€.
μ΄λ κ²λλ©΄ κ°λ°μκ° κΈ°λνλ λλ‘ νλ‘κ·Έλ¨μ΄ μνλμ§ μκ² λλ κ²μ΄λ€.
ν΄κ²° λ°©λ²
-
synchronizedλ₯Ό ν΅ν΄μ ν΄λΉ μΈμ(unsafeDateFormat)μ λ½μ κ±Έμ΄μ μ°λ λλΌλ¦¬ λμμ μ¬μ©νμ§ λͺ»νκ² λ§μ κ²μ΄λ€.
-
unsafeDateFormat κ°μ²΄λ₯Ό μ°λ €κ³ νλ©΄ μ°κ³ μλμ§ κ²μ¬ν΄μ κΈ°λ€λ¦¬κ² νκ±°λ μ¬μ©νκ² ν΄μ€λ€.
-
νλ‘μΈμ€μμ μ¬μ©νλ λ©λͺ¨λ¦¬ 곡κ°μ Code, data(static), heap, stack μμμΌλ‘ λλμ΄μ§λ€.
-
νλ‘μΈμ€λ μ΄ λ€ κ°μ κ³μΈ΅μ κ°κ° λͺ¨λ κ°μ§λ§, μ°λ λλ κ²½λνλ λμμ± μ μ΄ μ»¨μ μ΄κΈ° λλ¬Έμ code, data, heapμ 곡μ νλ€.
-
static fieldλ‘ μ μΈλ κ²μ data μμμ λ€μ΄κ°κ² λκ³ , μ΄λ νμ μμ± λλ κ°μ²΄λ€μ΄ μλ‘ λ€λ₯Έ μ°λ λμμλ 곡μ ν μ μλ€.
-
μλ‘ λ€λ₯Έ μ°λ λμμ ν΄λΉ λ°μ΄ν°μ thread-safeνμ§ μκ² μ κ·Όνλ©΄ λ¬Έμ κ° λ°μν μ μλ€.
μ€λ λ ν
μ»΄ν¨ν° νλ‘κ·Έλλ°μμ μ€λ λ νμ μ»΄ν¨ν° νλ‘κ·Έλ¨μμ μ€νμ λμμ±μ λ¬μ±νκΈ°μν μννΈμ¨μ΄ λμμΈ ν¨ν΄
-
μμμλ 2κ°μ μ°λ λλ₯Ό λ§λ€μμ§λ§ λμ μΌλ‘ νλ‘κ·Έλ¨μ μ μν μ¬λ μ λ§νΌ μ°λ λλ₯Ό μμ±νκ²λλ€λ©΄ μ΄λ¨κΉ?
-
μλ§ μ ννμ§ μμΌλ©΄ λ©λͺ¨λ¦¬λ₯Ό λ€ μ‘μλ¨Ήμ λ§νΌμ μ°λ λλ₯Ό λ§λ€μ΄ λ²λ¦΄ κ²μ΄λ€.
-
λ°λΌμ μ°λ λνμ μ΄μ©ν΄μ μ°λ λ μμ±ν λ μ΅λ κ°μλ₯Ό μ§μ ν΄λ³Έλ€.
μ€λ λ ν λμ μ리
-
μ°λ¦¬κ° λ§λ μ΄ν리μΌμ΄μ μμ μ¬μ©μλ‘λΆν° λ€μ΄μ¨ μμ²μ μμ νμ λ£κ³ μ€λ λνμ μμ νμ λ€μ΄μ¨ Task μΌκ°μ 미리 μμ±ν΄λμ Threadλ€μκ² μΌκ°μ ν λΉνλ€.
-
μΌμ λ€ μ²λ¦¬ν Threadλ€μ λ€μ μ΄ν리μΌμ΄μ μκ² κ²°κ³Όκ°μ 리ν΄νλ€.
-
μλ°μμλ μ€λ λνμ μμ±νκ³ μ¬μ©ν μ μλλ‘ java.util.concurrent Packageμμ ExecutorService μΈν°νμ΄μ€μ Executors ν΄λμ€λ₯Ό μ 곡νκ³ μλ€.
-
Executorsμ λ€μν μ μ λ©μλλ₯Ό ν΅ν΄ ExecutorService ꡬνκ°μ²΄λ₯Ό λ§λ€μ΄μ μ¬μ©ν μ μμΌλ©°, κ·Έκ²μ΄ λ°λ‘ μ€λ λ νμ΄λ€.
Hashtableκ³Ό HashMapμ μ°¨μ΄μ μ 무μμΈκ°μ?
μ€νλ§ μνλ¦¬ν° μΈμ¦ κ³Όμ
[μ°Έκ³ ] μλ° https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
ν΄μ맡과 ν΄μ ν μ΄λΈ https://www.javatpoint.com/difference-between-hashmap-and-hashtable