Home
Jongin Kim
취소

코루틴에서 Transaction 사용하기

코루틴에서 Transaction 사용하기 Spring @Transactional 동작 원리 @Transactional 어노테이션은 스프링 프레임워크에서 제공하는 기능으로, 데이터베이스 트랜잭션을 관리하기 위해 사용된다. 이 어노테이션을 메서드에 적용하면, 해당 메서드가 실행될 때 스프링은 트랜잭션을 시작하고, 메서드가 예외 없이 정상적으...

데이터베이스 트랜잭션 - 2

직렬성 (=serializable) 격리수준의 문제 위에서 공부한 것 처럼 격리 수준은 너무 어렵고 복잡하다. 그리고 모든 문제를 해결해주지 못한다. 또 데이터베이스의 구현마다 그 격리 수준의 동작 방식은 조금씩 다르다. 어떤 로직에는 어떤 격리수준이 안전한지 파악하는 일이라는건 쉬운일이 아니다. ...

데이터베이스 트랜잭션 - 1

데이터베이스 트랜잭션 우리는 항상 트랜잭션 없이 코딩하는 것보다. 트랜잭션을 과용해서 병목지점이 생기는 성능 문제를 애플리케이션 프로그래머가 처리하게 하는 게 낫다고 생각한다.?! 정의 어플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법 개념적으로 하나의 트랜잭션 내 모든 읽기와 쓰기는 한 연산으로 실행된다. ...

상위 호환성, 하위 호환성 차이

하위 호환성 새로운 코드가 예전 데이터를 읽을 수 있음 상위 호환성 예전 코드가 새로운 데이터를 읽을 수 있음 DB 내 값이 새로운 버전의 코드로 기록된 다음, 현재 수행 중인 예전 버전의 코드로 그 값을 읽는 경우? ex) 새로운 버전이 { a: 1, b: 2 } 라는 데이터를 DB 저장했는데 예전 버전 ...

펑터 (Functor, 함자)

Functor 펑터 펑터 (Functor, 함자) 펑터는 매핑할 수 있는 것 이라는 행위를 선언한 타입 클래스 다른 타입을 하나 받아서 구성되는 타입 ex) fun <T, R> Iterable<T>.map(f: (T) -> R): List<R> {} Iterable ...

맵 리듀스, 데이터 병렬성 - Hadoop

병렬성이 빅데이터를 가능하게 한다. 여러개의 컴퓨팅 자원을 동시에 활용할 수 있어야만 테라바이트 수준의 데이터를 처리할 수 있다. 수백대의 컴퓨터가 구성하는 클러스터에서 데이터와 연산 자체를 분산시키면서 수행한다. 즉, 데이터 병렬성을 활용한다. ...

coroutine flow (코루틴 플로우)

일시 중단 함수는 단일 값을 비동기적으로 반환한다. 그럼 어떻게 비동기적으로 계산된 여러 값을 반환할 수 있을까? 이게 코루틴 플로우를 관통하는 질문이다. 여기서 kotlin coroutine flow 가 등장한다! 여러 값 표현 collections을 사용해 코틀린에서 여러 값을 나타낼 수 있다. ...

리액티브 어플리케이션 테스트 하기

리액티브 스트림을 테스트하기 어려운 이유 테스트 피라미드 제안을 따라야 모든 것을 제대로 검증할 수 있다. 테스트 피라미드? Google Test Automation Conference 에서 제안된 테스트 피라미드 전체 테스트 비중을 ...

Local에 docker로 카프카 띄우기 - 카프카 연습용

Kafka 환경을 구축하기 위해 Kafka 서버를 Docker를 이용해 띄어보자 사실 상 Kafka를 다운로드 받아 그냥 로컬에 바로 띄우는게 가장 간단한 방법이겠지만, Docker를 한번 사용해봐야겠다 라는 마음으로 Docker에 설치하도록 했다. 개발 환경등 신경쓸 필요도 없고, 로컬 환경을 깔끔하게 유지한다는 장점이 있을 수 있겠다. 아래 ...

코틀린 - 변성

변성 변성이란? List<String>, List<Any>와 같이 기저 타입이 같고 타입 인자가 다른 여러 타입이 서로 어떤 관계가 있는지 설명하는 개념 변성? 이런 관계가 왜 중요하지? 코틀린에서 제네릭 클래스나 함수를 정의하는 경우 타입 안정성...

coroutine 에서 원자성 위반 문제를 해결하는 방법

시작하기 앞서 코틀린 채널에 대해서 다시 한번 떠올려 보자 채널이란 : 2개의 코루틴 사이를 연결한 파이프라인 정도라고 보면 된다. 스레드간 커뮤니케이션 코루틴 말고도 우리는 보통 코딩을 할 때 리소스를 블로킹 하는 작업 (네트워킹, DB사용) 들은 스레드로 떼어낸다. 이 스레드간 공유할 자원이 필요할때 우리...

gRPC 서버에서 ThreadLocal을 올바르게 사용하는 방법 (gRPC Context, gRPC + JPA AuditorAware)

Spring Web + JPA 에서 AuditorAware 구현 grpc 서버라고 가정하지 않고 Spring Web 기반의 API 서버라고 생각해보면 우리는 JPA AuditorAware를 보통 아래와 같이 구현할 것이다. (SpringSecurity를 사용했을 때를 가정하고 작성한 코드다.) @Component public class...

타입스크립트 Enum에 정적 메소드 추가하기?

결론부터 말하면 타입스크립트 문법상 Enum은 정적 메소드를 추가할 수 없습니다 ps. 여담이지만 타입스크립트에서 Enum을 사용을 추천하지 않는 개발자들도 꽤 있습니다… 사람마다 다릅니다. 참고 : https://engineering.linecorp.com/ko/blog/typescript-enum-tree-sha...

fluentd로 용도에 맞게 어플리케이션 로그 수집하기

실제 서비스 되어지고 있는 어플리케이션을 운영하다보면 여러가지 유형의 로그가 발생한다. 예를 들면 어플리케이션 에러로그 어플리케이션 접속로드 ( access log ) 결제 로그 클라이언트의 개인정보가 포함된 로그 등등.. 이렇게 많은 종류의 로그들이 발생하는 만큼.. 모두 한 곳에서 관리하고 한 곳에서 모니터링 하면 좋겠지...

ECR 로컬에서 pull push 하기

aws ecr get-login aws ecr get-login --region ap-northeast-2 login 위 커맨드로 나온 결과 그대로 복사 후 실행 ( -e none 부분 제거 ) docker login -u AWS -p ??????????? https://xxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws...

서블릿 (servlet)

서블릿 (servlet) 웹프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그래밍 기술 간단히 말해서, 서블릿이란 자바를 사용하여 웹을 만들기 위해 필요한 기술 클라이언트가 어떠한 요청을 하면...

Dockerfile 모범 사례 소개

빌드시간 캐싱을 위한 순서문제 가장 적게 변경되는 부분 부터 → 가장 자주 변경되는 단계의 순서대로 배치 필요한 것만 복사하기 관련있는 파일만 캐시가 되도록 복사할 대상이 특정되어야 한다. 위 사진에서 우리가 필요한 파일은 jar파을 하나인데 빨간색 copy . /app 코드처럼 모든 파일을 복사하는 경우 현재 위치에 있는 파일...

AWS EC2 Role(역할) 매핑하기

리소스란 적절한 크기의 노트 수와 용량을 가진 쿠베 클러스터가 있다고 하면 어떻게 비용 효율성을 높일 수 있을까? 워크로드에 사용 가능한 클러스터 리소스를 최대한 활용하는 동시에 트래픽 폭증, 노드 장애, 잘못된 배포 상황에 대처할 수 있는 충분한 여유공간을 확보하는 방법까지 알아야 한다. 특정 파드가 너무 많은 리소스를 점유하여 같은 ...

Kubernetes resource (리소스)

Role(역할)로 전환하는 이유 EC2 에서 실행되는 응용 프로그램이 자동 생성, 배포 되는 임시 보안 자격 증명을 사용할 수 있다. 임시자격 증명을 사용한다는 것은 인스턴스에서 직접 키 관리를 하지 않아도 된다는 뜻 즉, EC2 IAM Role(역할)기능을 적용해 장기적인 AWS 엑세스키(Access Key)를 수동 혹은 프로그램에서 ...