오늘은 어제 한 내용에 대해 느슨한 결합으로 바꿔주었다.
다른 클래스를 직접적으로 사용하는 클래스의 의존성을 줄이는 것.
-> 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('상품을 환불합니다')
}
}
}
의 어제 코드에서 buyProduct
와 redundProduct
에서 판매여부 검증하는 코드가 동일하기 때문에
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이고, 스프링과 네스트에서 사용한다.
효율성/안정성/확장성 등의 장점이 있다.
//문자타입 - 타입추론
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)
처럼 타입을 미리 지정해줘야 한다.
실행하려는 사용자가 구조를 수정하지 않고 기존 객체에 새로운 기능을 추가할 수 있도록 하는 디자인 패턴이다. 함수의 정의 전에 호출된다.
function zzz(aa){
console.log('--------')
console.log(aa)
console.log('--------')
}
@zzz
class AppController{
}
를 실행하게 되면,
AppController
클래스 위에 데코레이터 aaa
를 작성해 AppController
클래스가 함수의 매개변수로 받아져서 aaa
내부에서 사용된것을 알 수 있다.