기본 콘텐츠로 건너뛰기

앵귤러 튜토리얼 (Angular tutorial) -14

앵귤러 튜토리얼 (Angular tutorial) -14

저번시간에는 web에서 메모리를 활용하여 데이터베이스의 효과를 보기위한 작업을 하였다.

이번시간에는 서비스를 조금 더 깔끔하게 수정해 보도록 하자.

이전 시간에는 메인컴포넌트에서 직접적으로 http모듈을 호출하여 데이터베이스에 접속하는 행위를 하였다.

"데이터베이스에 접속하는 행위" 라는 것은 메인 컴포넌트, 헤더 컴포넌트, 바디컴포넌트 등 다른 어떠한 컴포넌트에서도 공통적으로 사용되는 행위가 될 수 있다.

그러므로 공통적으로 사용되는 기능은 이전에 만들어둔 서비스로 분리하여 사용하도록 바꾸어 보자.

불필요한 코드를 먼저 제거하자. 메인컴포넌트에서 불필요한 코드는 싹 제거한다.

import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { title = 'dashboard'; constructor(){ } private showType : any; getEventFromHead (event){ this.showType = event; } }

그러고보니 a일 경우에는 사용자, b일 경우에는 게시판이 나오도록 값을 정하였었다. (헤더에서 클릭할 때)

마찬가지로 해당 데이터도 공통으로 사용되니 아에 분리를 시켜보자.

기존에 모듈에서 사용했던 ShareData의 내용을 수정하자.

import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { HeadComponent } from './head/head.component'; import { BodyComponent } from './body/body.component'; import { ShareService } from './share.service'; //해당 서비스 임포트 import { HttpClientModule } from '@angular/common/http'; //http import {WebDbService} from './web-db.service'; //웹DB import {InMemoryWebApiModule} from 'angular-in-memory-web-api'; //DB구현 모듈 const ShareData = [ {type :'A', url : '/test/user'}, //type이 A이면 사용자 값url {type :'B', url : '/test/dash'} //type이 B이면 게시판 값 url ]; @NgModule({ declarations: [ AppComponent, HeadComponent, BodyComponent ], imports: [ BrowserModule, InMemoryWebApiModule.forRoot(WebDbService,{delay:500,put204:false}), //DB구현 모듈 추가 HttpClientModule //HTTP 연결 ], providers: [{provide: 'alias',useValue:ShareData}, ShareService], bootstrap: [AppComponent] }) export class AppModule { }

type이 A이면 사용자, B이면 게시글이 나오도록 하기 위해서 ShareData 상수의 내용을 배열형태로 바꾸었다.

web-db 역할을 하는 서비스에 기본적으로 글이 나오도록 아래처럼 수정하여 주자.

import { Injectable } from '@angular/core'; import {InMemoryDbService} from 'angular-in-memory-web-api'; @Injectable({ providedIn: 'root' }) export class WebDbService implements InMemoryDbService{ private _database : any; //데이터베이스 constructor() { } createDb(){ //상속받아 구현 this._database = {}; this._database['user'] = [ //기본 데이터1 {name:'관리자',date:'2019-01-20',id:'root'}, {name:'고급사용자',date:'2019-06-18',id:'admin'}, {name:'일반사용자',date:'2019-05-04',id:'user'} ]; this._database['dash'] = [//기본 데이터2 {title:'title - 1', desc : 'description', date:'2019-05-11'}, {title:'title - 2', desc : 'description', date:'2019-06-20'}, ]; return this._database; } }

http 요청을 수행해야될 서비스를 이제 수정해볼 차레이다.

간단하게 가져오는 메소드, 등록하는 메소드를 만들어보자.

주소와 파라미터를 받는 메소드를 share.service에 추가한다.

import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class ShareService { public shareValue : number = 1004; //변수 private HTTP : HttpClient; constructor(http : HttpClient) { this.HTTP = http; } getData(url, param){ //가져오는 함수 this.HTTP.get(url, param).subscribe((res)=>{ console.log(res); }); } setData(url, param){ //등록하는 함수 this.HTTP.put(url, param).subscribe((res)=>{ console.log(res); }); } }

일단 콘솔로 찍게만 하였다.

그리고 이벤트를 받는 바디컴포넌트를 최종적으로 수정하자.

import { Component, OnInit, Inject } from '@angular/core'; import { Input } from '@angular/core'; import { ShareService } from '../share.service'; @Component({ selector: 'app-body', templateUrl: './body.component.html', styleUrls: ['./body.component.css'] }) export class BodyComponent implements OnInit { private code : any; private service : ShareService; constructor(@Inject('alias') alias, serve : ShareService ) { //생성자로 받기 this.code = alias; //모듈에서 넘어온 배열값 this.service = serve; } @Input() set getShowType(arg : any){ //set 문법 this.code.forEach( item => { //반복문 if(item.type == arg){ //type값이 같다면.. this.service.getData(item.url , {}); } }); } ngOnInit() { } }

버튼을 클릭할 때마다 콘솔로 데이터가 잘 나옴을 확인 할 수 있다.

그렇다면 데이터를 화면에 표출을 하고싶은데..subscribe에서 데이터를 어떻게 가져와서 표현해야 될까..?

share.service를 아래처럼 바꾸어보자.

import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class ShareService { public shareValue : number = 1004; //변수 private HTTP : HttpClient; constructor(http : HttpClient) { this.HTTP = http; } getData(url, param, callback){ //가져오는 함수 this.HTTP.get(url, param).subscribe((res)=>{ console.log(res); callback(res); }); } setData(url, param, callback){ //등록하는 함수 this.HTTP.put(url, param).subscribe((res)=>{ console.log(res); callback(res); }); } }

callback이라는 람다가 생겼다. callback은 자바스크립트로 비교하자면 함수형태 function(){}값을 넣어준 것과 동일한 행위이다.

자바스크립트로 표현하면 아래와 같은 내용 이다.

function abcd(aaa, todo){ //todo는 함수abcd가 실행할 행위 이다. var number = 10; aaa = aaa+ 10; todo(aaa); } abcd(10, function(result){ //콜백 행위 console.log(result); });

콜백행위, 즉 url을 호출한 행위가 정의 되었으니 이제 바디컴포넌트를 다시 수정하자.

import { Component, OnInit, Inject } from '@angular/core'; import { Input } from '@angular/core'; import { ShareService } from '../share.service'; @Component({ selector: 'app-body', templateUrl: './body.component.html', styleUrls: ['./body.component.css'] }) export class BodyComponent implements OnInit { private code : any; private service : ShareService; constructor(@Inject('alias') alias, serve : ShareService ) { //생성자로 받기 this.code = alias; //모듈에서 넘어온 배열값 this.service = serve; } private list : any; //user 데이터를 그려줄 리스트 private list2 : any; //dash 데이터를 그려줄 리스트 @Input() set getShowType(arg : any){ //set 문법 this.code.forEach( (item, index) => { //반복문, index 0은 A값, 1은 B값이다. if(item.type == arg){ //type값이 같다면.. this.service.getData(item.url , {}, (result)=>{ //람다를 추가하여 데이터를 받자. if(index == 0){ //A값이면 this.list = result; this.list2 = null; } else { //B값이면 this.list = null; this.list2 = result; } }); } }); } ngOnInit() { } }

데이터를 표현하기위해 list와 list2라는 변수를 선언하였다.

바디컴포넌트의 html파일을 앞선시간에 살펴본 ngFor를 통해서 출력하면 제법 그럴싸하게 데이터가 나온다.

바디컴포넌트의 html파일을 수정하자.

{{item.id}} {{item.name}} {{item.date}} {{item.title}} {{item.desc}} {{item.date}}

상단 헤더의 버튼을 누르면 데이터가 원하는데로 잘 표출됨을 알 수 있다.

처음 실행 모습 유저버튼 클릭 대쉬보드 버튼 클릭

여기까지 잘 따라왔다면 앵귤러의 기초중의 기초는 거의 다 한것으로 볼 수 있다.

1. 컴포넌트의 의미와 관계

2. 모듈의 의미와 관계

3. 서비스의 의미와 관계(공통으로 사용되는)

이제 남은 기능은 헤더컴포넌트에서 아직 공통으로 사용되는 변수인 ShareData를 활용하여 헤더의 html을 동적으로 바꾸는 행위 1개와, share서비스에 있는 setData를 사용하는것 1개가 남았다.

해당 2가지의 기능은 이제 직접 복습 또는 구글링을 통해서 구현해보도록 하자.

다음시간에는 subscribe라는 함수의 의미와 역할, 기능이 무엇인지 알아보도록하자.

src.zip 0.01MB

from http://lts0606.tistory.com/131 by ccl(A) rewrite - 2020-03-06 04:20:32

댓글

이 블로그의 인기 게시물

[Angular] Router 라우터 정리

[Angular] Router 라우터 정리 Angular2 버전 이후를 기준으로 정리한 글입니다. 라우터는 URL을 사용하여 특정 영역에 어떤 뷰를 보여 줄지 결정하는 기능을 제공한다. 전통적인 서버사이드 렌더링을 하는 웹 사이트는 주소가 바뀔 때마다 서버에 전체 페이지를 요청하고 전체 페이지를 화면에 렌더링한다. 매 요청시 전체 페이지를 새로 랜더링하는 것은 비효율적이기 때문에 라우터를 이용하여 필요한 부분만 랜더링을 한다면 효율적일 것이다. 라우터는 URL에 해당하는 컴포넌트를 화면에 노출하고 네비게이션을 할 수 있는 기능을 가지고 있다. Router 구성 요소 Router – 라우터를 구현하는 객체이다. Navigate() 함수와 navigateByUrl() 함수를 사용하여 경로를 이동할 수 있다. RouterOulet – 라우터가 컴포넌트를 태그에 렌더링하는 영역을 구현하는 Directive이다. Routes – 특정 URL에 연결되는 컴포넌트를 지정하는 배열이다. RouterLink – HTML의 앵커 태그는 브라우저의 URL 주소를 변경하는 것이다. 앵귤러에서 RouterLink를 사용하면 라우터를 통해 렌더링할 컴포넌트를 변경할 수 있다. ActivatedRoute – 현재 동작하는 라우터 인스턴스 객체이다. Router 설정 라우터를 사용하기 위해서는 먼저 Router 모듈을 import 해야 한다. import { RouterModule, Routes } from '@angular/router'; 라우터에서 컴포넌트는 고유의 URL과 매칭된다. URL과 컴포넌트는 아래와 같이 Routes 객체를 설정하여 지정할 수 있다. 아래의 예에서는 디폴트 path에서는 MainComponent가 노출이 되고 product-list path에서는 ProductListComponent가 노출이 되도록 설정을 한 것을 볼 수 있다. const routes: Routes = [ { pa...

[Angular] Controller

[Angular] Controller Step02_controller.html // angular 모듈 만들기 var myApp = angular.module( "myApp" ,[]); // Ctrl1 이라는 이름의 컨트롤러 만들기 myApp.controller( "Ctrl1" ,[ "$scope" , function ($scope){ $scope. name = "김구라" ; $scope.clicked = function (){ alert ( "버튼을 눌렀네?" ); }; $scope.nums = [ 10 , 20 , 30 , 40 , 50 ]; }]); // Ctrl2 이라는 이름의 컨트롤러 만들기 myApp.controller( "Ctrl2" ,[ "$scope" , function ($scope){ $scope. name = "원숭이" ; $scope.friends = [ {num: 1 , name : "김구라" ,addr: "노량진" }, {num: 2 , name : "해골" ,addr: "행신동" }, {num: 3 , name : "원숭이" ,addr: "동물원" } ]; }]); 내이름은 : {{name}} 눌러보셈 {{tmp}} 너의 이름은 : {{name}} 번호 이름 주소 {{tmp.num}} from http://heekim0719.tistory.com/164 by ccl(A) rewrite - 2020-03-07 09:21:16

JQuery - $ 사용 유형.

JQuery - $ 사용 유형. 최근에 새로운 Javascript 프레임워크와 라이브러리들이 많이 등장했고 시장 점유율 또한 많이 변동 되었다고 한다. 특히 요새 대새는 Angular와 React라고들 한다. 그리고 Jquery 요즘 누가써? Jquery 퇴물이야 등등... 그런 이야기들을 종종 찾아볼 수 있는데, 유행은 돌고 돌듯이 결국 Jquery가 몰락할 일은 없다고 생각하는 바, 묵묵히 Jquery를 고집하기로 한다...ㅎㅎ 먼저 Jquery 교과서랄까.. 기본 문법을 배울 수 있는 링크를 걸어둔다. https://www.w3schools.com/jquery 여기서 기초들을 다 익힐 수 있다. 프로그래밍 문법을 한번이라도 봤다면 + - * / 같은 연산 while, for 등은 다 비슷하기 때문에 $ 사용법만 잘 알면 될 것 같다. $ syntax 사용유형 일단 기본적으로 $는 JQuery에서 미리 정해놓은 변수 값이다. : JQueryStatic 1. $( ) : JQueryObject 가장 많이 사용하는 형태이다. 괄호 안에 들어 갈 수 있는 것들은 클래스 이름, 아이디, 셀렉터 등이다. 예를 들어 $('p')이면 현재 html 페이지에 있는 모든 를 JqueryObject로 가져오겠다는 것이다. hide()는 제이쿼리 메서드이다. $('p')는 제이쿼리 오브젝트이기 때문에 제이쿼리 메서드를 사용할 수 있다. 그중의 하나인 hide()를 사용해 보았다. 결과이다. 에는 스타일이 적용이 되었다. 해당 태그에는 jquery의 메서드가 적용이 된 것을 확인할 수 있다. 2. $.함수 : 플러그인 개발 또는 기본 전역함수 플러그인을 개발 할 때나 Jquery가 갖고 있는 기본 전역함수들을 사용할 때 쓴다. 전역함수에는 여러개가 있는데 그중에 개인적으로 많이 쓰는 것은 $.ajax({}), $.each({}) 등이 있다. 이 함수들의 사용방법은 따...