week 3 jisoo - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

Java8의 heap λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό μ„€λͺ…ν•΄μ£Όμ„Έμš” 그리고 νž™μ˜μ—­κ³Ό μŠ€νƒμ˜μ—­μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•˜μ‹œμ˜€

Runtime Data Area

JVM의 λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ˜λŠ” 데이터듀을 μ €μž₯ν•˜λŠ” μ˜μ—­μ΄λ‹€.

JVM이 운영체제 μœ„μ—μ„œ μ‹€ν–‰λ˜λ©΄μ„œ ν• λ‹Ήλ°›λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‹€. Class Loaderμ—μ„œ μ€€λΉ„ν•œ 데이터듀을 λ³΄κ΄€ν•˜λŠ” μ €μž₯μ†Œμ΄λ‹€.

이 μ˜μ—­μ€ 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack둜 λ‚˜λˆŒ 수 μžˆλ‹€.

이쀑에 Heap μ˜μ—­κ³Ό Stack μ˜μ—­μ„ 비ꡐ해보렀 ν•œλ‹€.

Heap area (νž™ μ˜μ—­)

  • JVM이 κ΄€λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨ μƒμ—μ„œ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ λŸ°νƒ€μž„ μ‹œ λ™μ μœΌλ‘œ ν• λ‹Ήν•˜μ—¬ μ‚¬μš©ν•˜λŠ” μ˜μ—­μ΄λ‹€.
  • New μ—°μ‚°μžλ‘œ μƒμ„±λœ 객체 λ˜λŠ” 객체(μΈμŠ€ν„΄μŠ€)와 배열을 μ €μž₯ν•œλ‹€.
  • νž™ μ˜μ—­μ— μƒμ„±λœ 객체와 배열은 μŠ€νƒ μ˜μ—­μ˜ λ³€μˆ˜λ‚˜ λ‹€λ₯Έ 객체의 ν•„λ“œμ—μ„œ μ°Έμ‘°ν•œλ‹€.
  • μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜λ‚˜ ν•„λ“œκ°€ μ—†λ‹€λ©΄ 의미 μ—†λŠ” 객체가 λ˜μ–΄ GC의 λŒ€μƒμ΄ λœλ‹€.
  • νž™ μ˜μ—­μ˜ μ‚¬μš©κΈ°κ°„ 및 μŠ€λ ˆλ“œ 곡유 λ²”μœ„ 객체가 더 이상 μ‚¬μš©λ˜μ§€ μ•Šκ±°λ‚˜ λͺ…μ‹œμ μœΌλ‘œ null μ„ μ–Έ μ‹œ GC(Garbage Collection) λŒ€μƒ ꡬ성 λ°©μ‹μ΄λ‚˜ GC 방법은 JVM λ²€λ”λ§ˆλ‹€ λ‹€λ₯Ό 수 μžˆλ‹€. λͺ¨λ“  μŠ€λ ˆλ“œμ—μ„œ κ³΅μœ ν•œλ‹€.

Stack area (μŠ€νƒ μ˜μ—­)

지역 λ³€μˆ˜, νŒŒλΌλ―Έν„°, 리턴 κ°’, 연산에 μ‚¬μš©λ˜λŠ” μž„μ‹œ 값등이 μƒμ„±λ˜λŠ” μ˜μ—­μ΄λ‹€.

int a = 10; μ΄λΌλŠ” μ†ŒμŠ€λ₯Ό μž‘μ„±ν–ˆλ‹€λ©΄ μ •μˆ˜κ°’μ΄ 할당될 수 μžˆλŠ” λ©”λͺ¨λ¦¬κ³΅κ°„을 a라고 μž‘μ•„λ‘κ³  κ·Έ λ©”λͺ¨λ¦¬ μ˜μ—­μ— 값이 10이 λ“€μ–΄κ°„λ‹€. 즉, μŠ€νƒμ— λ©”λͺ¨λ¦¬μ— 이름이 a라고 λΆ™μ—¬μ£Όκ³  값이 10인 λ©”λͺ¨λ¦¬ 곡간을 λ§Œλ“ λ‹€.

클래슀 Person p = new Person(); μ΄λΌλŠ” μ†ŒμŠ€λ₯Ό μž‘μ„±ν–ˆλ‹€λ©΄ Person pλŠ” μŠ€νƒ μ˜μ—­μ— μƒμ„±λ˜κ³  new둜 μƒμ„±λœ Person 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” νž™ μ˜μ—­μ— μƒμ„±λœλ‹€.

그리고 μŠ€νƒμ˜μ—­μ— μƒμ„±λœ p의 κ°’μœΌλ‘œ νž™ μ˜μ—­μ˜ μ£Όμ†Œκ°’μ„ 가지고 μžˆλ‹€. 즉, μŠ€νƒ μ˜μ—­μ— μƒμ„±λœ pκ°€ νž™ μ˜μ—­μ— μƒμ„±λœ 객체λ₯Ό 가리킀고(μ°Έμ‘°ν•˜κ³ ) μžˆλŠ” 것이닀.

λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ κ°œλ³„μ μœΌλ‘œ μŠ€νƒμ΄ μƒμ„±λœλ‹€.

  • 각 μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•˜λ©°, μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ ν• λ‹Ήλœλ‹€.
  • λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ ν”„λ ˆμž„(Frame)을 μΆ”κ°€(push)ν•˜κ³  λ©”μ†Œλ“œκ°€ μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή ν”„λ ˆμž„μ„ 제거(pop)ν•˜λŠ” λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.
  • μ„ μž…ν›„μΆœ(FILO, First In Last Out) ꡬ쑰둜 push와 pop κΈ°λŠ₯ μ‚¬μš©
  • λ©”μ†Œλ“œ 호좜 μ‹œ μƒμ„±λ˜λŠ” μŠ€λ ˆλ“œ μˆ˜ν–‰μ •λ³΄λ₯Ό κΈ°λ‘ν•˜λŠ” Frame을 μ €μž₯
  • λ©”μ†Œλ“œ 정보, μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, μ—°μ‚° 쀑 λ°œμƒν•˜λŠ” μž„μ‹œ 데이터 μ €μž₯
  • κΈ°λ³Έ(μ›μ‹œ)νƒ€μž… λ³€μˆ˜λŠ” μŠ€νƒ μ˜μ—­μ— 직접 값을 가진닀.
  • μ°Έμ‘°νƒ€μž„ λ³€μˆ˜λŠ” νž™ μ˜μ—­μ΄λ‚˜ λ©”μ†Œλ“œ μ˜μ—­μ˜ 객체 μ£Όμ†Œλ₯Ό 가진닀.

μžλ°”8μ—μ„œ μ†Œκ°œλœ λžŒλ‹€μ‹κ³Ό λ©”μ†Œλ“œ 레퍼런슀λ₯Ό μ„€λͺ…ν•˜λΌ.

1. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λž€?

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ ν•¨μˆ˜μ˜ μž…λ ₯λ§Œμ„ μ˜μ‘΄ν•˜μ—¬ 좜λ ₯을 λ§Œλ“œλŠ” ꡬ쑰둜 μ™ΈλΆ€μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 것을 μ§€μ–‘ν•˜λŠ” νŒ¨λŸ¬λ‹€μž„μœΌλ‘œ λΆ€μž‘μš© λ°œμƒμ„ μ΅œμ†Œν™”ν•˜λŠ” 방법둠.

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 쑰건

  • μˆœμˆ˜ν•œ ν•¨μˆ˜

    • ν•¨μˆ˜μ˜ 싀행이 μ™ΈλΆ€μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμŒ.
    • λ©€ν‹°μ“°λ ˆλ“œμ—μ„œλ„ μ•ˆμ „ν•˜κ³ , λ³‘λ ¬μ²˜λ¦¬ 및 계산 κ°€λŠ₯
    • 였직 μž…λ ₯에 μ˜ν•΄μ„œλ§Œ 좜λ ₯이 정해짐. ν™˜κ²½μ΄λ‚˜ μƒνƒœμ— 영ν–₯을 λ°›μ•„μ„  μ•ˆλ¨!
  • 읡λͺ… ν•¨μˆ˜

    • 이름이 μ—†λŠ” ν•¨μˆ˜
    • λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„
  • 고계 ν•¨μˆ˜

    • ν•¨μˆ˜λ₯Ό λ‹€λ£¨λŠ” μƒμœ„μ˜ ν•¨μˆ˜
    • ν•¨μˆ˜λ„ ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ μ·¨κΈ‰
    • ν•¨μˆ˜μ˜ 인자둜 ν•¨μˆ˜λ₯Ό 전달 κ°€λŠ₯
    • β‡’ 일급 객체 (일급 ν•¨μˆ˜)

    JAVAμ—λŠ” ν•¨μˆ˜μ˜ κ°œλ…μ΄ μ—†μ—ˆλ‹€.

    μžλ°”μ˜ λ©”μ†Œλ“œλŠ” 일급 ν•¨μˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ λ‹€λ₯Έ λ©”μ†Œλ“œμ˜ 인자둜 전달할 μˆ˜λ„ μ—†μ—ˆλ‹€.

    λ˜ν•œ μžλ°”λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ„±μœΌλ‘œ λ©”μ†Œλ“œλŠ” 객체의 ν–‰μœ„λ₯Ό μ •μ˜ν•˜κ³  객체의 μƒνƒœλ₯Ό λ³€κ²½ν•œλ‹€.

    λ•Œλ¬Έμ— JAVA8μ—μ„œ 단 ν•˜λ‚˜μ˜ λ©”μ†Œλ“œλ§Œμ΄ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€μΈ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•œλ‹€.

    ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 경우 λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„μ΄ κ°€λŠ₯ν•  수 있게 μ œκ³΅λ˜μ—ˆλ‹€.

    • 순수 ν•¨μˆ˜ 만쑱 : λžŒλ‹€μ‹ ν‘œν˜„μ„ 톡해 μž…λ ₯을 ν†΅ν•΄μ„œλ§Œ 좜λ ₯이 결정됨
    • 읡λͺ… ν•¨μˆ˜ 만쑱 : λžŒλ‹€μ‹μ„ μ΄μš©ν•˜μ—¬ 읡λͺ… ν•¨μˆ˜ μ •μ˜ κ°€λŠ₯
    • 고계 ν•¨μˆ˜ 만쑱 : ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ†Œλ“œμ—μ„œ λ˜λ‹€λ₯Έ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 인자둜 λ°›μ„μˆ˜ 있음.

    β‡’ 즉 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ λžŒλ‹€μ‹μ˜ λ„μž…μœΌλ‘œ JAVAλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 쑰건을 만쑱 ν•˜κ²Œ 됨.


2. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

  • Java8μ—μ„œλŠ” ν•¨μˆ˜λ₯Ό μΌκΈ‰κ°μ²΄μ²˜λŸΌ λ‹€λ£° 수 있게 **ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€**λ₯Ό μ œκ³΅ν•œλ‹€. = λžŒλ‹€μ‹μ„ 닀루기 μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€

  • λžŒλ‹€μ‹κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œκ°€ 1:1둜 μ—°κ²°λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 단 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ κ°€μ§€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ˜λ―Έν•œλ‹€.

     (staticν•¨μˆ˜λŠ” μ—¬λŸ¬ 개 κ°€μ§ˆ 수 μžˆλ‹€.)
    
  • μΌκΈ‰κ°μ²΄λž€ μ•„λž˜ 쑰건을 λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.

  • **λ³€μˆ˜μ— 값을 ν• λ‹Ή ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

  • ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ‘œ λ„˜κ²¨μ€„ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

  • ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ 될 수 μžˆμ–΄μ•Ό ν•œλ‹€.**

  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•¨μœΌλ‘œμ„œ 객체λ₯Ό μ„ μ–Έν•˜κ³  μ˜€λ²„λΌμ΄λ”©ν•˜λŠ”... 이런 번거둜운 μž‘μ—…λ“€μ„ μ—†μ• κ³  λ‹¨μˆœνžˆ λžŒλ‹€μ‹ ν•¨μˆ˜λ₯Ό 톡해 μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μž‘μ„± ν•  수 μžˆλ‹€.


3. λžŒλ‹€μ‹

java의 ν°λ³€ν™”λŠ” jdk1.5λΆ€ν„° μΆ”κ°€λœ μ œλ„€λ¦­μŠ€μ˜ λ“±μž₯이고, 또 ν•œλ²ˆμ€ jdk 1.8λΆ€ν„° μΆ”κ°€λœ λžŒλ‹€μ‹μ˜ λ“±μž₯이닀.

λžŒλ‹€μ‹μ˜ λ„μž…μœΌλ‘œ 인해 이제 μžλ°”λŠ” 객체지ν–₯언어인 λ™μ‹œμ— ν•¨μˆ˜ν˜• μ–Έμ–΄κ°€ λ˜μ—ˆλ‹€.

λžŒλ‹€μ‹μ΄λž€ κ°„λ‹¨νžˆ λ§ν•΄μ„œ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•œ 것이닀. λ©”μ„œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ©”μ„œλ“œμ˜ 이름과 λ°˜ν™˜κ°’μ΄ μ—†μ–΄μ§€λ―€λ‘œ, λžŒλ‹€μ‹μ„ 읡λͺ…ν•¨μˆ˜λΌκ³ λ„ ν•œλ‹€.

λžŒλ‹€μ‹ 문법은 μ»΄νŒŒμΌλŸ¬κ°€ 읡λͺ… 클래슀둜 λ³€ν™˜ν•œλ‹€. 즉, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ κ΅¬ν˜„ν•˜λ„λ‘ μœ„μž„ν•˜λŠ” ν˜•νƒœλΌ λ³Ό 수 μžˆλ‹€

int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random()*5) +1);

// μœ„ λžŒλ‹€μ‹μ€ μ•„λž˜ λ©”μ„œλ“œμ™€ κ°™λ‹€.
int method() {
		return (int)(Math.random()*5) + 1;
}

κΈ°μ‘΄μ—λŠ” λͺ¨λ“  λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— ν¬ν•¨λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ, ν΄λž˜μŠ€λ„ μƒˆλ‘œ λ§Œλ“€μ–΄μ•Ό ν•˜κ³ , 객체도 μƒμ„±ν•΄μ•Όλ§Œ λΉ„λ‘œμ†Œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμ—ˆλŠ”λ°, λžŒλ‹€μ‹μ€ 이 λͺ¨λ“  과정없이 였직 λžŒλ‹€μ‹ 자체만으둜 λ©”μ„œλ“œμ˜ 역할을 λŒ€μ‹ ν•  수 μžˆλ‹€.

κ²Œλ‹€κ°€ λžŒλ‹€μ‹μ€ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜μ–΄μ§€λŠ” 것이 κ°€λŠ₯ν•˜κ³ , λ©”μ„œλ“œμ˜ 결과둜 λ°˜ν™˜λ  수 μžˆλ‹€. λžŒλ‹€μ‹μœΌλ‘œ 인해 λ©”μ„œλ“œλ₯Ό λ³€μˆ˜μ²˜λŸΌ λ‹€λ£¨λŠ” 것이 κ°€λŠ₯해진 것이닀.

  • λ©”μ„œλ“œμ™€ ν•¨μˆ˜μ˜ 차이 : 객체지ν–₯ κ°œλ…μ—μ„œλŠ” ν•¨μˆ˜ λŒ€μ‹  객체의 ν–‰μœ„λ‚˜ λ™μž‘μ„ μ˜λ―Έν•˜λŠ” λ©”μ„œλ“€λŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν–ˆλ‹€. (λ©”μ„œλ“œλŠ” 객체에 λ°˜λ“œμ‹œ 속해야함). κ·ΈλŸ¬λ‚˜ 이제 λ‹€μ‹œ λžŒλ‹€μ‹μ„ 톡해 λ©”μ„œλ“œκ°€ ν•˜λ‚˜μ˜ 독립적인 κΈ°λŠ₯을 ν•˜κΈ°λ•Œλ¬Έμ— ν•¨μˆ˜λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

λ©”μ†Œλ“œ λ ˆνΌλŸ°μŠ€λž€

λ©”μ†Œλ“œ 레퍼런슀(Method Reference)λŠ” Lambda ν‘œν˜„μ‹μ„ 더 κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ν•˜λŠ” 방법이닀.

λ©”μ„œλ“œ λ ˆνΌλŸ°μŠ€λŠ” μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ λ©”μ„œλ“œμ˜ 레퍼런슀λ₯Ό μ „λ‹¬ν•œλ‹€λŠ” 의미이며, λžŒλ‹€ν‘œν˜„μ‹μ—μ„œ λ©”μ„œλ“œ 호좜 1회둜 μ½”λ“œκ°€ λλ‚˜λŠ” 경우 λ©”μ„œλ“œ 레퍼런슀λ₯Ό μ΄μš©ν•΄ 이미 쀄인 μ½”λ“œλ₯Ό 더 μ€„μΌμˆ˜λ„μžˆλ‹€.

λ©”μ„œλ“œμ˜ λ ˆνΌλŸ°μŠ€λΌκ³ ν•˜μ§€λ§Œ μ—„λ°€νžˆ 말해 μžλ°”μ—μ„œμ˜ λ©”μ„œλ“œλŠ” 일급 객체가 μ•„λ‹ˆκΈ°λ•Œλ¬Έμ— 객체의 레퍼런슀λ₯Ό μ „λ‹¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€.

Method Referenceλ₯Ό λ§Œλ“œλŠ” μœ ν˜•μ—λŠ” λ‹€μŒ 3가지가 μžˆλ‹€.

  1. 정적 λ©”μ„œλ“œ μ°Έμ‘°: Integer의 parseIntλ₯Ό Integer::parseInt둜 μ‚¬μš© κ°€λŠ₯
  2. λ‹€μ–‘ν•œ ν˜•μ‹μ˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘°: String의 length λ©”μ„œλ“œλ₯Ό String::length둜 μ‚¬μš© κ°€λŠ₯
  3. κΈ°μ‘΄ 객체의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘°: Transaction 객체λ₯Ό 할당받은 transaction 지역 λ³€μˆ˜κ°€ 있고, Transaction κ°μ²΄μ—λŠ” getValue λ©”μ„œλ“œκ°€ μžˆλ‹€λ©΄, transaction::getValue둜 μ‚¬μš© κ°€λŠ₯

1. 정적 λ©”μ„œλ“œ μ°Έμ‘° (정적 클래슀::λ©”μ„œλ“œλͺ…)

: νŒŒλΌλ―Έν„°λ‘œ 전달받은 λ³€μˆ˜μ˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , μ •μ  λ©”μ„œλ“œμ˜ 인자둜 μ‚¬μš©λ¨. (String x) -> Integer.parseInt(x) 의 경우 νŒŒλΌλ―Έν„° xλ₯Ό parseInt의 인자둜 μ‚¬μš©λ˜λŠ” 것을 λ³Ό 수 있음.

Function<String, Integer> f = Integer::parseInt;
Integer result = f.apply("123");

좜처: https://multifrontgarden.tistory.com/126 [μš°λ¦¬μ§‘μ•žλ§ˆλ‹Ή]

Integer 클래슀의 정적 λ©”μ„œλ“œμΈ parseInt()λ₯Ό λ©”μ„œλ“œ 레퍼런슀둜 μ „λ‹¬ν•˜λŠ” μ˜ˆμ‹œλ₯Ό μƒκ°ν•΄λ³΄μž. ν•΄λ‹Ή κ΅¬ν˜„μ²΄ μ†ŒμŠ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ§€μ—­λ³€μˆ˜λŠ” String νƒ€μž…μ˜ str밖에 μ—†λ‹€. 그리고 λ¦¬ν„΄νƒ€μž…μ€ μ œλ„€λ¦­μ„ μ΄μš©ν•΄ Integerλ₯Ό κ±΄λ„€μ€˜μ•Όν•˜λŠ”κ±Έ μΆ”λ‘ ν•  수 μžˆλ‹€. λ•Œλ¬Έμ— λ©”μ„œλ“œλ§Œ 전달해주면 μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ ν˜ΈμΆœν•΄μ£ΌλŠ”κ²ƒμ΄λ‹€.

2. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘°

: 1번과 λΉ„μŠ·ν•œλ° 차이점이라면 정적 λ©”μ„œλ“œμ˜ μΈμžκ°€ μ•„λ‹Œ κΈ°μ‘΄μ— 이미 μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ˜ 인자둜 μ‚¬μš© λœλ‹€.

인자의 νƒ€μž…μ΄ λͺ…ν™•ν• λ•Œ ν•΄λ‹Ή νƒ€μž… 클래슀::λ©”μ„œλ“œλͺ… ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•œλ‹€.

Function<String, Boolean> f = String::isEmpty;
Boolean result = f.apply("123");

3. μƒμ„±μž λ©”μ„œλ“œ μ°Έμ‘°

: Constructor λ©”μ†Œλ“œ λ ˆνΌλŸ°μŠ€λŠ” Constructorλ₯Ό μƒμ„±ν•΄μ£ΌλŠ” μ½”λ“œμ΄λ‹€.

public static class Company {
    String name;
    public Company(String name) {
        this.name = name;
    }

    public void printName() {
        System.out.println(name);
    }
}

public static void main(String args[]) {
		List<String> companies = Arrays.asList("google", "apple", "google", "apple", "samsung");
		companies.stream()
			      .map(Company::new)
		        .forEach(Company::printName);
}

μœ„ 예제 μ½”λ“œμ—μ„œ Company::new 의 μ˜λ―ΈλŠ” name -> new Company(name)와 κ°™λ‹€.

checked-exception VS unchecked-exception 차이점을 μ„€λͺ…ν•΄λ³΄μ„Έμš”.

μ˜ˆμ™Έ 클래슀의 ꡬ쑰

  • λͺ¨λ“  μ˜ˆμ™Έν΄λž˜μŠ€λŠ” Throwable 클래슀λ₯Ό 상속받고 있으며, Throwable은 μ΅œμƒμœ„ 클래슀 Object의 μžμ‹ ν΄λž˜μŠ€μ΄λ‹€.

Throwable을 μƒμ†λ°›λŠ” ν΄λž˜μŠ€λŠ” Error와 Exception이 μžˆλ‹€.

  • ErrorλŠ” μ‹œμŠ€ν…œ 레벨의 μ‹¬κ°ν•œ μˆ˜μ€€μ˜ μ—λŸ¬μ΄κΈ° λ•Œλ¬Έμ— μ‹œμŠ€ν…œμ— λ³€ν™”λ₯Ό μ£Όμ–΄ 문제λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μΌλ°˜μ μ΄λ‹€.

  • 반면 Exception은 κ°œλ°œμžκ°€ λ‘œμ§μ„ μΆ”κ°€ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆλ‹€.

  • Exception은 μˆ˜λ§Žμ€ μžμ‹ν΄λž˜μŠ€λ₯Ό 가지고 μžˆλ‹€. κ·Έ 쀑 RuntimeException을 μ£Όλͺ©ν•΄μ•Ό ν•œλ‹€.

  • RuntimeException은 CheckedExceptionκ³Ό UncheckedException을 κ΅¬λΆ„ν•˜λŠ” 기쀀이닀.

  • Exception의 μžμ‹ 클래슀 쀑 RuntimeException을 μ œμ™Έν•œ λͺ¨λ“  ν΄λž˜μŠ€λŠ” CheckedException이며,

  • RuntimeExceptionκ³Ό 그의 μžμ‹ ν΄λž˜μŠ€λ“€μ„ Unchecked Exception이라 λΆ€λ₯Έλ‹€.

CheckedExceptionκ³Ό UncheckedException에 λŒ€ν•΄ 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μž.

  • Checked Exceptionκ³Ό Unchecked Exception의 κ°€μž₯ λͺ…ν™•ν•œ ꡬ뢄 기쀀은 β€˜κΌ­ 처리λ₯Ό ν•΄μ•Ό ν•˜λŠλƒβ€™μ΄λ‹€.

  • Checked Exception이 λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” λ©”μ†Œλ“œλΌλ©΄ λ°˜λ“œμ‹œ λ‘œμ§μ„ try/catch둜 κ°μ‹Έκ±°λ‚˜ throw둜 λ˜μ Έμ„œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.

  • λ°˜λ©΄μ— Unchecked Exception은 λͺ…μ‹œμ μΈ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. 이 μ˜ˆμ™ΈλŠ” ν”Όν•  수 μžˆμ§€λ§Œ κ°œλ°œμžκ°€ λΆ€μ£Όμ˜ν•΄μ„œ λ°œμƒν•˜λŠ” κ²½μš°κ°€ λŒ€λΆ€λΆ„μ΄κ³ , 미리 μ˜ˆμΈ‘ν•˜μ§€ λͺ»ν–ˆλ˜ μƒν™©μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— ꡳ이 둜직으둜 처리λ₯Ό ν•  ν•„μš”κ°€ 없도둝 λ§Œλ“€μ–΄μ Έ μžˆλ‹€.

  • λ˜ν•œ μ˜ˆμ™Έλ₯Ό 확인할 수 μžˆλŠ” μ‹œμ μ—μ„œλ„ ꡬ뢄할 수 μžˆλ‹€. 일반적으둜 컴파일 λ‹¨κ³„μ—μ„œ λͺ…ν™•ν•˜κ²Œ Exception 체크가 κ°€λŠ₯ν•œ 것을 Checked Exception이라 ν•˜λ©°, μ‹€ν–‰κ³Όμ • 쀑 μ–΄λ– ν•œ νŠΉμ • 논리에 μ˜ν•΄ λ°œκ²¬λ˜λŠ” Exception을 Unchecked Exception이라 ν•œλ‹€.

  • λ”°λΌμ„œ 컴파일 λ‹¨κ³„μ—μ„œ 확인할 수 μ—†λŠ” μ˜ˆμ™ΈλΌ ν•˜μ—¬ Unchecked Exception이며, μ‹€ν–‰κ³Όμ • 쀑 λ°œκ²¬λœλ‹€ ν•˜μ—¬μ„œ Runtime Exception이라 ν•˜λŠ” 것이닀.

  • λ˜ν•œ Checked Exception / Unchecked Exception μ˜ˆμ™Έλ°œμƒμ‹œ νŠΈλžœμž­μ…˜μ˜ roll-back 여뢀도 λ‹€λ₯΄λ‹€.

  • 기본적으둜 Checked Exception은 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ νŠΈλžœμž­μ…˜μ„ roll-backν•˜μ§€ μ•Šκ³  μ˜ˆμ™Έλ₯Ό λ˜μ Έμ€€λ‹€.

  • ν•˜μ§€λ§Œ Unchecked Exception은 μ˜ˆμ™Έ λ°œμƒ μ‹œ νŠΈλžœμž­μ…˜μ„ roll-backν•œλ‹€λŠ” μ μ—μ„œ 차이가 μžˆλ‹€.

  • νŠΈλžœμž­μ…˜μ˜ μ „νŒŒλ°©μ‹ 즉, μ–΄λ–»κ²Œ λ¬Άμ–΄λ†“λŠλƒμ— λ”°λΌμ„œ Checked Exception이냐 Unchecked Exceptionμ΄λƒμ˜ 영ν–₯도가 크닀.
    roll-back이 λ˜λŠ” λ²”μœ„κ°€ 달라지기 λ•Œλ¬Έμ— κ°œλ°œμžκ°€ 이λ₯Ό μΈμ§€ν•˜μ§€ λͺ»ν•˜λ©΄, μ‹€ν–‰κ²°κ³Όκ°€ λ§žμ§€ μ•Šκ±°λ‚˜ μ˜ˆμƒμΉ˜ λͺ»ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ 이λ₯Ό μΈμ§€ν•˜κ³  νŠΈλžœμž­μ…˜μ„ μ μš©μ‹œν‚¬ λ•Œ μ „νŒŒλ°©μ‹(propagation behavior)κ³Ό λ‘€λ°±κ·œμΉ™ 등을 적절히 μ‚¬μš©ν•˜λ©΄ λ”μš± 효율적인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬ν˜„ν•  수 μžˆμ„ 것이닀.

@Service, @Component의 μ°¨μ΄λŠ” 무엇인가?

@Service, @Controller, @Repository β‡’ {@Component + 더 νŠΉλ³„ν•œ κΈ°λŠ₯}

@Component

Spring의 IoC μ»¨ν…Œμ΄λ„ˆμ—μ„œ κ΄€λ¦¬λ˜λŠ” κ°μ²΄μž„μ„ ν‘œμ‹œν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κ°€μž₯ 기본적인 annotation이닀. 즉, scan-auto-detectionκ³Ό dependency injection을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©λ˜λŠ” κ°€μž₯ κΈ°λ³Έ μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€.

이외에 λ‚˜λ¨Έμ§€ @Service, @Controller, @Repository μ–΄λ…Έν…Œμ΄μ…˜μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ ˆμ΄μ–΄λ₯Ό λΆ„λ¦¬ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

@Controller

Web MVC μ½”λ“œμ— μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€. @RequestMapping μ–΄λ…Έν…Œμ΄μ…˜μ„ ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜ λ°‘μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

@Repository

λ‹€ μ•Œκ³  μžˆλ“―μ΄ data repositoryλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€. @RepositoryλŠ” ν”Œλž«νΌ νŠΉμ • exception을 μž‘μ•„ Spring의 unchecked exception으둜 뱉어내쀀닀. ( PersistenceExceptionTranslationPostProcessor )

@Service

λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ΄λ‚˜ respository layer ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜μ— μ‚¬μš©λœλ‹€. λ‹€λ₯Έ μ–΄λ…Έν…Œμ΄μ…˜κ³Ό λ‹€λ₯΄κ²Œ @Component에 μΆ”κ°€λœ κΈ°λŠ₯은 μ—†λ‹€. ν•˜μ§€λ§Œ λ‚˜μ€‘μ— Spring μΈ‘μ—μ„œ 좔가적인 exception handling을 해쀄 μˆ˜λ„ μžˆμœΌλ‹ˆ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—λŠ” ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μž.

μŠ€ν”„λ§ MVC μ›Ή μš”μ²­ μ²˜λ¦¬κ³Όμ •μ„ μ„€λͺ…ν•˜μ‹œμ˜€

Spring MVC의 μ²˜λ¦¬κ³Όμ •

  1. ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ DispatcherServlet에 전달
  2. DispatcherServlet은 HandlerMapping을 μ‚¬μš©, ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•  컨트둀러 객체λ₯Ό 찾음
  3. DispatcherServlet은 컨트둀 객체의 handleRequest() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬, ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•œλ‹€.
  4. Controller.handleRequest() λ©”μ†Œλ“œλŠ” 처리 κ²°κ³Ό 정보λ₯Ό 담은 ModelAndView 객체λ₯Ό λ¦¬ν„΄ν•œλ‹€.
  5. DispatcherServlet은 ViewResolver둜 λΆ€ν„° 처리결과λ₯Ό 보여쀄 Viewλ₯Ό κ΅¬ν•œλ‹€.
  6. ViewλŠ” ν΄λΌμ΄μ–ΈνŠΈμ— 전솑할 응닡을 μƒμ„±ν•œλ‹€.

Spring MVC κ΅¬μ„±μš”μ†Œ

  1. DispatcherServlet : ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ 전달받아 μš”μ²­μ— λ§žλŠ” μ»¨νŠΈλ‘€λŸ¬κ°€ λ¦¬ν„΄ν•œ 결과값을 View에 μ „λ‹¬ν•˜μ—¬ μ•Œλ§žμ€ 응닡을 μƒμ„±ν•œλ‹€.
  2. HandlerMapping : ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ URL을 μ–΄λ–€ μ»¨νŠΈλ‘€λŸ¬κ°€ μ²˜λ¦¬ν• μ§€ κ²°μ •
  3. Controller : ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•œ λ’€, κ²°κ³Όλ₯Ό DispatcherServletμ—κ²Œ 리턴
  4. ModelAndView : μ»¨νŠΈλ‘€λŸ¬κ°€ μ²˜λ¦¬ν•œ κ²°κ³Ό 정보 및 λ·° 선택에 ν•„μš”ν•œ 정보듀 λ‹΄μŒ
  5. ViewResolver : 컨트둀러의 처리 κ²°κ³Όλ₯Ό 생성 ν•  λ·°λ₯Ό κ²°μ •
  6. View : 컨트둀러의 처리 κ²°κ³Ό 화면을 생성

좜처: https://csw7432.tistory.com/entry/Spring-MVC-μ£Όμš”-ꡬ성-μš”μ†Œ-및-처리-흐름 [μ΅œλŠλ‹˜ ν”„μ•Œλͺ»]

@EnableWebMvc λŠ” 어디에 ν•„μš”ν•œμ§€ μ„€λͺ…ν•˜μ‹œμ˜€

Annotation기반의 μŠ€ν”„λ§ MVCλ₯Ό μ‚¬μš©ν•  λ•Œμ— 섀정을 νŽΈν•˜κ²Œ ν•΄μ£ΌλŠ” κΈ°λŠ₯을 ν•œλ‹€. μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈ μ„€μ • νŒŒμΌμ— @EnableWebMvcλ₯Ό λΆ™μ—¬μ£Όλ©΄ 이 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈ μ„€μ •νŒŒμΌμ„ μ‚¬μš©ν•˜κ³  μžˆλŠ” DispatcherServlet이 κ°–κ²Œ λ˜λŠ” μ—¬λŸ¬κ°€μ§€ μ „λž΅λ“€μ— λ³€ν™” ν˜Ήμ€ μΆ”κ°€κ°€ 생기고 μ»€μŠ€ν„°λ§ˆμ΄μ§• ν•˜κΈ°κ°€ 더 μš©μ΄ν•΄μ§„λ‹€.
@EnableWebMvcλ₯Ό 톡해 μΆ”κ°€λœ beanλ“€μ˜ 섀정을 μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜κ²Œ ν•˜λŠ” μ›λ¦¬λŠ” 'μœ„μž„'ꡬ쑰이닀. @EnableWebMvc에 듀어가보면 μ—¬λŸ¬ λ‚΄μž₯ ν•¨μˆ˜λ“€μ΄ WebMvcConfigurerComposite의 섀정을 μž‘μ•„μ£Όλ„λ‘ μƒμ„±λ˜μ–΄μžˆλ‹€. λ”°λΌμ„œ 이λ₯Ό μš°λ¦¬κ°€ μ›ν•˜λŠ” λŒ€λ‘œ μ»€μŠ€ν„°λ§ˆμ΄μ§• ν•˜κΈ° μœ„ν•΄μ„œλŠ” WebMvcConfigurerλ₯Ό μƒμ†ν•˜λ„λ‘ ν•˜μ—¬ WebMvcConfigurer이 가진 μžμ›μ„ 톡해 μ›ν•˜λŠ” μ»€μŠ€ν„°λ§ˆμ΄μ§•μ„ μ‹€ν˜„ν•˜λŠ” 것이닀.

@Configuration
@ComponentScan
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/", ".jsp");
    }
}

heap dumpλ₯Ό νŠœλ‹ν•˜λŠ” 방법에 λŒ€ν•΄ μ„€λͺ…ν•΄λ³΄μ„Έμš”.

JVM Heap Area 의 ꡬ성 new μ—°μ‚°μžλ‘œ μƒμ„±λœ 객체와 배열을 μ €μž₯ν•˜λŠ” κ³΅κ°„μž…λ‹ˆλ‹€. GC 둜 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 객체듀은 λ©”λͺ¨λ¦¬λ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€. Heap Area μ’…λ₯˜ Permanent Generation: μƒμ„±λœ κ°μ²΄λ“€μ˜ μ •λ³΄μ˜ μ£Όμ†Œκ°’μ΄ μ €μž₯된 곡간 New Area Eden: 객체듀이 졜초둜 μƒˆμ„±λ˜λŠ” 곡간 Survivor: Edenμ—μ„œ μ°Έμ‘°λ˜λŠ” 객체듀이 μ €μž₯λ˜λŠ” 곡간 μ‹€μ œ ν†΅κ³„λ‘œλ„ μƒμ„±λœ 98% 객체가 κ³§λ°”λ‘œ μ“°λ ˆκΈ° 객체가 λœλ‹€κ³  ν•œλ‹€. Old Area New Area μ—μ„œ μΌμ •μ‹œκ°„μ΄μƒ 참쑰되고 μžˆλŠ” 객체듀이 μ €μž₯λ˜λŠ” 곡간

λ ˆλ””μŠ€ μΊμ‹œλ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•΄μ•Όν•˜λ‚˜?

Cache? Cacheλ₯Ό μ™œ μ‚¬μš©ν•˜λŠ”κ°€?

  • Cache?
    • ν•œλ²ˆ 읽은(μ²˜λ¦¬ν•œ) 데이타λ₯Ό μž„μ‹œλ‘œ μ €μž₯ν•˜κ³  ν•„μš”μ— 따라 전솑,κ°±μ‹ ,μ‚­μ œν•˜λŠ” 기술둜 보톡은 λ°μ΄νƒ€μ˜ 보관μž₯μ†Œλ‘œ μ„œλ²„μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€
    • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ””μŠ€ν¬μ—μ„œ 정보λ₯Ό μ–»μ–΄μ˜€λŠ” 것보닀 훨씬 λΉ λ₯Έ I/Oμ„±λŠ₯을 얻을 수 μžˆμœΌλ‚˜ μ„œλ²„κ°€ λ‹€μš΄λ˜κ±°λ‚˜ μž¬λΆ€νŒ…λ˜λŠ” 경우 μ‚¬λΌμ§€λŠ” μ„±κ²©μ˜ νœ˜λ°œμ„±μ„ 가지고 μžˆμ–΄
    • μ˜μ†μ μœΌλ‘œ 보관할 수 μ—†λŠ”, 말 κ·ΈλŒ€λ‘œ μž„μ‹œμ μœΌλ‘œ λ³΄κ΄€ν•˜κ³  λΉ λ₯΄κ²Œ κ·Έ 정보에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.(λ¬Όλ‘  μ •λ³΄μ˜ 성격에 따라 λ³„λ„μ˜ λ””μŠ€ν¬λ°±μ—… 및 TTLλ“±μ˜ μ„€μ •μœΌλ‘œ μ˜κ΅¬λ³΄κ΄€μ΄λ‚˜ μ˜€λžœκΈ°κ°„ μœ μ§€κ°€ κ°€λŠ₯ν•˜λ‹€. 단 이런 섀정듀이 κΌ­ ν•„μš”ν•˜λ‹€λ©΄ Cacheλ₯Ό μ μš©ν•˜λŠ”κ²Œ λ§žλŠ”μ§€ ν•œ λ²ˆλ„ 타당성을 κ²€ν† ν•΄ λ³΄λŠ”κ²Œ μ’‹κ² λ‹€)
  • Cacheλ₯Ό μ“°λŠ” λͺ©μ μ€ λ‹¨μˆœν•˜λ‹€.
    • μ„œλ²„κ°„ λΆˆν•„μš”ν•œ νŠΈλž˜ν”½μ„ 쀄일 수 있고,
    • 그둜 인해 μ›Ήμ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ˜ λΆ€ν•˜ κ°μ†Œμ‹œν‚€κ³ ,
    • μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ λ₯Έ μ²˜λ¦¬μ„±λŠ₯(쑰회)을 ν™•λ³΄ν•΄μ„œ ꢁ극적으둜 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ³ κ°μ—κ²Œ μΎŒμ ν•œ μ„œλΉ„μŠ€κ²½ν—˜μ„ μ œκ³΅ν•˜λŠ” 것이닀.

Cache의 λŒ€μƒμ΄ λ˜λŠ” 정보듀

  1. λ‹¨μˆœν•œ, λ˜λŠ” λ‹¨μˆœν•œ ꡬ쑰의 정보λ₯Ό -> μ •λ³΄μ˜ λ‹¨μˆœμ„±
  2. 반볡적으둜 λ™μΌν•˜κ²Œ μ œκ³΅ν•΄μ•Ό ν•˜κ±°λ‚˜ -> λΉˆλ²ˆν•œ λ™μΌμš”μ²­μ˜ 반볡
  3. μ •λ³΄μ˜ λ³€κ²½μ£ΌκΈ°κ°€ λΉˆλ²ˆν•˜μ§€ μ•Šκ³ , λ‹¨μœ„μ²˜λ¦¬ μ‹œκ°„μ΄ μ˜€λž˜κ±Έλ¦¬λŠ” 정보이고 -> λ†’은 λ‹¨μœ„μ²˜λ¦¬λΉ„μš©
  4. μ •λ³΄μ˜ μ΅œμ‹ ν™”κ°€ λ°˜λ“œμ‹œ μ‹€μ‹œκ°„μœΌλ‘œ 이뀄지지 μ•Šμ•„λ„ μ„œλΉ„μŠ€ ν’ˆμ§ˆμ— 영ν–₯을 거의 주지 μ•ŠλŠ” 정보

주둜 μ–΄λ–€ 정보듀을 Cache둜 μ‚¬μš©ν•˜λ‚˜?

  • ν¬νƒˆμ˜ 검색어
  • μ‡Όν•‘λͺ°μ˜ ν•«λ”œμƒν’ˆ, λ² μŠ€νŠΈμ…€λŸ¬, μΆ”μ²œ μƒν’ˆλ“±
  • μƒν’ˆμ˜ μΉ΄ν…Œκ³ λ¦¬μ™€ μΉ΄ν…Œκ³ λ¦¬λ³„ 등둝 μƒν’ˆ 수
  • 방문자 수, 쑰회 수, μΆ”μ²œ 수
  • 1νšŒμ„± 인증정보 (SMS 본인인증정보, IP 정보등)
  • 곡지사항, Q&A
  • MSA κ΅¬μ‘°μ—μ„œλŠ” λ‹€λ₯Έ μ„œλΉ„μŠ€ μš”μ²­μ— λŒ€ν•œ 응닡 데이터 μ €μž₯은 거의 ν•„μˆ˜μ !
  • μš°λ¦¬κ°€ μ›Ήμ‚¬μ΄νŠΈμ—μ„œ λ³΄λŠ” λŒ€λΆ€λΆ„μ˜ μ΄λ―Έμ§€λŠ” λ‹€ μΊμ‹±λœ 이미지이닀.(CDN의 κ°€μž₯ μ€‘μš”ν•œ κΈ°λŠ₯)

SSL ν•Έλ“œμ‰μ΄ν‚Ή 과정은?

SSL/TLS Handshake λž€?

μ•”ν˜Έν™” 톡신은 일반적으둜 TLS/SSL ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ μ΄λ£¨μ–΄μ§€λŠ”λ° TLS/SSL μ•”ν˜Έν™” κ³Όμ •μ—μ„œ ν•„μš”ν•œ 정보(μ‚¬μš©ν•  μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜, ν‚€) 의 κ΅ν™˜μ„ μœ„ν•œ TLS Handshake 과정이 μ‘΄μž¬ν•©λ‹ˆλ‹€. ν•΄λ‹Ή 과정을 ν†΅ν•˜μ—¬ μ„Έμ…˜μ„ 생성할 수 있고 이 ν›„ 두 λ…Έλ“œμ˜ 톡신은 μ„Έμ…˜ μƒμ—μ„œ μˆ˜ν–‰λ©λ‹ˆλ‹€. SSL/TLS handshakeλ₯Ό μ‚¬μš©ν•˜λ©΄ SSL λ˜λŠ” TLS ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„κ°€ ν†΅μ‹ ν•˜λŠ” λ³΄μ•ˆ ν‚€λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SSL(Secure Sockets Layer)은 Certificate Authority(CA)라 λΆˆλ¦¬λŠ” μ„œλ“œ νŒŒν‹°λ‘œλΆ€ν„° μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ 인증을 ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. 주둜 전솑계측과 μ‘μš©κ³„μΈ΅ μ‚¬μ΄μ—μ„œ λ³΄μ•ˆμ‘°μΉ˜λ₯Ό ν•˜λŠ” 데 μ‚¬μš©ν•©λ‹ˆλ‹€. HTTPS:// λŠ” SSL을 μ‚¬μš©ν•˜λŠ” 경우λ₯Ό μ˜λ―Έν•˜λŠ” 것이죠.

TLS(Transport Layer Security) 둜 μ΅œκ·Όμ— λΆ€λ₯΄λŠ”데 SSL은 κ³Όκ±° λͺ…μΉ­μ΄λΌμ„œ 같은 λ§μž…λ‹ˆλ‹€.

λͺ¨λ“  SSL/TLS 연결은 "Handshake" κ³Όμ •μ„ 거쳐야 ν•©λ‹ˆλ‹€. handshake 과정은 톡신을 μ•”ν˜Έν™”ν•˜λŠ” 데 μ‚¬μš©ν•  μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜κ³Ό ν‚€λ₯Ό κ²°μ •ν•˜κ³  μ„œλ²„λ₯Ό ν™•μΈν•˜λ©° μ‹€μ œ 데이터 전솑을 μ‹œμž‘ν•˜κΈ° 전에 λ³΄μ•ˆ 연결이 이루어 μ‘ŒλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 이 연결을 ν™•μΈν•˜κΈ° μœ„ν•œ κ³Όμ •λ•Œλ¬Έμ— handshake라고도 ν•˜μ£ .

SSL/TLS ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°€ ν†΅μ‹ ν•˜λŠ” 단계

  1. μ‚¬μš©ν•  ν”„λ‘œν† μ½œ 버전에 λ™μ˜.

  2. μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜ 선택.

  3. 디지털 μΈμ¦μ„œ κ΅ν™˜ν•˜κ³  μœ νš¨μ„± κ²€μ‚¬ν•˜μ—¬ μ„œλ‘œ 인증.

  4. λΉ„λŒ€μΉ­ μ•”ν˜Έν™” κΈ°μˆ μ„ μ‚¬μš©ν•˜μ—¬ 곡유 λΉ„λ°€ν‚€λ₯Ό 생성. 그런 λ‹€μŒ SSL λ˜λŠ” TLSλŠ” κ³΅μœ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ 메세지λ₯Ό λŒ€μΉ­ μ•”ν˜Έν™” λ°©μ‹μœΌλ‘œ μ•”ν˜Έν™”.

κ³΅κ°œν‚€ μ•”ν˜Έν™”(λΉ„λŒ€μΉ­ν‚€ μ•”ν˜Έν™”)

λŒ€μΉ­ν‚€κ°€ κ°€μ§€λŠ” ν•΄ν‚Ήμ˜ μœ„ν—˜μ„ λ§‰κ³ μž λ‚˜μ˜¨ 것이 λ°”λ‘œ κ³΅κ°œν‚€(Public Key)μΈλ°μš”. μ•”ν˜Έν™”μ™€ λ³΅ν˜Έν™”μ— μ‚¬μš©ν•˜λŠ” ν‚€λ₯Ό λΆ„λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

TLS/SSL handshake λ°©μ‹μ—μ„œ μ‚¬μš©ν•˜λŠ” μ•”ν˜Έν™”

'handshake' κ·Έ μžμ²΄λŠ” λΉ„λŒ€μΉ­ μ•”ν˜Έν™”λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. κ³΅κ°œν‚€μ™€ κ°œμΈν‚€λ„ 각각 λ³„λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. λΉ„λŒ€μΉ­ μ•”ν˜Έν™” μ‹œμŠ€ν…œμ€ 높은 μ˜€λ²„ν—€λ“œλ₯Ό 가지고 있기 λ•Œλ¬Έμ— λͺ¨λ“  λ³΄μ•ˆ 과정을 μ œκ³΅ν•˜λŠ” 데 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ κ³΅κ°œν‚€λŠ” handshake ν•˜λŠ” λ™μ•ˆ μ•”ν˜Έ 해독을 μœ„ν•œ μ•”ν˜Έν™” 및 κ°œμΈν‚€λ‘œ μ‚¬μš©λ˜λ©° μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 각각 μƒˆλ‘œ μƒμ„±ν•œ κ³΅μœ ν‚€λ₯Ό μ„€μ •ν•˜κ³  κ΅ν™˜ν•˜κ²Œ ν•©λ‹ˆλ‹€.

μ„Έμ…˜ μžμ²΄λŠ” κ³΅μœ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ λŒ€μΉ­ μ•”ν˜Έν™”λ₯Ό μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μ‹€μ œ μ—°κ²°μ—μ„œ μ˜€λ²„ ν—€λ“œλ₯Ό μ€„μ—¬μ€λ‹ˆλ‹€.

TLS/SSL handshake κ³Όμ •

  1. SSL / TLS ν΄λΌμ΄μ–ΈνŠΈ 컴퓨터가 μžμ‹ μ˜ 버전, μ•”ν˜Έ μ•Œκ³ λ¦¬μ¦˜ λͺ©λ‘, 그리고 μ‚¬μš© κ°€λŠ₯ν•œ μ••μΆ• 방식을 "client hello" λ©”μ‹œμ§€μ— λ‹΄μ•„ μ„œλ²„λ‘œ λ³΄λƒ…λ‹ˆλ‹€.

  2. SSL / TLS μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ œκ³΅ν•œ λͺ©λ‘μ—μ„œ μ„œλ²„κ°€ μ„ νƒν•œ μ•”ν˜Έ μ•Œκ³ λ¦¬μ¦˜, μ„ νƒν•œ μ••μΆ• 방식과 μ„Έμ…˜ ID 및 CA(Certificate Authority)κ°€ μ‚¬μΈν•œ μ„œλ²„μ˜ 곡개 μΈμ¦μ„œλ₯Ό "server hello" λ©”μ‹œμ§€μ— λ‹΄μ•„ μ‘λ‹΅ν•©λ‹ˆλ‹€. 이 μΈμ¦μ„œλŠ” λŒ€μΉ­ν‚€κ°€ μƒμ„±λ˜κΈ° μ „κΉŒμ§€ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‚˜λ¨Έμ§€ handshake 과정을 μ•”ν˜Έν™”ν•˜λŠ” 데에 μ“Έ κ³΅κ°œν‚€λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

  3. SSL / TLS ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ˜ 디지털 μΈμ¦μ„œκ°€ μœ νš¨ν•œμ§€ μ‹ λ’°ν•  수 μžˆλŠ” CA λͺ©λ‘μ„ 톡해 ν™•μΈν•©λ‹ˆλ‹€.

  4. λ§Œμ•½ CAλ₯Ό 톡해 신뒰성이 ν™•λ³΄λ˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ˜μ‚¬ λ‚œμˆ˜(pseudo-random) λ°”μ΄νŠΈλ₯Ό 생성해 μ„œλ²„μ˜ κ³΅κ°œν‚€λ‘œ μ•”ν˜Έν™”ν•©λ‹ˆλ‹€. 이 λ‚œμˆ˜ λ°”μ΄νŠΈλŠ” λŒ€μΉ­ν‚€λ₯Ό μ •ν•˜λŠ” 데에 μ‚¬μš©λ˜λ©° 이 λŒ€μΉ­ν‚€λŠ” λ‚˜μ€‘μ— λ©”μ‹œμ§€ 데이터λ₯Ό μ•”ν˜Έν™”ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

  5. SSL / TLS μ„œλ²„κ°€ "ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œ μš”μ²­"을 보낸 경우 ν΄λΌμ΄μ–ΈνŠΈλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ 디지털 μΈμ¦μ„œ λ˜λŠ” "디지털 μΈμ¦μ„œ μ—†μŒ κ²½κ³ " 와 ν•¨κ»˜ ν΄λΌμ΄μ–ΈνŠΈμ˜ 개인 ν‚€λ‘œ μ•”ν˜Έν™” 된 μž„μ˜μ˜ λ°”μ΄νŠΈ λ¬Έμžμ—΄μ„ λ³΄λƒ…λ‹ˆλ‹€. 이 κ²½κ³ λŠ” 경고일 λΏμ΄μ§€λ§Œ 일뢀 κ΅¬ν˜„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ 인증이 ν•„μˆ˜μΌ 경우 handshake μ‹€νŒ¨ν•©λ‹ˆλ‹€.

  6. μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μΈμ¦μ„œλ₯Ό ν™•μΈν•©λ‹ˆλ‹€. λ‚œμˆ˜ λ°”μ΄νŠΈλ₯Ό 자기 κ°œμΈν‚€λ‘œ λ³΅ν˜Έν™”ν•΄ λŒ€μΉ­ λ§ˆμŠ€ν„°ν‚€ 생성에 ν™œμš©ν•©λ‹ˆλ‹€.

  7. ν΄λΌμ΄μ–ΈνŠΈλŠ” handshake의 ν΄λΌμ΄μ–ΈνŠΈ 뢀뢄이 μ™„λ£Œλ˜μ—ˆμŒμ„ μ•Œλ¦¬λŠ” Finished λ©”μ‹œμ§€λ₯Ό μ„œλ²„μ— λ³΄λ‚΄λ©΄μ„œ μ§€κΈˆκΉŒμ§€μ˜ κ΅ν™˜ 내역을 ν•΄μ‹œν•œ 값을 λŒ€μΉ­ν‚€λ‘œ μ•”ν˜Έν™”ν•˜μ—¬ λ‹΄μŠ΅λ‹ˆλ‹€.

  8. μ„œλ²„λŠ” μŠ€μŠ€λ‘œλ„ ν•΄μ‹œλ₯Ό 생성해 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ„μ°©ν•œ κ°’κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ λ΄…λ‹ˆλ‹€. μΌμΉ˜ν•˜λ©΄ μ„œλ²„λ„ λ§ˆμ°¬κ°€μ§€λ‘œ λŒ€μΉ­ν‚€λ₯Ό 톡해 μ•”ν˜Έν™”ν•œ Finished λ©”μ‹œμ§€λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ³΄λƒ…λ‹ˆλ‹€.

  9. 이후뢀터 SSL / TLS μ„Έμ…˜ λ™μ•ˆ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μΉ­ν‚€λ‘œ μ•”ν˜Έν™”λœ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜(HTTP) 데이터λ₯Ό μ£Όκ³  받을 수 μžˆμŠ΅λ‹ˆλ‹€.

좜처:

https://wangin9.tistory.com/entry/λΈŒλΌμš°μ €μ—-URL-μž…λ ₯-ν›„-μΌμ–΄λ‚˜λŠ”-일듀-5TLSSSL-Handshake

[μž‰κ΅¬λΈ”λ‘œκ·Έ]

⚠️ **GitHub.com Fallback** ⚠️