20220125 TIL

한결·2022년 1월 26일
0

TIL(Today I Learned)

목록 보기
12/14

오늘은 어제 한 내용에 대해 느슨한 결합으로 바꿔주었다.

느슨한 결합(loose-coupling)

다른 클래스를 직접적으로 사용하는 클래스의 의존성을 줄이는 것.

강한 결합(Tight coupling)

-> new 선언이 많은 것은 좋지 않음.
-> 결합이 강하게 되어있어 결합이 되어있지 않으면 사용할 수 없게됨

실습

import { ProductService} from './services/product.service.js'
import { CashService } from './services/cash.service.js'

export class ProductController{
    buyProduct=(req, res)=>{
        //1. 가진 돈 검증하는 코드(10줄->2줄)
        const cashService = new CashService()
        const hasMoney = cashService.checkValue()

        //판매여부 검증하는 코드(10줄 -> 2줄)
        const productService = new ProductService()
        const isSoldout = productService.checkSoldout()

        //3. 상품 구매하는 코드
        if(hasMoney && !isSoldout){
            //상품구매
            res.send('상품을 구매합니다')
        }
    }
    refundProduct=(req, res)=> {
        //1. 판매여부 검증하는 코드(10줄->2줄)
        const productService = new ProductService()
        const isSoldout = productService.checkSoldout()
    
        //2. 상품 환불하는 코드
        if(!isSoldout){
            res.send('상품을 환불합니다')
        }
    }
}

의 어제 코드에서 buyProductredundProduct에서 판매여부 검증하는 코드가 동일하기 때문에

export class ProductController{
    constructor(moneyService, productService){
        this.productService = productService
        this.moneyService = moneyService
    }
}

로 class에 넣어줘서

const productService = new ProductService()
const moneyService1 = new CashService() //new 한번으로 모든 곳에서 사용 가능 (싱글톤패턴)
const moneyService2 = new PointService() // 포인트결제 추가

느슨한 결합으로 풀어줄 수 있다. 하지만 의존성 주입이 꼭 싱글톤패턴이라고 할 수는 없다.

그림으로 설명한다면 아래와 같다.

이 모든 것들은 Nest js에서 해줄것이다.
-> 제어가 역전된다고 하는데 (Inversion Of Control, IoC)라고 한다.

느슨한 결합은은 Dependenct-Injection, DI이고, 스프링과 네스트에서 사용한다.

Nestjs

효율성/안정성/확장성 등의 장점이 있다.

  • 협업을 위한 도구들도 같이 설치됨
    nest new project-name
    Npm i -g @nestjs/cli
  • 컨트롤러와 서비스가 모듈에 합쳐짐
  • 모듈을 임포트해서 넣어주면 이미 두가지 있다는 소리
  • import { AppModule } from './app.module'; 만 하는 이유
  • -> 자동으로 의존성을 주입해준다는 점

Typescript

//문자타입 - 타입추론
let aaa = "안녕하세요" //처음 잡힌 타입으로 설정됨
// aaa = 3 //숫자라서 불가능
aaa = "반갑습니다"

//문자타입
let bbb: string = "반갑습니다"
bbb = "반가워요"
bbb = 123

//숫자타입 
let ccc = 5
ccc=10
ccc="dd"

//불린타입
let ddd : boolean = true
ddd = 11
ddd = "22"

//배열타입
let eee = [1,2,3,4,5]
let fff : String[] = ["c", "d"]
let ggg : (number| string)[]= [1, "ccc", 3, "33"]
let money : number[] | string[] = [1000, 2000, 3000]


//객체타입
interface Iprofile{
    name: string
    age: number | string
    school: string
}
let profile: Iprofile ={ //Interface의 Iprofile 선언해서 넣어주기
    name: "철수",
    age: 13,
    school:"다람쥐초"
}
profile.age = "13살"//하고싶으면 타입추론되게 하지말고 타입을 직접 만들어줘야함

//함수타입
function qqq(a:number, b:number) : string {// 리턴값도 선언해줌
    // return a+b
    return "ggg"
}
const result = qqq(1, 2)

처럼 타입을 미리 지정해줘야 한다.

@Decorator는

실행하려는 사용자가 구조를 수정하지 않고 기존 객체에 새로운 기능을 추가할 수 있도록 하는 디자인 패턴이다. 함수의 정의 전에 호출된다.

function zzz(aa){
    console.log('--------')
    console.log(aa)
    console.log('--------')
}

@zzz
class AppController{

}

를 실행하게 되면,
AppController 클래스 위에 데코레이터 aaa를 작성해 AppController클래스가 함수의 매개변수로 받아져서 aaa내부에서 사용된것을 알 수 있다.

0개의 댓글