728x90

Backend/Spring+Boot 64

@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

[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

SpringBoot 환경에서 JAVA_OPTS, TOMCAT_OPTS

외부 Tomcat 을 사용할 경우 구동시 추가할 실행옵션이 필요할 경우 JAVA_OPTS 또는 TOMCAT_OPTS 환경변수에 추가해 놓으면 실행시 자동으로 참조한다. 예를 들어 startup.sh 로 구동시 -Xmx256m 같은 메모리 설정을 추가하고 싶다면 환경변수 JAVA_OPTS 를 추가해서 -Xmx256m 를 등록해놓으면 된다. 기본적으로 구동시 JAVA_OPTS, TOMCAT_OPTS 를 모두 참조하기 때문에 하나만 정의해도 되지만 공식메뉴얼에서는 Java 관련된 설정값은 JAVA_OPTS 에 Tomcat 관련된 설정값은 TOMCAT_OPTS 에 설정하길 권장한다. 그런데 SpringBoot 내장톰캣에는 이게 적용되지 않는다. 기본적으로 아래와 같이 어플리케이션 구동시 command line ..

Backend/Spring+Boot 2022.02.22

QuerydslNoOffsetPagingItemReader fetchJoin

SpringBatch chunk 단위 처리 구현시 querydsl 을 사용하려고 했다. 그런데 SpringBatch 에서 querydsl 을 지원하지 않아 관련 Reader 구현체가 제공되지 않아 오픈소스로 제공되는 QuerydslNoOffsetPagingItemReader 를 사용했다. 그런데 reader 쿼리의 fetchJoin 이 동작하지 않는다. 내가 구현한 reader는 대략 아래와 같다. // 1. No Offset Option val options: QuerydslNoOffsetNumberOptions = QuerydslNoOffsetNumberOptions(test.seq, Expression.ASC) // 2. Querydsl Reader return QuerydslNoOffsetPagi..

Backend/Spring+Boot 2022.01.06

[Spring Batch] Job flow

Step 의 상태에 따라 대략 아래와 같이 처리를 분기할 수 있다. @Bean fun mainJob(): Job { return jobBuilderFactory["simpleJob"] .start(mainStep()) //mainStep 시작 .on("FAILED") //FAILED 일 경우 .to(errorStep()) //errorStep 으로 이동 .on("*") // errorStep의 결과 관계 없이 .end() // Flow 종료 .from(mainStep()) //mainStep의 결과가 .on("*") // FAILED 이외의 모든 경우 .end() // Flow 종료 .end() //Job 종료 .build() } 위 Step 이 실패했을 경우 적절한 에러처리를 위해 에러 Step 으로 ..

Backend/Spring+Boot 2022.01.04

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

[SpringBoot] JPA+Kotlin 다중 DB 설정

일반적으로 DB서버 master를 하나두고 slave는 여러개를 두고 사용한다. master는 쓰기 작업만 처리하고 slave는 master 에 등록된 데이터가 동기화 되어 읽기 작업만 수행하도록 한다. 가장 간단한 방법은 서버 url 설정시 아래와 같이 jdbc:mysql:replication 스키마를 이용하는 것이다. jdbc:mysql:replication://master,slave1,slave2,slave3/test 이 경우 readOnly=false 일 경우 master로 연결되고 readOnly=true 일 경우 slave1, slave2, slave3 중 랜덤으로 선택되어 연결된다. 하지만 jdbc:mysql:replication 스키마를 사용할 경우 master 서버 커넥션에 문제가 발생할..

Backend/Spring+Boot 2021.12.09
728x90