SeSac (2021-08 ~ 2021-12)/Node

디자인패턴 2

배워도끝이없네 2021. 12. 11. 11:50

< DI : Dependency Injection >

 

DAO라는건 매번 new로 만들 필요가 없다. 그래서 싱글톤으로 만드는것이 좋다.

DTO나 VO등등은 매번 바뀌기때문에 new로 만들어낸다.

Service나 Controller등도 매번 new로 새로 만들 필요가 없기 때문에 싱글톤으로 만들어지는 경우가 많다.

 

DI라는것은 설정파일에 string으로 적어둔 것을 프레임워크가 구동될 때 미리 인스턴스를 만들어두는것이다.

 

 

< Proxy pattern > --구조적 디자인패턴중 하나 (생성과 관련없는 패턴은 대부분 구조적패턴이다)

 

subject가 있고 subject(instance)를 쓰기위해서 proxy가 있고 이걸 사용하는 client가 있다.

 

어떠한것의 기능을 감싸서 확장하는 개념을 가지고있다.

 

AOP가 proxy pattern으로 작성되어있다.

 

모든 wrapping class는 proxy pattern이라 할수있는것인가?

 

proxy pattern을 확장하면 decorator pattern이 된다.

 

proxy pattern은 기존에 존재하는것에 주변로직을 넣는느낌이고(trap/hooking을 넣는다)

 

decorator pattern은 기존에 존재하는것에 추가적인 기능자체를 넣는 느낌이다.

 

그래서 사실 proxy pattern과 decorator pattern은 functional language에서는 거의 같은거라고 보면된다.

 

<proxy pattern을 쓰는 이유>

 

1) composition

2) object literal (factory pattern)

3) monkey patch (정식명칙은 객체확장이라고하는데 너무 광범위하기떄문에 이런 이름으로 붙었다) 똑같은 함수를 불렀는데 서로다른결과를 나타내는것은 위험하다. 그래서 monkey라는 이름이 앞에 붙었다.

4) 함수형언어는 class없이 존재할 수 있기 떄문에 다 함수로 싸서 구현하고, class를 강제하는 언어들은 extends를 받아서 한다.

 

< built-in proxy >

자바스크립트에서는  Proxy를 미리 만들어두엇다( new Proxy(subject, handler) ); // 여기서 handler를 trapper혹은 trap handler라고 부른다.

 

파일로 떨구는걸 Serialize라고 한다.

 

Redis는 Serialize를 하기때문에 redis를 죽엿다 켜도 남아있는것이다.

 

실행시키는것을 Deserialize라고 한다.

 

Serialize, Deserialize할때는 Reflect를 이용한다.

 

<Observer pattern>

옵저버는 어노테이션으로 되어잇다

 

@observer('name') //name을 옵저빙

OO(prev,newValue) //name이 변환되면 재실행

 

 computedProperty와 observer라는 개념을 이해해야한다.

 

옵저버만 걸어서 특정아이만 변경이 일어나게되는걸 computedProperty라고한다.

 

양방향 프로퍼티는 단방향 프로퍼티로 바꾸는게 좋다.

 

옵저버라고도 부르고 computed property pattern이라고도 한다.

 

<Adaptor Pattern>

 

원래 가지고있던 subject는 변함이 없지만 앞의 adoptor를 바꿀수 있는것이다

 

이때 adoptor는 인터페이스라고 할수있다.

 

이 패턴도 프록시의 한 계열일 뿐이다.

 

subject는 코드의 변경이 없이 이것을 감싸서 어뎁터를 장착시키게 한다.

 

프록시패턴은 원래코드에서 프록시를 씌우기위한 추가적인 코드가 필요하지만

 

어뎁터 패턴은 기존에 있는 레거시의 코드 변화 없이 새로운 어뎁터를 적용할 수 있게 만듦에 목적이 있다.

 

const fs = require("fs"); //일반적인 fs (내용을바꾸려면 코드를 지우거나 변경해야한다)

const fs = createFileAdapter();  //어뎁터 패턴을 적용한 fs

.... 로직...

fs.readFile(f,'utf-8')
	f의 경로는 어디에서 실행되느냐에 따라 원하는 파일이 나오지 않을수 있다.(절대경로로 하면 되긴 ㅎ지만..)
    하지만 adopter패턴을 사용한다면 adopter에서 실행할때 경로를 미리 줄수있다.

 

<Stratege Pattern: 전략패턴>

전략패턴과 비교되서 사용되는게 state패턴이다.

 

대표적으로 사용되는 모듈이 passport.js이다.

 

네이버로그인버튼 누르면 우리서버로 가서 APIkey와 Scretkey, email, naver_id를가지고 네이버로 요청을보낸다

그럼네이버가 성공실패를 server로 콜백해준다. 그럼서버는 유저한테 성공여부를 반환하는데

 

만약 유저가 가입되지 않은것이라면 네이버가 콜백하기전에  네이버 로그인창을 띠ㅡ운다.

로그인하면 네이버가 서버로 콜백하고 서버가 scope에 가진걸 가지고 서버에 다시 어떠한 정보를 요청해서

네이버가 등록된서버라면 요청된 정보들을 보내준다.

 

<Iterator Pattern>

next와 done으로 이루어져잇다.

 

비동기 iterator

while(!it.done){
	val = it.next(); //... 이렇게하면 이터레이터패턴. 근데 next가 비동기라면?
    //it.next()에 await을 걸어주어야한다.
    
}

//next가 비동기라면

async next(){
	const res = await query();
    return res;
}

 

자바스크립트는 100만건을 한번에 넣을때 insert into User Values ? 라고 치면 한번에 다들어간다(개꿀)

 

<Middleware Pattern>

app.get('/emp-list', (req,res)=>{
	res. ..... //이렇게 하면 위험하다. 권한검사가 안되어있기때문..
})


//그래서 이렇게 할 수 있다

app.get('/emp-list', (req,res)=>{
	x = dec(req.header.token) //복호화함
    x.sessionId === 레디스 userId  ... 그럼 성공..
    
    if(x.auth < 3) return res.status(401).json({code:401, msg:"not authorized.."})
})

 

'SeSac (2021-08 ~ 2021-12) > Node' 카테고리의 다른 글

디자인패턴  (1) 2021.12.07
Node.js 비동기, callback 심화  (0) 2021.12.04
node 비동기  (0) 2021.11.30
개요 (deno와 node의 차이)  (0) 2021.11.30