728x90

Backend 150

docker-compose 로 로컬 카프카 띄우기

검색하면 예제가 많지만 난 안되서 한참을 헤맸다. 최종적으로 성공한 docker-compose.yaml 은 아래와 같다. version: '2' services: zookeeper: image: wurstmeister/zookeeper:3.4.6 container_name: local-zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka:2.13-2.8.1 container_name: local-kafka ports: - "9092:9092" depends_on: - zookeeper environment: KAFKA_ZOOKEEPER_CONNECT: local-zookeeper:2181 KAFKA_ADVERTISED_HOST_NAME: loc..

[Kotlin] 확장함수 언제 어떻게 사용해야 할까?

코틀린에는 확장함수 라는 기능이 있다. 자바에서는 메소드를 사용할 때 파라미터는 반드시 메소드의 인자로 포함되어야 한다. 즉, 호출 단계에서 메소드가 우선 작성되고 재료가 되는 파라미터가 그곳에 포함되는 방식이다. 예를 들면 아래와 같다. public String format(LocalDate localDate, String pattern){ return localDate.format(DateTimeFormatter.ofPattern(format)); } String dateStr = format(LocalDate.now(), "yyyy-MM-dd") 코틀린에서도 위와 같은 방식으로 구현해도 되지만 아래와 같이 확장함수 방식으로 구현할 수도 있다. fun LocalDate.format(pattern: S..

Backend/Kotlin 2021.12.24

코틀린 with, apply, also, let, run

일단 모두 지정된 객체의 유효범위를 람다식 내부로 제한하는 기능을 한다. 즉 어떠한 객체를 특정 변수에 할당해서 활용한다고 생각하면 되는데 그 영역을 블록으로 제한한다고 생각하면 된다. 각각의 의미만 나열하면 오히려 어떤걸 활용해야 할 지 감이 안 올 수 있기 때문에 연관지어서 정리하도록 하겠다. 제일먼저 with 는 가장 단순하다. 지정된 객체를 람다식 안에서 this 로 참조할 수 있고 객체를 수정할 수도 있으며 원하는 값을 리턴하거나 리턴하지 않을 수도 있다. var map = mutableMapOf("A" to "aaa") var map2 = with(map) { this["A"] = "bbb" this } var map3 = with(map) { this["A"] = "ccc" } println..

Backend/Kotlin 2021.12.23

[Kotlin] interface default method

코틀린에서는 interface의 default method 를 지원하지 않는다. interface 에 구현부를 포함한 메소들 포함해서 사용할 순 있지만 java의 default method 와는 다르다. 자바 코드로 변환된 내용을 보면 알겠지만 내부클래스를 정의하고 그 안에 static 메소드로 만들어진다. 이로 인해 코틀린 환경에서 JpaRepository 를 상속한 interface 에 구현부를 포함한 메소드를 포함할 경우 컴파일 단계에서 아래와 같은 에러를 마주하게 된다. No property betweenOsVer found for type ${EntityName} spring-data-jpa 에서는 "쿼리 메소드" 라는 기능이 있는데 JpaRepository 를 상속한 interface 해당하는..

Backend/Kotlin 2021.12.22

[JPA] 연관관계 매핑

Entity 연관관계를 매핑할 때 특별한 경우가 아니라면 단방향으로 설계가 권장된다는 말을 많이한다. 그런데 DB 테이블 설계시에는 조인을 고려하고 설계하다보니 기본적으로 양방향이 가능한 구조인데 객체만 단방향으로 설계하기란 쉽지 않다. 예를 들어 게시판을 만든다고 할 때 DB테이블은 게시글을 의미하는 Contents 테이블과 댓글을 의미하는 Reply 테이블을 생성할 것이고 외래키는 N에 해당하는 Reply 에 둘 것이다.(실무에서는 외래키 역할을 하는 칼럼을 추가하긴 하지만 제약조건까지 걸어서 사용하는 경우는 드물다) DB 입장에서 보면 join 을 통해 Contents 를 조회할 때 Reply 정보를 함께 가져올수 있고 Reply 조회시 Contents 정보를 함께 가져올 수도 있다. 어느쪽에서 출..

Backend/JPA 2021.12.17

[JPA] 대량 insert, mysql insert all

jpa 를 사용해서 대량 insert 를 해야할 일이 생겼다. 사실 딱히 대량까진 아니고 많아봐야 1,000건이란 제한이 있는 데이터였다. 그런데 이게 10초가 넘게 걸렸다. jpa에서 대량 insert 시 사용하라고 하는 saveAll 을 사용하는데도 그랬다. mybatis 환경이라면 쿼리로 insert all 를 작성해서 사용했을 것이고 이 경우 insert 하는 데이터가 1만건이 넘어가더라도 10초가 걸리진 않는다. JPA에서 saveAll 로 배치 insert 하려면 application.yml 파일에 아래 설정이 추가로 필요하다. spring.jpa.properties.hibernate.jdbc.batch_size=1000 spring.jpa.properties.hibernate.order_in..

Backend/JPA 2021.12.16

readOnly 구분에 따른 커넥션 선택

jdbc:mysql:replication 스키마도 그렇고 아래에서 설명한 다중DB 커넥션 설정도 그렇고 현재 트랜잭션의 readOnly 값에 따라 master, slave DB가 선택된다. https://findmypiece.tistory.com/255?category=968583 write 작업을 하는 커넥션의 경우 readOnly 값을 기본값인 false 로 지정해서 사용할텐데 대부분 트랜잭션에는 단순히 CUD 쿼리 뿐만 아니라 Read 쿼리도 포함되어 있다. 그렇다면 트래픽을 완전하게 분리하기 위해서 readOnly=false 로 지정된 트랜잭션의 쿼리 중 Read 쿼리는 readOnly=true 로 지정해서 slave DB에서 수행되게 해야 할까? Spring에서 제공하는 트랜잭션 전파 규칙을 이..

Backend/Spring+Boot 2021.12.15

Spring Transaction 전파규칙

Spring에서는 Transaction이 걸려있는 메소드에서 Transaction 걸려있는 또 다른 메소드를 호출할 때 Transaction이 어떻게 전파될 것인지 결정할 수 있다. 다만 이것은 같은 클래스의 메소드끼리는 해당이 없다. 같은 클래스 내의 메소드 호출시에는 Transaction이 걸려있더라도 그냥 최초 호출한 시점에 시작된 Transaction만으로 진행된다. ​ @Transactional 기본속성이다. 기존에 생성된 Transaction이 있으면 참여하고 없다면 새로운 Transaction을 생성한다. 이는 결국 @Transactional(propagation = Propagation.REQUIRED) 를 의미한다. ​ @Transactional(propagation = Propagati..

Backend/Spring+Boot 2021.12.15

HikariCP 커넥션 풀

Spring Boot 2.0을 기점으로 Default DBCP가 Tomcat DBCP -> HikariCP로 바뀌었다. 이는 우리가 흔히 알고 있는 DB커넥션 풀인데 둘이 다른 점이 있어 정리 해놓는다. 일단 Tomcat DBCP 와 달리 HikariCP 는 유휴 커넥션을 유지시키지 않는다. Tomcat DBCP 에서는 test-while-idle 옵션을 통해 유휴커넥션의 세션이 종료되지 않도록 주기적으로 validationQuery 를 날리는 방식을 사용했는데 HikariCP 에서는 maxLifetime이 지나면 해당 커넥션을 폐기하고 다시 생성하는 방식을 사용한다. 이러한 로직은 HikariCP 라이브러리의 HikariPool 내부 클래스인 KeepaliveTask 에서 아래와 같이 확인된다. sof..

Backend/Spring+Boot 2021.12.14
728x90