728x90

Backend 150

[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

[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..

@PathVariable vs @RequestParam

Spring 환경에서 RestApi 를 정의할 때 항상 고민을 하게 되는 것이 자원을 식별하는 값을 동적으로 정의할 경우 @PathVariable, @RequestParam 중 어떤 것을 사용할 것이냐 이다. 예를 들어 특정 그룹의 카운트를 리턴하는 api 를 만든다고 할 때 아래 두가지 방법을 사용할 수 있다. @GetMapping("/target/admin/{groupSeq}/count") fun adminTargetCount(@PathVariable groupSeq: Long): ResponseEntity{ return ResponseEntity(pushService.adminTargetCount(groupSeq), HttpStatus.OK) } @GetMapping("/target/admin/co..

Backend/Spring+Boot 2022.03.07

[Kotlin] RequestBody 유효성 검증로직 추가하기

RequestBody에 할당되는 값에 대한 유효성 검증 방법에는 여러가지가 있을 것이다. Spring 환경이라면 대표적으로 @Valid 또는 @Validated 을 사용할텐데 여기에서는 직접 유효성 검증 로직을 추가하는 방법을 알아본다. 사실 이 방법은 Kotlin 에서만 국한된 것은 아니기 때문에 개념만 이해한다면 어디서든 사용할 수 있다. 우선 여기에서 @Valid와 @Validated 의 차이는 구체적으로 다룰 필요는 없겠지만 간단하게 말하면 그냥 @Validated 이 상위호환 이라고 보면 되고 아래부터 @Validated 로만 표현하겠다. @Validated 는 왜 사용하지 않았나? 단일 값의 유효성만 검증하는게 아니라 2개 이상 값의 조합도 검증하고 싶었다. 예를 들어 주민등록번호를 검증을 한..

Backend/Kotlin 2022.03.07

[SpringBatch] 주의사항

트랜잭션 Reader, Processor, Writer 구조 기준 PageSize 와 ChunkSize 를 설정할 수 있을 것이다. 이 의미를 정확하게 알고 사용할 필요가 있다. PageSize의 경우 여러 Reader 구현체에서 실제로 한번에 읽어올 row 단위를 의미한다. 이렇게 읽어온 row 를 Reader와 Processor 에서는 무조건 1 row씩 읽어서 처리한다. Writer 에서는 ChunkSize 가 사용되는데 ChunkSize 만큼 메모리에 row 결과가 쌓이면 그걸 한번에 처리한다. 여기에서 한번에 처리한다는 것은 트랜잭션 단위를 의미한다. 즉, DB트랜잭션 Start, End 상태에 해당하는 것이다. 이런 이유로 ChunkSize 중에서 특정 row를 별도로 CUD 작업 하고 싶다면..

Backend/Spring+Boot 2022.02.28
728x90