반응형

web

    Kafka 요약 정리

    Topic- 메시지는 Topic에 분류된다. Partition- Topic은 partition으로 구분된다.- 파티션에 쌓이는 데이터는 로그라고 부르고 각 파티션에 나눠서 저장된다. Topic이 파티션으로 나뉘는 이유- Topic 내부에 파티션이 없을경우 메시지를 보내는 대상이 많아질경우 append 속도가 버거워진다. - 병렬로 분산저장하고자 Partition 개념 생성- 한번 생성한 파티션은 운영중에 줄일 수 없기 때문에 설계시 조심 Consumer- Topic에 있는 데이터를 읽는 대상 Consumer Group- Consumer를 여러개 묶어놓은 것. Consumer Group이 필요한 이유.- 소비를 진행 하던 Consumer가 죽어버릴 경우를 Rebalance 상황이라고 하는데 이럴경우 파티션..

    Spring Reactive Web Application

    Sprint 5에서 리액티브 프로그래밍을 지원하는 웹 애플리케이션을 만들 수 있다. 리액티브 프로그램이란? 이전시간에 정리했었지만 스프링 리액티브 프로그래밍을 들어가기 전에 간단하게 정리해 보자. 일반적으로 리액티브 프로그래밍은 비동기, evnet-driven 방식으로 non-blocking 하는 프로그래밍으로써 일반적인 시스템 보다 작은 작은 쓰레드 수가 필요하다. 그럼 왜? 비동기-논블록킹 리액티브 개발이 가능. 기존 멀티쓰레드 블로킹 방식과는 다르게 서버의 응답에 의지하지 않는 효율적 개발이 가능. 서버간에 호출이 잦은 마이크로 서비스에서 사용됨 Spring Web Reactive Module (Servlet 3.1 이상부터 지원) Spring Framework 5는 spring-web-reacti..

    Spring reactor Mono와 Flux 정리

    지금까지 Spring5에서 추가되었던 리액트 프로그램을 사용하여 간단한 프로그램을 만들어 봤지만 정확하게 Mono와 Flux에 차이와 정의를 정리하지 못한 것 같다. 이번기회에 두 개의 정확한 차이와 사용방법등을 정리해보자. 리액티브 프로그래밍 비동기 블록킹 프로세스로 동작하는 애플리케이션을 논블록킹 프로세스로 동작하기 위해서 지원하는 프로그래밍. (현재 node.js의 동작방식과 유사) 기존 Spring 블록킹 방식 웹에서 서버에 요청이 왔을때 서버는 요청에 대한 적절한 응답을 보내야 하는데 만약 작업이 오래 걸릴 경우에는 요청에 대한 응답이 모두 종료될 때까지 블록킹된다. Spring에서는 그래서 동시 요청 처리를 위해서 멀티 thread를 지원한다. 그러면 하나의 작업이 thread에서 진행되고 다..

    Kafka 정리

    카프카는 분산형 스트리밍 플랫폼으로써 다음으로 정의할 수 있다. 메시지 큐와 유사하게 스트림을 publish하고 subscribe 하는 방식이다.fault-tolerant 지속 방식으로 레코드들의 스트림들을 저장한다. 용도 시스템이나 어플리케이션에서 발생한 실시간 스트리밍 데이터를 안정적으로 데이터 파이라인 구축할 때데이터 스트림을 전송하거나 처리해야할 때 사용 구성 하나이상에 서버에 여러 cluster로 구성되어 있다.topic이라는 카테고리로 레코드 스트림들을 저장한다.각각의 레코드들은 key, value, timestamp로 구성되어 있다. 핵심 APIProducer API하나 또는 그 이상의 카프카 topic을 데이터 스트림에 발행할 수 있도록 해주는 APIConsumer API어플리케이션이 하나..

    생성한 Custom validation으로 에러메시지 출력하기

    바로 직전 https://wedul.tistory.com/562?category=595982 에서 Custom validation을 만들어서 입력된 값에 validation을 체크하는 방법을 알아봤다.그럼 이 validation체크를 통해서 front에 상황에 맞는 에러를 보내줄 수 있도록 조치를 취해보자.우선 @valid 처리를 했었던 컨트롤러에서 에러 메시지를 수집해야한다. 1. ControllerSpring에서 Validation 작업을 진행할 시 validation에 문제가 발생하면 에러 내용을 묶어서 BindingResult로 처리할 수 있도록 제공해준다. 이를 사용하기 위해서 parameter로 BindingResult값을 추가해준다.1234567891011121314/** * 회원가입 * *..

    Custom Validation 만들어서 추가하기

    Spring에서 @NotBlank, @Email등 여러 템플릿에 맞게 Validation을 넣을 수 있다.하지만 추가적으로 패스워드 규칙과 같이 별도 체크할 validator가 필요할 때 만들어서 사용해야 하는데 만들어서 지정해보는 작업을 해보자. 1. Controller요청을 받을 DTO앞에 @Valid 어노테이션을 추가해야한다.1234567891011/** * 회원가입 * * @param reqDto * @return * @throws Exception */@RequestMapping("/join")public ResponseEntity join(@Valid UserDto reqDto) throws Exception { return ResponseEntity.ok(userService.insertUs..

    inteliij 사용 시 related gradle configuration 설정을 찾지 못할 경우 해결방법

    Inteliij로 프로젝트를 정상적으로 작업하고 있었는데 어느날 application.yml 설정을 읽지 못해서 오류가 막 발생했다. 그래서 인텔리제이 오류 내용에서 찾아보던 중 다음과 같은 오류 내용을 볼 수 있었다.Unable to make the module: related gradle configuration was not found. Please, re-import the Gradle project and try again 그래서 무엇인고 하니 gradle 설정을 찾지 못한다는 이슈인 것 같아서 gradle 설정을 새로고침 해줬다.방법은 Gradle Task 관련 view에서 새로고침 버튼만 눌러주면 된다. ## 만약 view가 보이지 않는다면 여기 메뉴에서 찾아서 설정할 수 있다.

    sequelize에서 상황에 따라 조인 테이블을 변경하는 방법 - alias

    sequelize를 사용하다 보면 하나의 필드를 어떤 상황에서는 User테이블과 조인하고 다른 상황에서는 Dept 테이블과 조인을 하고 싶을 때가 있다.예를 들면 만약 로그를 기록 한다 하였을 때 모든 행위마다 로그를 기록할 수는 없기때문에 로그 테이블에 필드에 type을 나누고 발생한 object의 index만을 기록해서 진행하고 싶을 때 그럴 수있다. 그럴경우 targetIndex의 경우 동작 타입에 따라 User테이블과 조인할 수도 있고 Dept 테이블과 조인하는 등 유동적인 조치가 필요하다. 우선 Model을 define 하는 부분을 확인해보자.12345678910111213141516const Pub = Sequelize.define('pub', { name: { type: Sequelize.S..

    sequelize에서 조인 시 left join이 되지 않을 때 처리하는 방법

    sequelize에서 조인을 할때는 include를 사용해서 다음과 같이 한다. 123456await This.User.findOne({ attributes: ['id', ['name', 'userName']], include: [ { model: this.Dept} ]});Colored by Color Scriptercs물론 기존에 Model을 define할 때 연관관계를 설정을 해놓은 상태여야 하고 이렇게 할 경우에 나는 left join이 아니라 inner join으로 다음과 같이 되었다. SELECT id, name as userName FROM User u inner join Dept d on u.userId = d.userId;그래서 검색해서 알아보다보니 required 옵션을 부여하게 되면 ..

    sequelize에서 alias 사용하여 검색하는 방법

    sequelize에서 검색을 할 때 alias를 줘서 검색하는 방법은 다음과 같다. 생각보다 간단하다. 123await This.User.findOne({ attributes: ['id', ['name', 'userName']] //id, first AS firstName});Colored by Color Scriptercs

반응형