λ°˜μ‘ν˜•
객체지ν–₯이 λ‚˜μ˜€κ²Œ 된 λ°°κ²½

 1970λ…„λŒ€ μ΄μ „μ—λŠ” 섀계없이 ν•„μš”ν• λ•Œλ§ˆλ‹€ κ°œλ°œν•˜λŠ” λ°©μ‹μœΌλ‘œ 진행
    → μ‹œκ°„μ΄ μ§€λ‚˜λ©΄μ„œ μ€‘λ³΅μ½”λ“œ 증가, μœ μ§€λ³΄μˆ˜μ˜ 어렀움 λ°œμƒμœΌλ‘œ 신뒰도 λ°”λ‹₯ 및 μ„±λŠ₯ μ €ν•˜ λ“±μ˜ μ΄μŠˆκ°€ λ°œμƒν•˜κ²Œλ¨

 1970λ…„λŒ€ 이후, ν”„λ‘œκ·Έλž¨μ„ μͺΌκ°œμ–΄ κ°œλ°œν•˜λŠ” ꡬ쑰적 개발 방법이 많이 μ‚¬μš© (뢄석 - 섀계 - 개발 - ν…ŒμŠ€νŠΈ)
    → μ‚¬μš©μž μš”κ΅¬μ‚¬ν•­μ΄ λͺ…ν™•ν•˜κ³  λ³€ν™”κ°€ 많이 μ•Šμ€ ν™˜κ²½μ—μ„œλŠ” νš¨μœ¨μ μ΄λ‚˜, 생λͺ…μ£ΌκΈ° 각 단계별(ex. λ¬Όν’ˆκ΅¬λ§€..λ¬Όν’ˆμ‘°νšŒ..λ¬Όν’ˆμ‚­μ œ..)둜 μžμ—°μŠ€λŸ½κ²Œ μ„œλ‘œ μ—°κ²°λ˜μ§€ μ•Šκ³ , ν”„λ‘œκ·Έλž¨ λ‚΄λΆ€ κΈ°λŠ₯듀은 데이터와 λ³΅μž‘ν•˜μ—¬ μ–½ν˜€μžˆμ–΄ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ³€κ²½ν•˜λŠ”κ²Œ 쉽지 μ•ŠμŒ
     μœ μ§€λ³΄μˆ˜ λΉ„μš© 증가
     κ°μ²΄μ§€ν–₯이 λ‚˜μ˜€κ²Œλ¨

 κ°μ²΄μ§€ν–₯은 ν˜„μ‹€μ„Έκ³„μ— μ‘΄μž¬ν•˜λŠ” 싀체 및 κ°œλ…λ“€μ„ κ°μ²΄λΌλŠ” λ…λ¦½λœ λ‹¨μœ„λ‘œ ꡬ성 & λ©”μ„Έμ§€λ‘œ μƒν˜Έμž‘μš© & 객체지ν–₯ μ‹œμŠ€ν…œμ„ κ°€μ‹œν™”ν•˜κ³  λͺ…μ„Έν™”ν•˜κ³  λ¬Έμ„œν™”ν•œκ²ƒμ΄ UML

 

객체지ν–₯ μš”μ†Œ

• 객체(Object) : 속성과 행동을 가지고 μžˆλŠ”κ²ƒ
     (자료(=속성(λ³€μˆ˜) + κ°’(λ³€μˆ˜κ°’)=ν΄λž˜μŠ€μ—μ„œ μ •μ˜) 및 μ˜€νΌλ ˆμ΄μ…˜(=ν΄λž˜μŠ€μ— ν¬ν•¨λ˜μ–΄μžˆλŠ” λ©”μ†Œλ“œ))

 ν΄λž˜μŠ€(Class) : 객체λ₯Ό 생성할 수 μžˆλŠ” ꡬ쑰와 정보λ₯Ό 가지고 μžˆλŠ” ν‹€ 

 λ©”세지(Message) : μ–΄λ–€ ν•œ 객체가 λ‹€λ₯Έ κ°μ²΄μ—κ²Œ νŠΉμ • μž‘μ—…μ„ μš”μ²­ν•˜λŠ” μ‹ ν˜Έ
     μˆ˜μ‹ κ°μ²΄ 이름 + μˆ˜ν–‰ν•  μ˜€νΌλ ˆμ΄μ…˜ 이름 + μ „λ‹¬λ˜λŠ” λ§€κ°œλ³€μˆ˜ 

 

객체지ν–₯ νŠΉμ„±

 μΊ‘μŠν™”(Encapsulation) : ν•΄λ‹Ή κΈ°λŠ₯의 λ™μž‘μ— λŒ€ν•œ 흐름을 μžμ„Έν•˜κ²Œ μ•Œν•„μš” 없이, μ™ΈλΆ€μ—μ„œ μ›ν•˜λŠ” κΈ°λŠ₯듀을 μˆ˜ν–‰ν•˜λ„λ‘ μ§€μ‹œν•˜λŠ”κ²ƒ. 
     μ™ΈλΆ€μ—μ„œ 객체 λ‚΄ 직접 μ ‘κ·Ό X
     μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” μ˜€νΌλ ˆμ΄μ…˜μ„ 톡해 κ΄€λ ¨ 데이터에 μ ‘κ·Ό (이둜써 λ‹¨μˆœν•˜κ³  λͺ…ν™•ν•˜κ²Œ ν‘œν˜„κ°€λŠ₯)
     μ •λ³΄μ€λ‹‰μ΄ κ°€λŠ₯ 

 μƒμ†(Inheritance) : ν”„λ‘œκ·Έλž¨μ„ ν™•μž₯ κ°€λŠ₯ν•˜λ„λ‘ ν•΄μ£ΌλŠ” μˆ˜λ‹¨
     μž¬μ‚¬μš© 및 ν™•μž₯μ„± 
     μΌλ°˜ν™”(Generalization) : ν•˜μœ„ν΄λž˜μŠ€μ˜ 곡톡적 νŠΉμ„±μ„ μΆ”μƒν™”ν•˜μ—¬ μƒμœ„ 클래슀둜 μ •μ˜ν•˜λŠ”κ²ƒ (ν•˜μœ„ -> μƒμœ„)
     νŠΉμˆ˜ν™”(Specialization) : μƒμœ„ 클래슀의 속성을 상속받아 ν•˜μœ„ ν΄λž˜μŠ€μ— 싀체화 (μƒμœ„ -> ν•˜μœ„)

 μΆ”상화(Abstraction) : νŠΉμ •μΈ‘λ©΄μ„ κ°•μ‘°ν•˜μ—¬ λ‚˜νƒ€λ‚Έκ²ƒ. 싀세계상황을 κ°„κ²°ν•˜κ³  λͺ…ν™•ν•˜κ²Œ λͺ¨λΈλ§ν•˜μ—¬ 이것을 ν”„λ‘œκ·Έλž¨μœΌλ‘œ κ΅¬ν˜„(=싀체화)

 λ‹€ν˜•μ„±(Polymorphism) : μ—¬λŸ¬ν΄λž˜μŠ€μ— 같은 λ©”μ†Œλ“œλͺ…을 μ‚¬μš©ν•˜λ‚˜, λ™μž‘μ΄ λ‹€λ₯Έ μΌ€μ΄μŠ€ (μ˜€λ²„λΌμ΄λ”©)

 

>>> μΊ‘μŠν™”μ™€ 좔상화λ₯Ό 헀깔리면 μ•ˆλ λ“―!
μΊ‘μŠν™”λŠ” 결과의 ν–‰λ™λ§Œ λ°”λΌλ³΄λŠ”κ²ƒμ΄λ©΄(ν˜ΈμΆœν•˜λŠ”μžμ˜ μž…μž₯에선 내뢀사정은 μ•Œν•„μš” μ—†λ‹€!), μΆ”μƒν™”λŠ” ꡬ체화λ₯Ό ν•˜κΈ° μœ„ν•œ μˆ˜λ‹¨μ˜ μ‹œμž‘μœΌλ‘œ 봐야할듯

λ°˜μ‘ν˜•
λ°˜μ‘ν˜•

⭐️ μ΄μŠˆμƒν™©) WebClient 으둜 API 톡신을 ν•˜λŠ” 상황에 결과값이 λ¬΄λΆ„λ³„ν•˜κ²Œ ν˜ΈμΆœλ˜λŠ” 상황이 λ°œμƒν•¨
- 예λ₯Όλ“€λ©΄ API 톡신을 μœ„ν•΄ webclient 을 1번 호좜 → N 번의 호좜 결과둜 λ…ΈμΆœμ΄ 된 상황 (⁉️)

↓↓↓ μ•„λž˜λŠ” 잘λͺ» λ§Œλ“  JAVA μ½”λ“œμ˜ μΌλΆ€μž„.
WebClient 을 잘 λͺ¨λ₯΄κ³ ! Non-blocking/Asynchronous 의 νŠΉμ„±μ„ 생각 λͺ»ν•˜κ³ ! subscribe, block 을 λ¬΄λΆ„λ³„ν•˜κ²Œ ν˜ΈμΆœν•œ 상황 (γ… γ… )

// 1) testmethod λŠ” API 톡신 λ©”μ†Œλ“œ 의 일뢀 
public Mono<dto> testmethod() { 
    Mono<dto> test = WebClient.builder()..build().post().exchangeMono()..;
    return test;
}


// 2) testmethod 을 ν˜ΈμΆœν•œ μ˜μ—­ 
...
Mono<dto> dto = testmethod();

dto.subscribe(res -> {…}, error -> {…});
dto.subscribe(res -> {…}, error -> {…});
dto.block();
dto.block();
dto.block();

// 이 κ²°κ³Ό testmethod()은 1번 ν˜ΈμΆœν•˜μ˜€μœΌλ‚˜ 그에 λ”°λ₯Έ κ²°κ³ΌλŠ” 5번으둜 호좜된 상황. Non-blocking...async..의 상황...

 

β“β“β“β“μ™œβ“β“β“β“

dto.block() 의 경우, mono ꡬ독 ν›„ 응닡이 μ˜¬λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦Ό! 
κ·Έ 사이, dto.block() 을 또 선언을? ν•˜μ˜€λ‹€λ©΄ μŠ€λ ˆλ“œκ°€ 2κ°œκ°€ μ‹€ν–‰λ˜λŠ” 상황이 λ˜λ²„λ¦¬λŠ”κ²ƒ? 

dto.subscribe(res...) 의 κ²½μš°λ„ μ—¬λŸ¬κ°œκ°€ μ„ μ–Έλ˜λ©΄ 각각 subscribe λ‚΄μ—μ„œ μ²˜λ¦¬κ°€ 끝남. = (비동기 처리 - ν•¨μˆ˜ν˜•) x μ—¬λŸ¬κ°œ = μ½œλ°±λŠ‘λ‚Œ

 
 
κ·ΈλŸ¬λ―€λ‘œ 비동기 νŠΉμ„±μ„ 잘 μ΄ν•΄ν•˜μ—¬ λ‘œμ§μ„ κ΅¬ν˜„ν•΄μ•Όν•¨.

❗️subscribe, block 을 같이 ν˜Ήμ€ μ—¬λŸ¬κ°œ!!!!! μ„ μ–Έν•˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° (λ¬΄λΆ„λ³„ν•˜κ²Œ ν˜ΈμΆœν•΄μ•Όν•˜λŠ” 상황이라면 λͺ¨λ₯ΌκΉŒ)
❗️subscribe (ν•¨μˆ˜ν˜•?)으둜 λ°›μ•˜λ‹€λ©΄ μ ˆμ°¨μ§€ν–₯ν˜•μ˜ ν”„λ‘œμ„ΈμŠ€μ™€λŠ” 상관없이 subscribe λ‚΄μ—μ„œ μ²˜λ¦¬ν•΄λ„ λ˜λŠ”κ²ƒμΈμ§€ 잘 고민해보기.
(non-blocking νŠΉμ„±μ„ ν™œμš©ν•˜κΈ° μœ„ν•΄ webclient 을 μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ μ•„λ‹Œκ°€ μ‹ΆμŒ )

 

λ°˜μ‘ν˜•
λ°˜μ‘ν˜•

λ¦¬μ•‘ν‹°λΈŒ ν”„λ‘œκ·Έλž˜λ°

λ³€ν™”μ˜ μ „νŒŒμ™€ 데이터 흐름과 κ΄€λ ¨λœ 선언적 ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„

  • λ³€ν™”μ˜ μ „νŒŒμ™€ 데이터 흐름: 데이터가 변결될 λ•Œ λ§ˆλ‹€ 이벀트λ₯Ό λ°œμƒμ‹œμΌœμ„œ 데이터λ₯Ό κ³„μ†μ μœΌλ‘œ 전달
  • 선언적 ν”„λ‘œκ·Έλž˜λ°: μ‹€ν–‰ν•  λ™μž‘μ„ ꡬ체적으둜 λͺ…μ‹œν•˜λŠ” λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°κ³Ό 달리 μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μ€ λ‹¨μˆœνžˆ λͺ©ν‘œλ₯Ό μ„ μ–Έ.
  • 데이터 λ°œν–‰(Observable), 가곡(Operator), ꡬ독(Subscribe) νλ¦„μœΌλ‘œ ꡬ성
  • λ©€ν‹°μŠ€λ ˆλ”© ν™˜κ²½μ—μ„œ λ‘˜ μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ λ°œμƒν•˜λŠ” 이슈λ₯Ό λ°©μ§€ν•˜μ—¬ 개발이 κ°€λŠ₯함. (stream..)

 

λ¦¬μ•‘ν‹°λΈŒμ˜ κ°œλ…μ΄ 적용된 예

  Push 방식: λ°μ΄ν„°μ˜ λ³€ν™”κ°€ λ°œμƒν–ˆμ„λ•Œ 변경이 λ°œμƒν•œ κ³³μ—μ„œ 데이터λ₯Ό λ³΄λ‚΄μ£ΌλŠ” 방식 (λ¦¬μ•‘ν‹°λΈŒ ν”„λ‘œκ·Έλž˜λ° 방식)

  • RTC, μ†ŒμΌ“ν”„λ‘œκ·Έλž˜λ°, DB Trigger, Spring의 ApplicationEvent, μ•΅κ·€λŸ¬ 바인딩, ν‘Έμ‹œλ©”μ„Έμ§€

  Pull 방식: λ³€κ²½λœ 데이터가 μžˆλŠ”μ§€ μš”μ²­μ„ 보내 μ§ˆμ˜ν•˜κ³  λ³€κ²½λœ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 방식

  • ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ & μ„œλ²„ 응닡 λ°©μ‹μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜
  • Java와 같은 μ ˆμ°¨ν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄

 

λ¦¬μ•‘ν‹°λΈŒ ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•΄ μ•Œμ•„μ•Ό 될 것듀

  • Observable: 데이터 μ†ŒμŠ€
  • λ¦¬μ•‘ν‹°λΈŒ μ—°μ‚°μž(Operators): 데이터 μ†ŒμŠ€λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜
  • μŠ€μΌ€μ€„λŸ¬(Scheduler): μŠ€λ ˆλ“œ κ΄€λ¦¬μž
  • Subscriber: Observable이 λ°œν–‰ν•˜λŠ” 데이터λ₯Ό κ΅¬λ…ν•˜λŠ” κ΅¬λ…μž
  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°: RxJavaμ—μ„œ μ œκ³΅ν•˜λŠ” μ—°μ‚°μž(Operator) ν•¨μˆ˜λ₯Ό μ‚¬μš©.

 

λ¦¬μ•‘ν‹°λΈŒX 

  • λ¦¬μ•‘ν‹°λΈŒ ν”„λ‘œκ·Έλž˜λ°μ„ κ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” 라이브러리
  • λ‹€μ–‘ν•œ μ–Έμ–΄ 지원

.....

μ°Έκ³ 
https://www.youtube.com/watch?v=2McwNWO8MIw&list=PLr-ObTx8qMl9APSlvIhAah1mq3tyD1AYN

λ°˜μ‘ν˜•
λ°˜μ‘ν˜•
μžλ°”λŠ” call by value (값에 μ˜ν•œ 호좜) λ°©μ‹μ΄λ‹€.

public class CallTest {

    public static void main(String[] args) {
        String test1 = "test1";
        String test2 = "test2";
        CallTest.callByValue(test1, test2); // 값에 μ˜ν•œ μ°Έμ‘°
        
        // CallTest.callByValue μ—μ„œ λ§€κ°œλ³€μˆ˜ 전달 ν›„ λ°”κΏ§λ‹€ ν•˜μ—¬, test1, test2에 영ν–₯ μ•ˆλ―ΈμΉ¨.
        System.out.println("test1:" + test1+", test2:"+test2); 
    }

    public static void callByValue(String test1, String test2) {
        String temp = test1;
        test1 = test2;
        test2  = temp;
        System.out.println("test1:" + test1+", test2:"+test2);
    }
}

/*
// result)
test1:test2, test2:test1
test1:test1, test2:test2
**/

ν•¨μˆ˜ 호좜 μ‹œ λ§€κ°œλ³€μˆ˜μ˜ 값을 κ·ΈλŒ€λ‘œ 전달!
μ „λ‹¬ν•œ κ°’ κ·ΈλŒ€λ‘œ μ‚¬μš©!
λ§€κ°œλ³€μˆ˜μ˜ 값듀은 각각의 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μœ„μΉ˜μ— μ €μž₯됨. 
ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ³€κ²½ν•œ 사항은 호좜자의 μ‹€μ œ λ§€κ°œλ³€μˆ˜μ— λ°˜μ˜λ˜μ§€λŠ” μ•ŠμŒ.

 

call by reference (μ£Όμ†Œμ— μ˜ν•œ 호좜)

λ§€κ°œλ³€μˆ˜λŠ” λ™μΌν•œ μœ„μΉ˜λ₯Ό μ°Έμ‘°ν•˜λ―€λ‘œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ³€κ²½ν•œ 사항은 μ‹€μ œ 호좜자의 λ§€κ°œλ³€μˆ˜μ— 반영됨.
ν•¨μˆ˜ 호좜 μ‹œ λ§€κ°œλ³€μˆ˜μ— μ£Όμ†Œλ₯Ό μ „λ‹¬ν•˜μ—¬ μ‚¬μš©!
참쑰에 μ˜ν•œ 호좜 (C++ 포인터)

/** 
C++ μ–Έμ–΄μ—μ„œ λ³€μˆ˜ μ£Όμ†Œλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달 ν•˜μ˜€μ„ λ•Œ
result) 
test1:test2, test2:test1
test1:test2, test2:test1 // μ£Όμ†Œ 참쑰에 μ˜ν•΄ 값이 λ³€κ²½ 됨.
*/

 


μ°Έκ³ 

https://www.geeksforgeeks.org/difference-between-call-by-value-and-call-by-reference/

λ°˜μ‘ν˜•
λ°˜μ‘ν˜•

λžŒλ‹€

μ„€λͺ…

읡λͺ…ν•¨μˆ˜λ‹€. 읡λͺ…ν•¨μˆ˜ 즉, μ½”λ“œ λΈ”λŸ­μ΄λ‹€.
μ½”λ“œ λΈ”λŸ­μ€ λ©”μ†Œλ“œ 내에 μ‘΄μž¬ν•΄μ•Ό ν•œλ‹€!

β€» 읡λͺ…ν•¨μˆ˜

μž¬μ‚¬μš© κ°€λŠ₯ν•œ κΈ°λŠ₯의 일뢀뢄을 μ „λ‹¬ν•˜κ³  μ‹Άμ„λ•Œ μ‚¬μš©ν•˜λŠ”κ²ƒ.
ν•¨μˆ˜λ“€μ— ν•¨μˆ˜λ₯Ό 인자둜 μ „λ‹¬ν•˜λŠ” 경우 (콜백?)

 

μ½”λ“œμ˜ˆμ‹œ
//κΈ°λ³Έ 문법 
(args) -> {
	//블라블라
}
/* 
ASIS: λžŒλ‹€λŠ” νƒ€μž… μ§€μ‹œμž(Integer)λ₯Ό μƒλž΅ν•  수 μžˆλ‹€ 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ νƒ€μž…μ„ μ„€λͺ…ν•˜κ³  μžˆμ–΄, 
μ»΄νŒŒμΌλŸ¬κ°€ ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό μ œκ³΅ν•΄μ€„ 수 있기 λ•Œλ¬Έμ΄λ‹€.
*/
(Intefer x) -> x + 1; 

// TOBE: μ΄λ ‡κ²Œ!
(x) -> x + 1 


//ASIS: λ§€κ°œλ³€μˆ˜ ν•˜λ‚˜μΈ μΈν„°νŽ˜μ΄μŠ€ λ©”μ†Œλ“œ 을
(x) -> x + 1 

// TOBE: μ΄λ ‡κ²Œ ν‘œν˜„ κ°€λŠ₯
x -> x + 1
// ASIS: 읡λͺ…ν΄λž˜μŠ€ 일반적 μ‚¬μš©
void annoymousClass() {
	final Server server = new HttpServer();
	waitFor(new Condition() {
		
		@Override
		public Boolean isSatisfied() {
			return !server.isRunning();
		}
	});
}

// TOBE: λžŒλ‹€ μ‚¬μš© - ν΄λ‘œμ €μ§€λ§Œ λžŒλ‹€λ‹€.
void Closure() {
	Server server = new HttpServer();
	waitFor(() -> !server.isRunning());
}	


// (별도) WaitFor 클래슀 
class WaitFor {
	static void waitFor(Condition condition) throws
	InterruptedException {
		While (!condition.isSatisfied())
			Thread.sleep(250);
	}
}
public class LambdaStudy {
    private String firstName = "Jack";
    public void λžŒλ‹€κ°€_firstName_에_직접_μ ‘κ·Ό() {
        Function<String, String> addSurname = surname -> {
          
          // λžŒλ‹€κ°€ firstName λ³€μˆ˜μ— 직접 접근이 κ°€λŠ₯. (ν•„λ“œ,λ©”μ†Œλ“œ,μ§€μ—­λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯)
          return this.firstName + " " + surname; 
        };
    }
}

 

λžŒλ‹€κ°€ λ„μž…λœ 이유

μ„€λͺ…

빅데이터λ₯Ό 닀루기 μœ„ν•΄ λ©€ν‹°μ½”μ–΄λ₯Ό ν™œμš©ν•œ λΆ„μ‚°μ²˜λ¦¬, 즉 병렬화 기술이 ν•„μš” ν•˜μ˜€μŒ.
κ·Έλž˜μ„œ java8 μ—μ„œλŠ” 병렬화λ₯Ό μœ„ν•΄ λ°°μ—΄, List, Set, Map을 κ°•ν™”ν•˜μ˜€κ³  μŠ€νŠΈλ¦Όμ„ κ°•ν™” ν•˜μ˜€λ‹€.
그리고 μŠ€νŠΈλ¦Όμ„ 효율적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•΄ λžŒλ‹€,
λžŒλ‹€λ₯Ό μœ„ν•΄ μΈν„°νŽ˜μ΄μŠ€ λ³€ν™”κ°€ 수반 λ˜μ—ˆλ‹€.

빅데이터 지원 → 병렬화 κ°•ν™” → μ»¬λ ‰μ…˜ κ°•ν™” → 슀트림 κ°•ν™” → λžŒλ‹€ λ„μž… → μΈν„°νŽ˜μ΄μŠ€ λͺ…μ„Έ λ³€κ²½ → ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ λ„μž…

 

λžŒλ‹€μ˜ μž₯/단점

μž₯점

μ½”λ“œκ°€ κ°„κ²°ν•˜λ‹€. 개발자의 μ˜λ„λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ‹€.
병렬 μ²˜λ¦¬μ— μœ λ¦¬ν•¨.
ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” μ‹œκ°„μ„ 덜 듀일 수 μžˆλ‹€.

단점

μ½”λ“œ λ‚¨μš©μ‹œ 디버깅이 νž˜λ“€ 수 μžˆλ‹€.
μž¬κ·€ 둜직 λ§Œλ“œλŠ”κ²ƒμ€ μ–΄λ ΅λ‹€.

 

λ©”μ†Œλ“œ μ°Έμ‘°

μ„€λͺ…

λ©”μ†Œλ“œ μ°Έμ‘°λ₯Ό λžŒλ‹€λ‘œμ„œ μ‚¬μš©ν•  λ•Œμ—” 이미 μ‘΄μž¬ν•˜λŠ” 이름을 가진 λ©”μ†Œλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” 것인데, 그것은 이미 λͺΈμ²΄λ₯Ό 가지고 μžˆλ‹€.
일반 λ©”μ†Œλ“œλ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ μ „ν™˜ν•˜λŠ” 행동.

β€» ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (@FunctionalInterfate)

ν•¨μˆ˜ν˜• λ©”μ†Œλ“œ or SAM(단일 좔상 λ©”μ†Œλ“œ)
ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€μ— ν•˜λ‚˜μ˜ λ©”μ†Œλ“œλ§Œ κ°€μ§ˆ 수 있음.
λΆ€λͺ¨μ˜ ν•¨μˆ˜ν˜• λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ“œ κ°€λŠ₯
@FunctionalInterface
interface A {
	abstract void apply();
}

// κ°€λŠ₯
interface B extends A {
	
	@Override
	abstract void apply();
} 

// λΆˆκ°€λŠ₯
interface B extends A {
	
	@Override
	abstract void illegal();
} 

 

λ©”μ†Œλ“œ 참쑰의 νŠΉμ§•

쌍콜둠(::)의 μ•žλΆ€λΆ„μ€ λŒ€μƒμœΌλ‘œ ν•˜λŠ” 클래슀λͺ…, 뒷뢀뢄은 λ©”μ†Œλ“œλͺ…
method 뒀에 μ†Œκ΄„ν˜Έ()을 쓰지 μ•ŠλŠ”λ‹€.

λ©”μ†Œλ“œ 참쑰의 μœ ν˜•

μƒμ„±μž μ°Έμ‘° (String::new)
  쌍콜둠 뒀에 newκ°€ λΆ™μŒ

  String 클래슀의 μΈμžμ—†λŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” λžŒλ‹€λ₯Ό 생성
  () → new String() κ³Ό 같은 의미

정적 λ©”μ†Œλ“œ μ°Έμ‘° (String::valueOf)
  x → String.valueOf(x)

두 가지 μœ ν˜•μ΄ μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ μ°Έμ‘° (x::toString)
  xλŠ” μ ‘κ·Ό κ°€λŠ₯ν•œ νŠΉμ • μΈμŠ€ν„΄μŠ€λΌ κ°€μ •

  () → x.toString()

 

 

λžŒλ‹€μ˜ μ˜ˆμ™Έ 처리

μ„€λͺ…

λžŒλ‹€λŠ” μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό μœ„ν•œ μƒˆλ‘œμš΄ 문법이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ.
λžŒλ‹€μ—μ„œ λ˜μ Έμ§„ μ˜ˆμ™Έλ“€μ€ 일반 λ©”μ†Œλ“œ 호좜과 λ™μΌν•˜κ²Œ ν˜ΈμΆœν•œ 곳으둜 μ „νŒŒ λœλ‹€.
즉, λžŒλ‹€λ₯Ό ν˜ΈμΆœν•˜λŠ” λ©”μ†Œλ“œμ—μ„œ μ–΄λ–»κ²Œ 싀행될지에 λŒ€ν•΄ μ±…μž„μ„ 지지 μ•ŠμŒ. λžŒλ‹€λŠ” 병렬 λ˜λŠ” 미래의 μ–΄λŠ μ‹œμ μ— 처리될 μˆ˜λ„ 있기 λ•Œλ¬Έ.
μ˜ˆμ™Έμ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ„λ‘ λ‘œμ§μ„ λ§Œλ“€μˆ˜λŠ” μžˆμ§€λ§Œ μ½”λ“œκ°€ μž₯황해진닀.

λΉ„μ§€λ‹ˆμŠ€ 둜직 < μ—λŸ¬ 처리 μœ„ν•œ 보일러 ν”Œλ ˆμ΄νŠΈ μ½”λ“œ

 

 

ν•¨μˆ˜μ™€ 클래슀

μ„€λͺ…

ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™”κ°€ λ˜μ–΄μ•Ό 함. ν•¨μˆ˜λŠ” 그렇지 μ•ŠμŒ.
ν΄λž˜μŠ€λŠ” μƒˆλ‘œ μƒμ„±λ˜λ©΄ 객체λ₯Ό μœ„ν•΄ λ©”λͺ¨λ¦¬κ°€ 할당됨.
ν•¨μˆ˜λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬λŠ” λ”± ν•œλ²ˆ ν• λ‹Ή 됨. (μžλ°” νž™μ˜ νΌλ¨Έλ„ŒνŠΈ(permanent)μ˜μ—­μ— μ €μž₯ 됨.
κ°μ²΄λŠ” μžμ‹ λ§Œμ˜ 데이터λ₯Ό κ°€μ§€μ§€λ§Œ ν•¨μˆ˜λŠ” 데이터와 μ—°κ΄€ 관계가 μ—†λ‹€.
μžλ°” 클래슀의 정적 λ©”μ†Œλ“œλŠ” ν•¨μˆ˜μ™€ 거의 μœ μ‚¬ν•˜λ‹€.

 


μ°Έκ³ 

(μ±…) μžλ°” λžŒλ‹€ 배우기
(μ±…) μŠ€ν”„λ§ μž…λ¬Έμ„ μœ„ν•œ μžλ°” 객체지ν–₯의 원리와 이해
https://coding-factory.tistory.com/265

λ°˜μ‘ν˜•
λ°˜μ‘ν˜•

ν”„λ‘œμ„ΈμŠ€

μ„€λͺ…

싀행쀑인 ν”„λ‘œκ·Έλž¨

β€» λ©€ν‹° ν”„λ‘œμ„ΈμŠ€

λ‹€μˆ˜μ˜ 데이터 μ €μž₯ μ˜μ—­μ„ 가짐 (λ‹€μˆ˜μ˜ Tλ©”λͺ¨λ¦¬λ₯Ό κ°€μ§€λŠ” ꡬ쑰)
ν”„λ‘œμ„ΈμŠ€ 끼리 μ„œλ‘œ μ°Έμ‘° λΆˆκ°€λŠ₯ (곡간 μ˜μ—­ μžμ²΄κ°€ 뢄리)

 

μŠ€λ ˆλ“œ

μ„€λͺ…

ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨ λ‚΄ μ—¬λŸ¬κ°œμ˜ μ‹€ν–‰ 흐름

β€» λ©€ν‹° μŠ€λ ˆλ“œ
Tλ©”λͺ¨λ¦¬ λͺ¨λΈ(μŠ€νƒœν‹±, μŠ€νƒ, νž™)의 μŠ€νƒ μ˜μ—­(λ©”μ†Œλ“œ μ˜μ—­)을 μŠ€λ ˆλ“œ 갯수 만큼 λΆ„ν• ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것.
μ„œλ‘œ λ‹€λ₯Έ μŠ€λ ˆλ“œμ˜ μŠ€νƒ μ˜μ—­μ€ μ ‘κ·Ό λͺ»ν•˜μ§€λ§Œ μŠ€νƒœν‹±μ˜μ—­, νž™ μ˜μ—­μ€ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•˜λŠ” ꡬ쑰.
λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ λŒ€λΉ„ λ©”λͺ¨λ¦¬λ₯Ό 적게 μ‚¬μš©ν•˜λŠ” ꡬ쑰.!!
μ „μ—­ λ³€μˆ˜ μ‚¬μš©μ‹œ λ¬Έμ œκ°€ 될 κ°€λŠ₯μ„± 쑴재 ((λ³€μˆ˜μ°Έμ‘°)락을 κ±°λŠ” 방법이 μžˆλ‹€κ³  함 (?))

 

μŠ€λ ˆλ“œν’€

μŠ€λ ˆλ“œ 풀은 μž‘μ—…μ²˜λ¦¬μ— μ‚¬μš©λ˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œν•œλœ 개수만큼 정해놓고 μž‘μ—…ν (Queue)에 λ“€μ–΄μ˜€λŠ” μž‘μ—…λ“€μ„ ν•˜λ‚˜μ”© μŠ€λ ˆλ“œκ°€ 맑아 처리.
정해진 큐에 λ“€μ–΄μ˜¨ μž‘μ—…μ„ ν•˜λ‚˜μ”© μ²˜λ¦¬ν•˜κΈ°λ•Œλ¬Έμ—, μš”μ²­μ΄ λŠ˜μ–΄λ‚˜λ„ 전체 큐 κ°―μˆ˜λŠ” λŠ˜μ–΄λ‚˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ„±λŠ₯이 κΈ‰κ²©νžˆ μ €ν•˜λ˜μ§€ μ•ŠμŒ.

ExecutorService

ExecutorServiceλŠ” μŠ€λ ˆλ“œμ—μ„œ 비동기 적으둜 μž‘μ—…μ„ μ‹€ν–‰ν•  μˆ˜μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€.
java.util.concurrent νŒ¨ν‚€μ§€μ— 있고, μŠ€λ ˆλ“œ 풀을 μœ μ§€ κ΄€λ¦¬ν•˜κ³  μž‘μ—…μ„ ν• λ‹Ήν•˜λŠ” 데 λ„μ›€μ΄λœλ‹€. 
λ˜ν•œ μž‘μ—… μˆ˜κ°€ μ‚¬μš© κ°€λŠ₯ν•œ μŠ€λ ˆλ“œλ³΄λ‹€ λ§Žμ„ 경우 μ‚¬μš© κ°€λŠ₯ν•œ μŠ€λ ˆλ“œκ°€μžˆμ„ λ•ŒκΉŒμ§€ μž‘μ—…μ„ λŒ€κΈ°μ—΄μ— λ„£λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

 

 

Fork Join Framework

병렬화 ν•  수 μžˆλŠ” μž‘μ—…μ„ μž¬κ·€μ μœΌλ‘œ μž‘μ€ μž‘μ—…μœΌλ‘œ λΆ„ν•  ν›„ μ„œλΈŒνƒœμŠ€ν¬μ— 각각의 κ²°κ³Όλ₯Ό 합쳐전체 κ²°κ³Όλ₯Ό λ§Œλ“¬

Fork: 데이터 반볡적으둜 뢄리
Join: μ„œλΈŒ κ²°κ³Όλ₯Ό κ²°ν•©ν•˜μ—¬ μ΅œμ’… κ²°κ³Όλ₯Ό λ§Œλ“¬

 

 

ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ 차이

μ„€λͺ…

ν”„λ‘œμ„ΈμŠ€λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ„ κ³΅μœ ν•˜λ©°, μŠ€λ ˆλ“œλŠ” μŠ€νƒμ˜μ—­μ„ 생성함

 


μ°Έκ³ 

https://wikibook.co.kr/java-oop-for-spring/ (μ±…: μŠ€ν”„λ§ μž…λ¬Έμ„ μœ„ν•œ μžλ°” 객체지ν–₯의 원리와 이해)
https://3dmpengines.tistory.com/2003

https://www.javatpoint.com/java-executorservice

 

ν”„λ‘œμ„ΈμŠ€&μ“°λ ˆλ“œμ™€ λ©”λͺ¨λ¦¬(μŠ€νƒ, λ ˆμ§€μŠ€ν„°)

Threadλž€ ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨λ‚΄μ—μ„œ μ—¬λŸ¬ 개의 μ‹€ν–‰ 흐름을 두기 μœ„ν•œ λͺ¨λΈ ν•˜λ‚˜μ˜ ν”„λ‘œμ„Έμ„œ(μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨)μ—μ„œ 각 독립적인 일의 λ‹¨μœ„μΈ μŠ€λ ˆλ“œ(Thread)둜 μ—¬λŸ¬ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€. μ¦‰ ν•˜

3dmpengines.tistory.com

https://cheershennah.tistory.com/170

https://www.geeksforgeeks.org/thread-pools-java/

https://black9p.github.io/2018/01/20/병렬-데이터-μ²˜λ¦¬μ™€-μ„±λŠ₯/

λ°˜μ‘ν˜•

'개발 > java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

WebClient μ‚¬μš©μ‹œ μ£Όμ˜ν• μ !  (0) 2023.08.13
[RxJava] λ¦¬μ•‘ν‹°λΈŒ ν”„λ‘œκ·Έλž˜λ°  (0) 2022.05.02
java - call by value, call by reference  (0) 2021.07.11
μžλ°”-λžŒλ‹€(lambda)  (0) 2021.05.28
jdbc, mybatis, jpa  (0) 2018.12.31
λ°˜μ‘ν˜•
  • jdbc(Java Database Connectivity)
μ†ŒμŠ€μ½”λ“œμ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘κ·Ό κ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” API

  • Mybatis (μ˜μ†μ„± ν”„λ ˆμž„μ›Œν¬μ˜ 일쒅)
μ†ŒμŠ€μ½”λ“œ(μ •ν™•νžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜(μ†ŒμŠ€μ½”λ“œμ— λ°μ΄ν„°μ˜ 데이터λ₯Ό ν‘œν˜„:클래슀λ₯Ό μ£Όμž…ν•˜μ—¬ μ‚¬μš© κ°€λŠ₯) 으둜)μ—μ„œ 
sqlλ¬Έμž₯을 λΆ„λ¦¬ν•˜μ—¬ xml에 μ €μž₯ ν•˜λ©΄μ„œ 이 λ‘˜μ„ μ—°κ²°μ‹œμΌœμ£ΌλŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€.
SQLmapper : jdbcTemplate

  • Ibatis->mybatis 이름바뀐 이유
apacheμ—μ„œ google둜 μ΄λ™ν•˜λ©΄μ„œ λͺ…칭이 변경됨.

--> 데이터 μ „λ‹¬λ§Œ ν•˜κ³  객체지ν–₯을 κ³ λ €ν•˜μ§€ μ•Šμ•˜λ‹€.

  • ORM(Object-Relationl Mapping)
객체와 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 차이λ₯Ό μ€‘κ°„μ—μ„œ ν•΄κ²°
RDBλ₯Ό 객체지ν–₯적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•œ 기술.

  • Hibernate
ORMκΈ°λŠ₯ 제곡. ν”„λ ˆμž„μ›Œν¬
쿼리 μž‘μ„± ν•„μš” μ—†κ³ , xml λ©”νƒ€λ°μ΄ν„°λ‘œ 객체관계 맀핑을 κ°„λ‹¨ν•˜κ²Œ μˆ˜ν–‰.

  • JPA
ORMν‘œμ€€ μ œμ‹œ
μžλ°”μ§„μ˜μ—μ„œ λ§Œλ“¬. ORMκΈ°μˆ ν‘œμ€€.
SQLμž‘μ„± 없이 객체λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— 직접 μ €μž₯ν•  수 μžˆκ²Œν•˜κ³  
객체와 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ 차이도 μ€‘κ°„μ—μ„œ ν•΄κ²° ν•΄ 쀌

예λ₯Όλ“€λ©΄ 쿼리가 λ³€κ²½λ˜λ©΄, μ†ŒμŠ€μ½”λ“œλ„ λ³€κ²½ν•΄μ•Όν•˜λŠ” 상황이 생김

κ°œλ°œμžλŠ” SQL을 μž‘μ„±ν•˜μ§€ μ•ŠμŒ. μ–΄λ–»κ²Œ ν‘œν˜„λ μ§€ μ˜ˆμƒν•˜λ©΄λ¨.
쑰회된 κ²°κ³Όλ₯Ό 객체둜 λ§€ν•‘ν•˜λŠ” μž‘μ—…λ„ μžλ™μœΌλ‘œ 처리됨. 
데이터 μ €μž₯ 계측에 μž‘μ„±ν•΄μ•Ό ν•  μ½”λ“œκ°€ 1/3으둜 쀄어듬.

개발 생산성 & μœ μ§€λ³΄μˆ˜ 쒋아짐

λ‚¨λŠ”μ‹œκ°„μ— μ½”λ“œ ν’ˆμ§ˆκ³Ό ν…ŒμŠ€νŠΈμ— 더 λ§Žμ€ μ‹œκ°„μ„ μŸμ„ 수 있음. 
but, λ³΅μž‘ν•œ 쿼리λ₯Ό 닀룰땐 ν•œκ³„κ°€ 있긴 함..


λ°˜μ‘ν˜•

+ Recent posts