icecat471의 개발블로그입니다.

back-end developer & infra engineer

Go언어에서의 DDD

Reference https://dev.to/stevensunflash/using-domain-driven-design-ddd-in-golang-3ee5 https://github.com/victorsteven/food-app-server DDD(Domain Driven Design) DDD의 4Layers Domain : domain이 위치하고, 애플리케이션의 비즈니스로직이 정의된 곳 Infrastructure : 애플리케이션과 독립적인 모든 것이 존재하는 곳(외부 라이브러리, 데이터베이스 엔진 등) Application : domain과 interface 사이의 통로. interface layer에서 domain layer로 요청을 보내고 응답을 반환 Interface : 웹 서비스, RIM 인터페이스 웹 애플리케이션, 배치 프로세스 등 다른 시스템과 상호작용 하는 모든 것이 위치 시작 이 프로젝트는 구조는 아래와 같다....

October 28, 2021 · 10 min · icecat471

[MariaDB] 외래키 제약조건

CREATETABLEUser(idINTNOTNULLPRIMARYKEYAUTO_INCREMENT,usernameVARCHAR(10)DEFAULTNULL,emailVARCHAR(50)DEFAULTNULL,);#외래키이름이랜덤으로만들어짐CREATETABLEUserItem(idINTNOTNULLPRIMARYKEYAUTO_INCREMENT,item_nameVARCHAR(50)DEFAULTNULL,priceINTDEFAULT0,userIdINTDEFAULTNULL,FOREIGNKEY(userId)REFERENCESUser(id));#외래키이름을지정해서만들기CREATETABLEUserItem(idINTNOTNULLPRIMARYKEYAUTO_INCREMENT,item_nameVARCHAR(50)DEFAULTNULL,priceINTDEFAULT0,userIdINTDEFAULTNULL,CONSTRAINTFK_USER_ITEM_USERFOREIGNKEY(userId)REFERENCESUser(id));아래의 쿼리로 제약조건을 확인해볼 수 있다....

June 6, 2021 · 1 min · icecat471

Udemy 자막 실시간 번역

Udemy 계정 프로필 언어를 ENGLISH(EN)으로 설정한다. 강의 자막(English)을 활성화 후, “Caption setting > Display under video"를 활성화한다. Transcript를 활성화 후, 구글 브라우저 “이 페이지 번역하기"를 눌러 한국어로 번역한다. 우측 Transcript 스크롤을 위 아래로 움직여 모든 텍스트가 번역되도록 만든다. F12 > Console에 아래 코드를 붙여 넣고 엔터 if(typeof window.i!=='undefined'){clearInterval(window.i)}else{let lastText='';function check(){let toEl=$('.well--container--2edq4 span');let fromEl=$('p[data-purpose="transcript-cue-active"] span');let currentText=fromEl.html();if(lastText!==currentText){toEl.html(currentText)}lastText=fromEl.html()}window.i=setInterval(check,200)} F12 창을 닫은 후 재생하여 자막 확인

June 5, 2021 · 1 min · icecat471

[Go언어] gorilla websocket request origin 에러

websocket: request origin not allowed by Upgrader.CheckOrigin 위 에러 발생시 upgrader.CheckOrigin = func(r *http.Request) bool { return true } 위 코드를 추가해준다. 필요에 따라 origin check 로직을 추가해주면 된다.

June 2, 2021 · 1 min · icecat471

[Go언어] Closure

클로저(closure) 함수를 일급객체로 취급하는 함수형 프로그래밍 언어(Erlang, Scala, Haskell 등)에서 사용되는 중요한 특성이다.클로저에 대해 MDN은 아래와 같이 정의하고 있다. “A closure is the combination of a function and the lexical environment within which that function was declared.” “클로저는 함수와 그 함수가 선언된 렉시컬 환경의 조합이다.” 아래의 예제를 먼저 확인해 보자 package main func outerFunc() func() { x := 10 innerFunc := func() { fmt.Println(x) } return innerFunc } func main() { f := outerFunc() f() // output: // 10 } scope는 함수를 호출할 때가 아니라 어디에 선언하였는지에 따라 결정된다....

May 25, 2021 · 2 min · icecat471

[NestJS] (공식문서 번역) Asynchronous providers

NestJS 공식문서 번역 겸 공부하는 글 입니다. 의역 및 오역이 있을 수 있습니다. https://docs.nestjs.com/fundamentals/async-providers Asynchronous providers 때떄로, 애플리케이션은 하나 또는 그 이상의 비동기 작업이 끝날때까지 시작이 지연되어야한다. 예를 들어, 데이터베이스에 연결이 될때까지는 request를 받고싶지 않을 것이다. asynchronous provider를 사용하여 이를 해결할 수 있다.이것을 위한 문법은 useFactory와 함께 async/await를 사용하는 것이다. factory는 Promise를 리턴하며, await를 사용해 비동기 작업을 대기할 수 있다. Nest는 이러한 provider에 의존하는 클래스가 인스턴스화 될때까지 대기한다. { provide: 'ASYNC_CONNECTION', useFactory: async () => { const connection = await createConnection(options); return connection; }, } [hint]...

May 23, 2021 · 1 min · icecat471

[Go언어] 슬라이스에서 요소 삭제

순서가 중요한 경우 package main import "fmt" func remove(slice []int, s int) []int { return append(slice[:s], slice[s+1:]...) } func main() { var Slice1 = []int{1, 2, 3, 4, 5} fmt.Printf("slice1: %v\n", Slice1) Slice2 := remove(Slice1, 2) fmt.Printf("slice2: %v\n", Slice2) } 실행 결과 slice1: [1 2 3 4 5] slice2: [1 2 4 5] 순서가 중요하지 않은 경우 package main import "fmt" func remove(s []int, i int) []int { s[i] = s[len(s)-1] return s[:len(s)-1] } func main() { var Slice1 = []int{1, 2, 3, 4, 5} fmt....

May 22, 2021 · 1 min · icecat471

[NestJS] (공식문서 번역) Custom Providers

NestJS 공식문서 번역 겸 공부하는 글 입니다. 의역 및 오역이 있을 수 있습니다. https://docs.nestjs.com/fundamentals/custom-providers Custom providers 앞선 챕터들에서, 다양한 측면의 의존성 주입(DI)를 어떻게 Nest에서 사용하는지 알아보았다. 하나의 예는 생성자 기반 의존성 주입이다. Nest 코어에서 기본적으로 빌드되는 의존성 주입과 한가지 메인 패턴만을 살펴보았다. 애플레케이션이 더 복잡해질수록 DI 시스템의 모든 특성들을 필요로 하게 될 것이다. 좀 더 자세히 알아보자. DI fundamentals 의존성 주입은 직접 코드로 작성하는 대신, 의존성의 인스턴스화를 IoC 컨테이너(여기서는 NestJS runtime system)에게 맡기는 inversion of control(IoC) 테크닉이다....

May 21, 2021 · 6 min · icecat471

[NestJS] (공식문서 번역) Custom decorators

NestJS 공식문서 번역 겸 공부하는 글 입니다. 의역 및 오역이 있을 수 있습니다. https://docs.nestjs.com/custom-decorators Custom decorators Custom router decorators Nest는 데코레이터라는 특성을 중심으로 만들어졌다. 데코레이터는 많은 프로그래밍 언어에서 알려진 개념이지만, 자바스크립트 세계에서는 상대적으로 새로운 편이다. 데코레이터가 어떻게 작동하는지 더 잘 이해하기 위해서는, 이 글을 읽어보는 것을 추천한다. 아래는 간단한 정의이다. ES2016 데코레이터는 함수를 반환하고, 인자로 target, name, property, description을 받을 수 있는 expression이다. decorate하려고하는 것 맨 위에 @를 접두어로 붙인 데코레이터를 위치함으로써 데코레이터를 적용할 수 있다....

May 14, 2021 · 3 min · icecat471

[NestJS] (공식문서 번역) Interceptors

NestJS 공식문서 번역 겸 공부하는 글 입니다. 의역 및 오역이 있을 수 있습니다. https://docs.nestjs.com/interceptors Interceptors Interceptors interceptor는 @Injectable() 데코레이터로 주석된 클래스이다. interceptor는 NestInterceptor 인터페이스를 구현해야 한다. interceptor는 Aspect Oriented Programming(AOP)에서 영감을 받은 여러가지 기능을 갖고 있다. method 수행 전/후 추가 로직을 bind 함수로부터 반환된 값을 변형 함수로부터 throw된 예외를 변형 기본 함수를 확장 특정 조건들에 따라 함수를 완전히 override(e.g, 캐싱) Basics 각각의 interceptor는 intercept() method를 구현해야하며, 이 함수는 2개의 argument를 받는다....

May 14, 2021 · 6 min · icecat471