본문 바로가기

Develop

(317)
[Spring] ObjectProvider에 대해서. 흔히 DL 관련, 사용으로 ObjectProvider를 많이 쓴다. 어떻게 구현되어있고, 어떤식으로 동작하는지 한번 알아보자 Spring 4.3에 추가가 되었다고 한다. 대부분 프로토타입빈과, 싱글톤 빈을 둘다 쓰고 싶을때 사용한다고 보면 된다. 싱글톤 빈에서, 프로토타입 빈을 사용하고자 한다고 가정해보자 프로토타입 빈은 빈을 요청할때마다 신규로 생성이 되는 타입이다. 싱글톤은 미리 생성해둔, 한개의 빈이 리턴되는 형태이다. 그런데, 싱글톤 내에서 프로토 타입빈을 호출하게 된다면? 프로토 타입빈은 변경되지 않고, 계속 같은 빈을 호출하게 된다. 이는 프로토 타입 빈이 알맞게 동작하지 않게 되는 것이다. 이를 극복하기 위해, ObjectProvider,ObjectFactory를 사용한다. @Configur..
[NestJs] 다대일 매핑 다대일 매핑은 한개의 객체와 여러개의 객체의 연관관계를 나타낸 객체 매핑이다. 쉽게 얘기하면 아래와 같다. 만약에 어떤 업체가 음식들을 등록한다고 가정했을떄, 해당 업체:푸드 는 1:N이다. 엔티티에서는 아래와 같이 정의가 가능하다. @JoinColumn() @ManyToOne(() => Corp, (corp) => corp.foods) corp : Corp; //업체 매핑 업체는 프라이머리키를 표현해서 아래와 같이 또 표현 가능하다. @OneToMany(() => Food, (food) => food.corp) foods: Food[] 그러면 이때 CRUD로직은 어떻게 변하는지 확인해보자 우선 해당 관련 controller ~ repoistory를 작성할 것이다. 완벽한 설계다 라는 확신은 없는데, 우..
[DDD] EventListener, TransactionalEventListener? 비슷하면서도,,, 느낌이 오면서도.,,,, 무튼 다른,, 그런 두가지 어노테이션을 공부해보려고한다. @TransactionalEventListener는 해당 쓰레드가 언제 트랜잭션을 처리할지, Phase를 통해서 정의할 수 있다. @EventListener는 호출시점에 바로 실행된다. 트랜잭셔널이벤트리스너는, 아래와 같이 4가지 Phase를 나눠서 등록이 가능하다. @Component class MemberEventHandler { @EventListener fun defaultEventListener(event : MemberSave){ logger.info("defaultEventListener ---> {}", event) } @TransactionalEventListener(phase = Tran..
[DDD] EventListener들은 어디에 저장되고 어떻게 호출될까? EventListener가 어떻게 등록이되고 캐치가 될까? applicationEventPublisher는 Event를 받아, 리스너들에게 Event를 Publish해준다. 도대체 어떻게 무슨 원리로 Publish 되는걸까 ApplicationEventPublisher 인터페이스는 아래 4개의 곳에서 재 정의한다. 그리고, 보통은 AbstarctApplicatonContext에서 정의한 걸 따라간다. AbstractApplicationContext - publishEvent 중요한 부분은 아래이다. Multicaster에게 작업을 위임한다. SimpleApplicationEventMulticaster의 내용이다. 보면 알다싶이, 이벤트 타입을 받아오고, getApplicationListeners를 통해서..
[DDD] Notification and Event 생소한 단어들일 수 있다. DDD를 하지 않으면, 잘 모른다. 우선, 공부를 해보자. Notification은 전파, 전달에 대한 기능을 구현하는 모듈이다. Event가 발생했을때, Notification을 주어서, 특정 이벤트를 발생시키는것이다. Outbox패턴으로 작업한다면, 이벤트를 저장하고, 배치나 스케줄러를 통해서 적정 단위로 처리된다. 이벤트 소싱과 Notification은 다르다. Notification이란, Repository에서 애그리게잇을 가져올때 이벤트를 사용해서 재구성한다. 재구성 하기 위해서는 이벤트 소싱이 가장 중요하다. 특정이벤트를 관심있어 하는 주체에 대해, Notification이 발동된다. Notification은 이벤트 소싱에 저장된 일련의 애그리게잇, 주체에게 이벤트를..
[Spring] 멀티모듈의 개념 멀티모듈, 단일 프로젝트로하면 어떤 장점이 있을까? 왜 굳이 멀티 모듈을 두는것일까? 시스템적으로 보장이되고, 빠른 개발 사이클을 가질 수 있다. 멀티모듈과 MSA가 어떤 연관이 있을까? MSA에서는 분리와 병합이 자주된다. 시스템의 분리,통합을 유연하게 만들어줄 수 있는 좋은 아키텍처를 만들 수 있다. 클린 아키텍처라는 책에서는 모놀리틱과 msa적인 변경이 자유로운 아키텍처가 좋은 아키텍처라고 얘기한다. 대부분 공통화된 코드를 분류해서 뽑아내려고하면 공통화된코드를 Common으로 모은다. 그러면, common이 계속 커지면서 개발하기 힘들어진다. 1. 스파게티 소스가 된다. Common이 커지면서 영향범위가 점점 커지기 마련이다. 즉 스파게티 소스가 되고 분리가 어려워진다. 쉽게 말하면 뭐가 뭔지 모르..
[NestJs] Api 좀 더 Restful 하게 변경 거지같던 레거시..가 아니고 내 코드를 좀더 바꿨다. (controller) import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Put, NotFoundException } from '@nestjs/common'; import { CorpService } from './corp.service'; import { JwtAuthGuard } from 'src/auth/auth-guard'; import { Corp } from './entities/corp.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiQuery, ApiParam, ApiBody } from '@nestjs/sw..
[NestJs] 수정, 삭제 저번에는 생성을 하는 API를 간단하게 개발했는데, 이제는 수정 및 삭제에 대한 API를 생성해보자 뭐 생성만 하면 사실 수정은 껌이다. 서비스는 기존 생성과 동일하다. 바뀐 부분이라면 dto,entity 가 변경됬다. (컨트롤러) @Put('') putCorp(@Body('corp') corpReqDto :CorpReqDto){ return this.corpService.saveCorp(corpReqDto); } (Dto) import { IsNotEmpty } from "class-validator"; import { Corp } from "./entities/corp.entity"; import { ClassSerializerInterceptor } from "@nestjs/common"; impo..