๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Angular

Rxjs?

by frontChoi 2022. 2. 19.
๋ฐ˜์‘ํ˜•

๐Ÿ˜ข RXjs?

์ž๋ฐ”์Šคํฌ๋ฆฝ์—์„œ ๋ฆฌ์•กํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” "๋™๊ธฐ"๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹(map,array,... ๋“ฑ๋“ฑ) ๊ณผ "๋น„๋™๊ธฐ"๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹(Ajax , ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ๋“ฑ..) ๊ฐ๊ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋ฉฐ ์ˆœ์„œ์˜ ํ๋ฆ„์„ ์ฐพ๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค.

๊ทธ๋ฆฌํ•˜์—ฌ ๋™๊ธฐ,๋น„๋™๊ธฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿคฉ Rxjs ์ž‘๋™์›๋ฆฌ

Rxjs์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” Observable ๊ณผ Obserable๋ฅผ ๊ตฌ๋…ํ•˜๋Š” Observer๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

Obserable์™€ Observer

Observable ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜๋ฉด, Observable๋ฅผ ๊ตฌ๋…ํ•˜๋Š”Observer๋Š” ๋ฐ์ดํ„ฐ ๋ณ€ํ™”์—๋”ฐ๋ผ ๋ฐ˜์‘ํ•œ๋‹ค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ˜ข Angular ์—์„œ Rxjs ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์ด๋ฒˆ์—๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Obserable๊ณผ Observer๋ฅผ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
// RxJS ์ž„ํฌํŠธ
import { Observable } from 'rxjs';
@Component({
  selector: 'app-rxjs',
  templateUrl: './rxjs.component.html',
  styleUrls: ['./rxjs.component.css']
})
export class RxjsComponent implements OnInit {

  constructor(private http: HttpClient) { 
    
  }

  ngOnInit() {
    this.makeObserable();
  }

  makeObserable() {
    //1.์˜ต์ €๋ฒ„๋ธ”์ด ๊ตฌ๋…๋ ๋•Œ ํ˜ธ์ถœ ๋˜๋Š” ํ•จ์ˆ˜
    const subscriber = (observer: any) => {
      try {
        //next ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฐฉ์ถœ
        observer.next(1);
        observer.next(2);

        //complete ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
        observer.complete();
      } catch (error) {
        observer.error(error);
      }
      finally {
        // ๊ตฌ๋… ํ•ด์ง€๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜
        return () => console.log('Unsubscribed!')
      }
    }

    //2.์˜ต์ ธ๋ฒ„๋ธ” ์ƒ์„ฑ
    const observer$ = new Observable(subscriber);


    //3.๊ตฌ๋…(subscription)
    observer$.subscribe(
      // ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฉ์ถœํ•œ next ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์— ๋ฐ˜์‘ํ•˜๋Š” next ๋ฉ”์†Œ๋“œ
      value => console.log(value),
      // ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฉ์ถœํ•œ error ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์— ๋ฐ˜์‘ํ•˜๋Š” error ๋ฉ”์†Œ๋“œ
      error => console.error(error),
      // ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฉ์ถœํ•œ complete ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์— ๋ฐ˜์‘ํ•˜๋Š” complete ๋ฉ”์†Œ๋“œ
      () => console.log('Complete')
    )

  }

}

 

1.๊ตฌ๋…ํ•จ์ˆ˜(subscriber)๋ฅผ ๋งŒ๋“ค๊ณ  , ๊ตฌ๋…ํ•จ์ˆ˜๋ฅผ Obserable๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

const subscriber = (observer: any) => {
	try {
     //next ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฐฉ์ถœ
     observer.next(1);
     observer.next(2);

     //complete ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
     observer.complete();
    } catch (error) {
      observer.error(error);
    }
    finally {
    // ๊ตฌ๋… ํ•ด์ง€๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜
      return () => console.log('Unsubscribed!')
    }
}
//2.์˜ต์ ธ๋ฒ„๋ธ” ์ƒ์„ฑ
const observer$ = new Observable(subscriber);

 

๊ทธ๋ฆฌํ•˜์—ฌ ์•„๋ž˜ ๊ฐ™์€ ๊ทธ๋ฆผ์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

Observable ์ƒ์„ฑ

2. ๋‹ค์Œ์œผ๋กœ Obserable๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

//3.๊ตฌ๋…(subscription)
observer$.subscribe(
  // ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฉ์ถœํ•œ next ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์— ๋ฐ˜์‘ํ•˜๋Š” next ๋ฉ”์†Œ๋“œ
  value => console.log(value),
  // ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฉ์ถœํ•œ error ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์— ๋ฐ˜์‘ํ•˜๋Š” error ๋ฉ”์†Œ๋“œ
  error => console.error(error),
  // ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฉ์ถœํ•œ complete ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์— ๋ฐ˜์‘ํ•˜๋Š” complete ๋ฉ”์†Œ๋“œ
  () => console.log('Complete')
)

subscribe๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ ˆ๋Œ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ๊ผญ subscribe๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.

subscribe๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ธ์ œ ์•„๋ž˜ ๊ทธ๋ฆผ์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

subscribe

์œ„์™€ ๊ฐ™์ด ์ธ์ œ subscribe๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ• ๊ฒฝ์šฐ  Observer(next, error, complete)๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿงค ๋‹ค์Œ์—๋Š”..?

Rxjs๋ฅผ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•ด๋ณด๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€