728x90

분류 전체보기 288

ResponseTimeout, ReadTimeout, WriteTimeout

네트워크 통신을 담당할 클라이언트를 구성하다보면 위와 같은 타임아웃 설정을 필수로 하게 된다. 대충 알겠으나 항상 헷갈려서그 의미를 명확하게 정리해 놓는다. 일반적으로 통신은 그 요청이 Read 인지 Write 인지에 따라 아래와 같이 수행된다. ReadRequest 1. 클리이언트에서 서버로 읽기 요청을 전송 2. 서버에서 요청을 받아 클라이언트로 응답값 전송의 시작을 알림 3. 서버에서 응답 데이터 전송 시작 4. 서버에서 응답 데이터 전송 종료 WriteReeust 1. 클리이언트에서 서버로 쓰기 요청을 전송 2. 서버에서 요청을 받아 클라이언트로 데이터를 보내라고 알림 3. 클라이언트에서 쓰기 데이터 전송 시작 4. 클라이언트에서 쓰기 데이터 전송 종료 ResponseTimeout은 위에서 공통으..

Base/개념정리 2022.04.19

[Kotlin] thread-safe Collection

Coroutine를 병렬로 활용하다보면 thread-safe 한 Collection 이 필요해진다. 그런데 Kotlin 자체에서는 thread-safe 한 Collection 을 제공하지 않는다. 아래 함수는 모두 thread-safe 하지 않다. mutableMapOf() mutableListOf() mutableSetOf() 만약 thread-safe 한 Collection 을 사용하고 싶다면 Java의 Collections 에서 제공하는 wrapper 메소드를 활용하면 된다. Collections.synchronizedMap(mutableMapOf()) Collections.synchronizedList(mutableListOf()) Collections.synchronizedSet(mutableS..

Backend/Kotlin 2022.04.14

[Kotlin] 코틀린에서 Mapstruct 사용하기

Mapstruct 를 사용할 경우 객체간 매핑을 자동으로 해주기 때문에 JPA 를 사용하는 환경처럼 DTO, Entity 간 변환이 잦은 경우 유용하게 사용될 수 있다. 하지만 코틀린 환경에서는 몇가지 제약사항이 있다. 자바 환경에서는 아래와 같이 사용할 수 있었다. @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface PushReqInfoMapper { @Mapping(target = "eventId", source = "makeIdReqInfo.eventType") @Mapping(target = "pushOtherInfo", expression = "java(toPushOthe..

Backend/Kotlin 2022.04.05

[SpringBatch] SpringBatch 이력테이블 초기화 스크립트

1개월 이전 이력 삭제. 자세한 설명은 생략한다. DELIMITER $$ DELETE FROM BATCH_STEP_EXECUTION_CONTEXT WHERE STEP_EXECUTION_ID IN ( SELECT STEP_EXECUTION_ID FROM BATCH_STEP_EXECUTION where JOB_EXECUTION_ID in( select JOB_EXECUTION_ID from BATCH_JOB_EXECUTION where CREATE_TIME < DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH) ) ); DELETE FROM BATCH_STEP_EXECUTION where JOB_EXECUTION_ID in( select JOB_EXECUTION_ID from BAT..

Backend/Spring+Boot 2022.03.29

webclient retry

https://www.amitph.com/spring-webflux-retry/ 다 좋은데 서킷브래이커는 어떻게 적용하는걸까? 만약 retry 만 지원한다면..타겟 서버가 아예 다운된 상태라도 모든 요청이 재시도 처리될텐데.. 음... 그런데 서킷브래이커를 무조건 적용해야 할까? 푸시 발송을 예로 들어 생각해보자. 통신을 하는 api 에 장애가 발생했다. 계속 콜을 하며 장애가 빨리 풀리기를 기다려야 할까. 아니면 10분정도 아예 요청을 보내지 말아야 할까? 전자의 경우 모든 요청에 대해 지정된 횟수만큼 재시도를 하기 때문에 어차피 푸시 발송은 안되는데 서버가 바쁘게 움직일 것이다. 그 대신 타겟 api의 장애가 풀리는 즉시 푸시 재개가 가능하다. 후자의 경우 지정된 시간 동안 푸시 서버는 타겟 api를..

카테고리 없음 2022.03.25

Kotlin 에서 WebClient 사용하기

함수 내부에 코루틴에서 사용되는 중단점을 사용하려면 suspend 키워드를 붙여줘야 한다. 이렇게 만들어진 함수는 코루틴 컨텍스트 내에서만 사용할 수 있다. suspend 함수는 async{}, launch{} 과는 다르다. suspend 는 코루틴 컨텍스트 내에서 블로킹으로 호출되지만 async{}, launch{} 는 논블로킹으로 호출된다. 그런데 난 런타임시 자꾸 kotlinx.coroutines.reactive.AwaitKt 를 찾을 수 없다는 에러가 뜬다...처음에 됐던거 같은데 착각이었나.. 그 뒤로 계속안된다. org.jetbrains.kotlinx:kotlinx-coroutines-core 의존성은 분명추가가 되어있는데 말이다... 서칭해도 사례를 찾을 수 없어 일단 stream 으로 받아..

카테고리 없음 2022.03.22

[JPA] Entity 에 스키마 지정하기

Spring 환경에서 Database 커넥션을 설정할 때 jdbc url을 지정하게 되고 아래와 같이 기본적으로 스키마를 포함한 풀 url을 지정하게 된다. jdbc:mysql://localhost:3306/TEST 그런데 데이터베이스 안에는 업무상 여러개의 스키마를 만들어서 사용하는 경우가 있고 위와 같이 TEST 스키마로 DB 에 접속했지만 TEST2에 있는 테이블을 Entity 로 추가해서 참조하고 싶은 경우가 있을 수 있다. Mybatis 환경이라면 그냥 쿼리 사용시 테이블 앞에 TEST2. 를 추가해서 사용하면 되지만 jpa 환경에서는 어떻게 할까? 일단 Entity 클래스에 정의하는 @Table 어노테이션을 보면 schema 속성이 있는데 이게 아니고 catalog 속성에 스키마를 정의하면 된..

Backend/JPA 2022.03.15

[Mysql] InnoDB lock, Dead lock

Mysql 엔진 중 가장 범용적으로 사용되는 InnoDB 에서 활용되는 lock 에 대해 알아보자. lock(잠금)는 왜 필요한 이유는 데이터의 정합성 유지와 프로세스의 동시성을 처리하기 위해 반드시 필요하다. 예를 들어 여러 트랜잭션에서 특정 테이블에 insert를 시도 한다고 할 때 primary key 또는 unique key는 중복으로 등록되면 안 될 것이다.이를 위해 어찌되었건 처리는 한번에 하나씩 진행되어야 하고 이 과정에서 먼저 들어온 요청을 처리하는 동안 다음 요청의 접근은 제한하는 lock의 개념이 필요해 진다. 그 외에도 많이 사용되는 예로는 은행 입출금 프로세스가 있겠다. 이는 UPDATE 와 관련된 것인데 금액을 출금하는 프로세스를 UPDATE 로 구현했다고 가정해보자. 여러 트랜잭..

Backend/Database 2022.03.10

ingress apiVersion networking.k8s.io/v1

kubectl get ing 로 ingress 자원을 확인하면 아래와 같은 경고메시지가 뜨는 경우가 있다. Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress 대충 해석해보며 ingress 에 apiVersion 중 extensions/v1beta1 는 1.14 버전에 deprecated 되었고 1.22 버전부터는 사용할 수 없으니 networking.k8s.io/v1 로 변경하라는 것 같다. 수정하는 것은 어렵지 않으니 수정하고 적용을 했는데 아래와 같은 오류가 났다. error validating data: [ValidationError(Ingr..

728x90