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μ½”μ–΄ μˆ˜κ°€ 적으면 μ“°λ ˆλ“œλ₯Ό κ·Έ 만큼 λ§Œλ“€ 수 μ—†κΈ° λ•Œλ¬Έμ— λ“œλΌλ§ˆν‹±ν•˜κ²Œ 빨라지지 μ•Šκ³ , μ²˜λ¦¬ν•˜λŠ” 데이터 양이 적을 λ•Œμ—λ„ 속도가 많이 빨라지지 μ•ŠκΈ° λ•Œλ¬Έμ— μ“°λ ˆλ“œλ₯Ό μ μ ˆν•œ κ²½μš°μ— μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ λŒ€μ‹  λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 이유? μ˜λ―ΈλŠ”?

ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ 개 ν‚€λŠ” 것보닀 ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨ μ•ˆμ—μ„œ μ—¬λŸ¬ μž‘μ—…μ„ ν•΄κ²°ν•˜λŠ” 것이닀.

μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€(λ©€ν‹° ν”„λ‘œμ„ΈμŠ€)둜 ν•  수 μžˆλŠ” μž‘μ—…λ“€μ„ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œλ‘œ λ‚˜λˆ κ°€λ©΄μ„œ ν•˜λŠ” 이유?

μžμ›μ˜ νš¨μœ¨μ„± μ¦λŒ€ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ‘œ μ‹€ν–‰λ˜λŠ” μž‘μ—…μ„ λ©€ν‹° μŠ€λ ˆλ“œλ‘œ μ‹€ν–‰ν•  경우, ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜μ—¬ μžμ›μ„ ν• λ‹Ήν•˜λŠ” μ‹œμŠ€ν…œ 콜이 쀄어듀어 μžμ›μ„ 효율적으둜 관리할 수 μžˆλ‹€.

multi-proccess-thread

μ“°λ ˆλ“œ 세이프 (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을 μ°μ–΄λ²„λ¦¬λŠ” κ²°κ³Όκ°€ λ‚˜μ˜¬ 수 있기 λ•Œλ¬Έμ΄λ‹€.

μ΄λ ‡κ²Œλ˜λ©΄ κ°œλ°œμžκ°€ κΈ°λŒ€ν•˜λŠ” λŒ€λ‘œ ν”„λ‘œκ·Έλž¨μ΄ μˆ˜ν–‰λ˜μ§€ μ•Šκ²Œ λ˜λŠ” 것이닀.

ν•΄κ²° 방법

  1. synchronizedλ₯Ό ν†΅ν•΄μ„œ ν•΄λ‹Ή 인수(unsafeDateFormat)에 락을 κ±Έμ–΄μ„œ μ“°λ ˆλ“œλΌλ¦¬ λ™μ‹œμ— μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ 막은 것이닀.

  2. unsafeDateFormat 객체λ₯Ό μ“°λ €κ³ ν•˜λ©΄ μ“°κ³ μžˆλŠ”μ§€ κ²€μ‚¬ν•΄μ„œ κΈ°λ‹€λ¦¬κ²Œ ν•˜κ±°λ‚˜ μ‚¬μš©ν•˜κ²Œ ν•΄μ€€λ‹€.

static-field에 객체λ₯Ό λ„£μ„λ•ŒλŠ” thread-safeλ₯Ό κΌ­ 확인

  • ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간은 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의 차이점은 λ¬΄μ—‡μΈκ°€μš”?

collection-map-interface

https://www.notion.so/Data-Structure-508312c0e9424829b847bf8c298d1679?p=55a872b8df3d4fb58a281f09aadf7068&showMoveTo=true

μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° 인증 κ³Όμ •

security

[μ°Έκ³ ] μžλ°” https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

ν•΄μ‹œλ§΅κ³Ό ν•΄μ‹œ ν…Œμ΄λΈ” https://www.javatpoint.com/difference-between-hashmap-and-hashtable