이벤트 소싱 이벤트 소싱(Event Sourcing)은 도메인의 상태를 변경하는 모든 사건을 이벤트 스트림으로 저장하는 방식이다. 계좌 잔액 관리를 예로 들어보자. 전통적인 방식이라면 거래 내역을 따로 저장하고 해당 거래로 인해 발생한 잔액을 별도의…
가 을 열 때 이 선언되어야 한다. 전체 이벤트 스트림 안에서 특정 이벤트의 위치를 특정하거나 특정한 위치에서 이벤트 스트림을 열기 위해 사용된다. 추후 스트림을 다시 열 때 마지막 이벤트를 고를 수 있다. 따라서 예상치 못한 셧다운에 마지막…
In-memory service나 mock 없이 통합 테스트 환경에서 Docker 이미지 기반으로 DB, 메시지 브로커, 검색엔진 등의 테스트 인프라를 간단하게 구성할 수 있다. 특히 클라우드 환경의 MSA에서 유용하다. JUnit을 이용한…
는 송신자와 수신자끼리 메시지를 주고 받기 위해 사용되는 메시지 브로커이다. 아래의 6개 예제를 를 사용하여 구현하고 마지막 예제는 코틀린으로 구현할 것이다. 예 제는 RabbitMQ 공식 튜토리얼을 참고하였다. 1. "Hello World" 가장…
시스템끼리 통신할 때(특히 web 기반) 포맷을 사용한다. 이 때 발신하는 측에서 직렬화가 발생하고 수신하는 측에서는 역직렬화가 필요하다. 데이터를 수신하는 측에서 JSON을 다시 객체로 사용하기 위해 하게 되는데 이 때 유효하지 않은 문자가 포함된…
이런 유틸을 만들어놓고 이렇게 사용하면 코드를 위에서부터 아래로 차례로 읽을 수 있어 가독성이 올라간다.
1. Kotlin의 data class는 JPA에서 사용하지 않는다 영속성 계층의 가 되려면 아래를 포함한 조건이 갖춰져야 한다. non-final 최상위 클래스이거나 정적 이너클래스일 것 public 또는 protected, no-args…
개요 는 의존관계 주입(Dependency Injection)의 줄임말으로 객체지향 디자인패턴 중 하나이다. 객체지향 프로그램 내 객체들은 다양한 생명주기를 가지며 서로 상호작용하고 다양한 형태의 의존관계를 갖게 된다. Dependency? 의존…
다중조건으로 정렬해야 할 때 안에 또는 를 파라미터로 넘겨준다. 또는 도 있다. 아래는 코드 예시
운영중인 DB에 Foreign Key를 떼고 운영하는 것은 굉장히 흔한 사례다. 반면 이게 올바른 프랙티스인지는 늘 논란의 여지가 있다. 여러가지 전략을 가져갈 수 있겠지만 Foreign key를 달고 운영한다면 분명히 Foreign Key가 적용된…
의문의 서막: PermGen Space 레거시 시스템에서 java7 또는 이전 버젼을 쓸때 늘 보던 에러다. 위와 같은 를 넣어 메모리를 늘려주면 해결됐는데 이걸 깜빡할 때마다 OOME가 발생하곤 했다. JVM 내 메모리가 부족하다는 정도로만…
리플렉션이란? 런타임에 동적으로 클래스의 인스턴스를 생성 및 조작할 수 있는 기술이다. 리플렉션을 사용하면 클래스에 대한 정보를 미리 알지 못해도 객체를 조작할 수 있다. 주로 프로그램 내 특정 클래스나 함수에 대해 알지 못하는 라이브러리나…
에서 음수가 될 수 있는 칼럼를 쿼리로 피벗할 때 의도된 NULL을 사용한다. 오라클의 경우 11g 이상부터 내장된 PIVOT() 함수를 제공한다. 예를 들어 아래와 같은 테이블 A에서 조회한다고 하자. 위의 형태를 아래와 같이 피벗하는 경우 개…
고차함수는 비싸다. 객체로 변환한 함수(Function)를 쓰기 때문이다. inline function을 쓰면 객체변환 대신 컴파일 시 코드라인을 추가해준다. 코틀린의 리플렉션을 쓸 수 있다. 코틀린 클래스를 가져오려면 Kclass를 쓴다.
Could not open init generic class cache for initialization script '{USERPROFILE}\AppData\Local\Temp\wrapper_init.gradle' ({USERPROFILE…
어플리케이션 설정파일 등의 리소스 위치를 참조할 때 "../aaa.xml"와 같은 상대경로는 사용하지 않는 것이 좋음. classpath는 현재 디렉토리에서 가장 가까운 곳부터 탐색하는데 만약 classpath 정보가 변경된다면 의도와 전혀 다른…
개발 업계에서 바퀴를 다시 만들지 말라는 말을 흔히 들을 수 있다. 이는 보편적으로 오버엔지니어링을 하지말라는 의미로 볼 수 있지만 공부를 하는 측면에선 바퀴를 재발명해볼 가치가 있다. 평소 별 생각 없이 쓰던 것들을 분해하고 다시 구현해봄으로 CS…
RestTemplate의 코드를 보던 중 아래와 같은 문법을 발견했다. 코틀린의 companion object와 비슷하게 동작할 것처럼 보여서 찾아봤다. 그러나 실제 작동방식은 다르다고 한다. kotlin의 companion object는 말그대로…
코틀린에서 이진수 변환을 하는 법 진수를 인자로 넘겨주면 쉽게 변환이 가능하다. 이진변환 반복하기를 풀면서 역시 반복된 연산 시 탈출조건을 찾는게 핵심이라는 걸 배웠다.
README에 대략적인 프로젝트의 Feature를 적고 시작했다. kotlin의 TODO()를 이용하여 인터페이스와 테스트를 먼저 만들었음. 테스트를 통과할 수 있게 구현했음. 새로운 테스트 케이스가 생각나서 적었음. 테스트 케이스에 맞춰 기존 구현…
aws 탄력적 ip 설정 인스턴스를 껐다 켰다 할 때마다 ip가 바뀌어서 너무 불편했다. 고정 ip를 생성해봤다. 너무너무 간단하다. 인스턴스 > 네트워크 및 보안 > 탄력적 ip에서 생성 Docker 사용해보기 사용중인 OS는 윈도우지만…
Github actions Github과 연동되는 CI/CD 플랫폼. workflow라는 것을 기반으로 빌드, 테스트, 배포 자동화 파이프라인을 구축할 수 있다. Workflow git 저장소에 event가 일어나면 실행되는 하나 이상의 Job으로…
서버 인스턴스 이미지 - 아마존 리눅스 key 파일 - .pem으로 생성 인스턴스 유형 - t2 micro (이유: 프리티어이고 제일 쌈) 이렇게 대부분 설정은 디폴트로 생성. 인스턴스 생성이 잘 되었다. 다음은 키, ip, user 등의…
3일차에 공부하다보니 다음과 같은 고민을 하게됐다. JPA에서 @Transactional을 무조건 붙여야할까? Kotlin에서 JpaRepository를 쓸 때 Optional을 안쓰는 법이 있을까? 그리고 생각보다 시간을 많이 잡아먹었던 문제가…
Github Action - CI 깃허브에서 제공하는 CI/CD 툴이다. 공식홈페이지에 아주 자세한 설명이 나와있다. 사용방법은 매우 쉽다. 하 고 싶은 작업과 조건들을 스크립트에 작성만 해주면 된다. 스크립트 템플릿도 바로 깃헙에서 만들 수 있다…
kotlin data class로 entity구현하기 Kotlin의 data class는 일단 equals(), copy(), toString() 등 기본적인 메서드들을 만들어줘서 너무 편하다. 기본적으로 immutable인 점도 좋다. 하지만…
년월일의 날짜정보를 저장할 때 을 이용하여 표현하는 것을 종종 볼 수 있는데요. MySQL의 타입을 이용하면 더욱 효율적으로 정보를 저장하고 조회할 수 있어 이에 대해 공유 드리고자 합니다. 타입은 'YYYY-MM-DD' 형식의 날짜 타입입니다…
개요 스프링부트는 어플리케이션 코드의 변경을 최소화하기 위하여 설정파일, CLI Argument 등 다양한 방법으로 외부 설정을 주입받습니다. 그리고 이러한 외부 설정은 운영, 테스트, 개발 등 실행환경에 따라 달라지게 됩니다. 이를 위해 프로필 별…
1. 문제 인식 위와 같은 시스템 메일 전송 시 클라이언트의 입력을 받지 않고 서버에서 발송하게 됩니다. 직접 구현할 수도 있고 메일침프나 스티비 등 메일 전송 서비스를 이용하기도 합니다. 저희 회사에서 서비스 중인 프로그램들은 이 기능을 직접…
서블릿 컨테이너와 관련된 복잡한 작업(설치, 관리, 배포)을 요구하지 않고 빈에만 집중할 수 있도록 서블릿 컨테이너를 직접 설치하지 않고 알아서 띄워주는 stand alone 프로그램을 만듦. 어떻게? 자바 코드로 구현해서. 서블릿 컨테이너는 자바…