Spring
Spring에 관한 내용을 공유합니다.
-
Chunk 여러 개의 아이템을 묶은 하나의 덩어리를 의미합니다. 한 번에 하나씩 아이템을 입력받아 Chunk 단위의 덩어리로 만든 후 Chunk 단위로 트랜잭션을 처리합니다. Chunk 단위로 Commit과 Rollback Chunk Chunk, Chunk Chunk ItemReader로 읽은 하나의 아이템을 Chunk 크기만큼 반복해서 저장하는 타입 Chunk ItemReader로부터 전달받은 Chunk 를 참조해서 ItemProcessor에서 적절하게 가공한 뒤 ItemWriter로 전달되는 타입 여기서 O는 Processor가 없다면 ItemReader로부터 전달받는 타입, Processor가 있다면 Processor로부터 전달받는 타입입니다. 아키텍처 ItemReader가 Source를 한 건씩 ..
Spring Batch - 청크 기반 프로세스Chunk 여러 개의 아이템을 묶은 하나의 덩어리를 의미합니다. 한 번에 하나씩 아이템을 입력받아 Chunk 단위의 덩어리로 만든 후 Chunk 단위로 트랜잭션을 처리합니다. Chunk 단위로 Commit과 Rollback Chunk Chunk, Chunk Chunk ItemReader로 읽은 하나의 아이템을 Chunk 크기만큼 반복해서 저장하는 타입 Chunk ItemReader로부터 전달받은 Chunk 를 참조해서 ItemProcessor에서 적절하게 가공한 뒤 ItemWriter로 전달되는 타입 여기서 O는 Processor가 없다면 ItemReader로부터 전달받는 타입, Processor가 있다면 Processor로부터 전달받는 타입입니다. 아키텍처 ItemReader가 Source를 한 건씩 ..
2024.01.25 -
배치 애플리케이션이란? 배치(Batch)는 일괄처리란 뜻을 갖고 있습니다. 쇼핑몰에서 매일 전날의 매출 데이터를 집계해야 한다고 가정해 보겠습니다. 매출 데이터가 대용량이라면 하루 매출 데이터를 읽고, 가공하고, 저장한다면 해당 서버는 순식간에 CPU, I/O 등의 자원을 다 써버려서 다른 작업을 할 수 없게 됩니다. 집계 기능은 하루에 1번만 수행된다면 이를 위해 API를 구성하는 것은 낭비가 될 수 있고, 데이터 처리 중에 실패했다면 처음부터가 아니라 실패시점부터 다시 처리하고 싶을 수 있습니다. 이런 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 배치 애플리케이션 이라고 합니다. 배치 애플리케이션은 다음 조건을 만족해야 합니다. 대용량 데이터 - 배치 애플리케이션은 대량의 데이터를 가져오거나,..
Spring Batch - DB 스키마와 도메인배치 애플리케이션이란? 배치(Batch)는 일괄처리란 뜻을 갖고 있습니다. 쇼핑몰에서 매일 전날의 매출 데이터를 집계해야 한다고 가정해 보겠습니다. 매출 데이터가 대용량이라면 하루 매출 데이터를 읽고, 가공하고, 저장한다면 해당 서버는 순식간에 CPU, I/O 등의 자원을 다 써버려서 다른 작업을 할 수 없게 됩니다. 집계 기능은 하루에 1번만 수행된다면 이를 위해 API를 구성하는 것은 낭비가 될 수 있고, 데이터 처리 중에 실패했다면 처음부터가 아니라 실패시점부터 다시 처리하고 싶을 수 있습니다. 이런 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 배치 애플리케이션 이라고 합니다. 배치 애플리케이션은 다음 조건을 만족해야 합니다. 대용량 데이터 - 배치 애플리케이션은 대량의 데이터를 가져오거나,..
2024.01.24 -
datasource spring boot 2.x.x 기준에서 사용 가능한 connection pool은 3가지가 있습니다. hikariCP tomcat pooling datasource common dbcp2 spring boot 1.x.x에서는 tomcat이 default였으나 2.0.0부터 hikaricp가 default가 되었습니다. 그래서 spring-boot-starter-jdbc, spring-boot-starter-data-jpa를 사용하면, HikariCP(가장 높음) -> Tomcat pooling -> Commons DBCP2의 순위로 지정됩니다. 위의 우선순위를 무시하고 spring.datasource.type에 값을 통해 설정할 수도 있습니다. spring.datasource.typ..
Spring - hikariCP 옵션 정리 및 권장 설정datasource spring boot 2.x.x 기준에서 사용 가능한 connection pool은 3가지가 있습니다. hikariCP tomcat pooling datasource common dbcp2 spring boot 1.x.x에서는 tomcat이 default였으나 2.0.0부터 hikaricp가 default가 되었습니다. 그래서 spring-boot-starter-jdbc, spring-boot-starter-data-jpa를 사용하면, HikariCP(가장 높음) -> Tomcat pooling -> Commons DBCP2의 순위로 지정됩니다. 위의 우선순위를 무시하고 spring.datasource.type에 값을 통해 설정할 수도 있습니다. spring.datasource.typ..
2023.12.31 -
본 포스팅은 kotlin과 java 코드가 혼재되어 있으며 spring boot 3.x 버전에서 사용된 코드입니다. RestTemplate이란? Spring MVC에서는 외부 요청을 위해 RestTemplate을 사용합니다. spring boot 3.x 설정 RestTemplate은 커넥션 풀을 지원하지 않아 구성 요소인 HttpClient를 통해서 커넥션과 관련된 추가 세팅을 진행합니다. 아래 RestTemplateGenerator 클래스는 restTemplate을 만들어내서 반환해 주는 object 클래스로 spring boot 3.x 버전부터 사용하는 RestTemplate 설정입니다. object RestTemplateGenerator { // https://www.baeldung.com/http..
Spring - restTemplate 대용량 파일 업로드, 다운로드 설정본 포스팅은 kotlin과 java 코드가 혼재되어 있으며 spring boot 3.x 버전에서 사용된 코드입니다. RestTemplate이란? Spring MVC에서는 외부 요청을 위해 RestTemplate을 사용합니다. spring boot 3.x 설정 RestTemplate은 커넥션 풀을 지원하지 않아 구성 요소인 HttpClient를 통해서 커넥션과 관련된 추가 세팅을 진행합니다. 아래 RestTemplateGenerator 클래스는 restTemplate을 만들어내서 반환해 주는 object 클래스로 spring boot 3.x 버전부터 사용하는 RestTemplate 설정입니다. object RestTemplateGenerator { // https://www.baeldung.com/http..
2023.12.31 -
공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다. 멀티 모듈이 필요한 이유 프로젝트가 커지다 보면 여러 개의 서버를 만들어야 할 때가 있습니다. 간단한 예시로 위 그림과 같이, WEB 서버와 Batch 서버가 있을 수 있습니다. 만약 WEB 서버를 만들다가 Batch 서버를 추가해야 하는 시점에 WEB 서버에 있는 Member 엔티티를 Batch 서버에서도 사용해야 한다면 어떻게 사용할 것인가에 대해 고민해야 하는 시점이 옵니다. 가장 쉽고 간단한 방법은 Member 클래스 파일을 그대로 복사해서 만들고 사용하는 방식입니다. 하지만 이럴 경우 연동되는 프로젝트가 늘어날 경우, Member 클래스 코드에 수정이 필요한 경우 곳곳에 퍼져있는 코드를 수정해야 하기 때문에 실수할 여..
Spring - Gradle 멀티 모듈 프로젝트공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다. 멀티 모듈이 필요한 이유 프로젝트가 커지다 보면 여러 개의 서버를 만들어야 할 때가 있습니다. 간단한 예시로 위 그림과 같이, WEB 서버와 Batch 서버가 있을 수 있습니다. 만약 WEB 서버를 만들다가 Batch 서버를 추가해야 하는 시점에 WEB 서버에 있는 Member 엔티티를 Batch 서버에서도 사용해야 한다면 어떻게 사용할 것인가에 대해 고민해야 하는 시점이 옵니다. 가장 쉽고 간단한 방법은 Member 클래스 파일을 그대로 복사해서 만들고 사용하는 방식입니다. 하지만 이럴 경우 연동되는 프로젝트가 늘어날 경우, Member 클래스 코드에 수정이 필요한 경우 곳곳에 퍼져있는 코드를 수정해야 하기 때문에 실수할 여..
2023.12.29 -
공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다. 코드 커버리지 코드 커버리지는 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표 중 하나입니다. 테스트를 진행하였을 때 '코드 자체가 얼마나 실행되었느냐'는 것이고, 이는 수치를 통해 확인할 수 있습니다. 코드 커버리지의 측정 기준은 크게 구문, 조건, 결정 3가지로 나뉩니다. 가장 대표적으로 많이 사용되고 있는 측정 기준은 구문 입니다. 구문(Statement) = 라인(Line) 커버리지 코드 한 줄이 한 번이상 실행된다면 충족한다는 것을 기준으로 측정됩니다. void foo (int x) { system.out("start line"); // 1번 if (x > 0) { // 2번 system.out("mi..
Spring - Jacoco 적용하기공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다. 코드 커버리지 코드 커버리지는 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표 중 하나입니다. 테스트를 진행하였을 때 '코드 자체가 얼마나 실행되었느냐'는 것이고, 이는 수치를 통해 확인할 수 있습니다. 코드 커버리지의 측정 기준은 크게 구문, 조건, 결정 3가지로 나뉩니다. 가장 대표적으로 많이 사용되고 있는 측정 기준은 구문 입니다. 구문(Statement) = 라인(Line) 커버리지 코드 한 줄이 한 번이상 실행된다면 충족한다는 것을 기준으로 측정됩니다. void foo (int x) { system.out("start line"); // 1번 if (x > 0) { // 2번 system.out("mi..
2023.12.29 -
공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다. REST Docs 란? 테스트 코드 기반으로 Restful API 문서를 돕는 도구입니다. Asciidoctor를 이용해서 HTML 등등 다양한 포맷으로 문서를 자동으로 출력할 수 있습니다. RestDocs의 가장 큰 장점은 테스트 코드 기반으로 문서를 작성한다는 점입니다. API Spec과 문서화를 위한 테스트 코드가 일치하지 않으면 테스트 빌드를 실패하게 되어 테스트 코드로 검증된 문서를 보장할 수 있습니다. Swagger VS REST Docs 보통 Spring 에서 문서화를 할 때, Swagger과 Restdocs를 사용하게 됩니다. Swagger는 마치 Postman처럼(직접 요청하듯이) API를 테스트해 볼 수 있는..
Spring - REST Docs 적용 및 최적화하기공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다. REST Docs 란? 테스트 코드 기반으로 Restful API 문서를 돕는 도구입니다. Asciidoctor를 이용해서 HTML 등등 다양한 포맷으로 문서를 자동으로 출력할 수 있습니다. RestDocs의 가장 큰 장점은 테스트 코드 기반으로 문서를 작성한다는 점입니다. API Spec과 문서화를 위한 테스트 코드가 일치하지 않으면 테스트 빌드를 실패하게 되어 테스트 코드로 검증된 문서를 보장할 수 있습니다. Swagger VS REST Docs 보통 Spring 에서 문서화를 할 때, Swagger과 Restdocs를 사용하게 됩니다. Swagger는 마치 Postman처럼(직접 요청하듯이) API를 테스트해 볼 수 있는..
2023.12.29 -
DB 트랜잭션 이해하기 트랜잭션이란? 트랜잭션이란 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들 을 의미합니다. 하나의 트랜잭션이 모두 실행되었을 때를 Commit 이라고 합니다. 일종의 확인 도장으로 트랜잭션에 묶인 모든 쿼리가 성공되어 결과가 실제 DB에 반영하는 것입니다. 하나의 트랜잭션이 모두 실행되지 않도록 하는 RollBack 이라고 합니다. 쿼리 실행결과를 취소하고 DB를 트랜잭션 이전 상태로 되돌리는 것입니다. 트랜잭션의 특징 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 ACID 라고 합니다. A : Atomicity(원자성) 트랜잭션은 DB에 모두 반영되거나, 전혀 반영되지 않아야 한다. 완료되..
Spring - Transaction 총정리DB 트랜잭션 이해하기 트랜잭션이란? 트랜잭션이란 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들 을 의미합니다. 하나의 트랜잭션이 모두 실행되었을 때를 Commit 이라고 합니다. 일종의 확인 도장으로 트랜잭션에 묶인 모든 쿼리가 성공되어 결과가 실제 DB에 반영하는 것입니다. 하나의 트랜잭션이 모두 실행되지 않도록 하는 RollBack 이라고 합니다. 쿼리 실행결과를 취소하고 DB를 트랜잭션 이전 상태로 되돌리는 것입니다. 트랜잭션의 특징 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 ACID 라고 합니다. A : Atomicity(원자성) 트랜잭션은 DB에 모두 반영되거나, 전혀 반영되지 않아야 한다. 완료되..
2023.12.29 -
DB Replication 이란? 데이터베이스 이중화 방식 중 하나로 하나의 Master DB와 여러 대의 Slave DB를 구성하는 방식을 의미합니다. 사용하는 이유 부하 분산 서비스에 사용자가 많아져 트래픽이 늘어날 경우, DB에 쿼리를 날리는 일이 빈번하게 일어납니다. DB에서는 쿼리를 모두 처리하기 힘들어지게 되고 이에 따라 부하를 줄이기 위해 DB를 이중화하여 Master에서는 쓰기/수정/삭제 연산을 처리하고 Slave에서는 읽기 연산만을 처리하여 병목 현상을 줄일 수 있습니다. 데이터 백업 Master의 데이터가 날아가더라도 Slave에 데이터가 저장되어 있으므로 어느 정도 복구할 수 있습니다. MySQL Replication은 비동기 방식이기 때문에 100% 정합성을 보장할 수 없습니다. M..
Spring - MySQL Replication 적용하기(with AWS RDS 다중 AZ)DB Replication 이란? 데이터베이스 이중화 방식 중 하나로 하나의 Master DB와 여러 대의 Slave DB를 구성하는 방식을 의미합니다. 사용하는 이유 부하 분산 서비스에 사용자가 많아져 트래픽이 늘어날 경우, DB에 쿼리를 날리는 일이 빈번하게 일어납니다. DB에서는 쿼리를 모두 처리하기 힘들어지게 되고 이에 따라 부하를 줄이기 위해 DB를 이중화하여 Master에서는 쓰기/수정/삭제 연산을 처리하고 Slave에서는 읽기 연산만을 처리하여 병목 현상을 줄일 수 있습니다. 데이터 백업 Master의 데이터가 날아가더라도 Slave에 데이터가 저장되어 있으므로 어느 정도 복구할 수 있습니다. MySQL Replication은 비동기 방식이기 때문에 100% 정합성을 보장할 수 없습니다. M..
2023.12.28 -
p6spy란? p6spy란 쿼리 파라미터를 로그에 남겨주고 추가적인 기능을 제공하는 외부 라이브러리입니다. 사실 이 외부 라이브러리 없이도 application.yml에 다음과 같은 설정을 통해 쿼리 파라미터의 값들을 찍을 수 있습니다. # application.yml logging: level: org.hibernate.SQL: debug org.hibernate.type: trace # for native query org.springframework.jdbc.core.JdbcTemplate: DEBUG org.springframework.jdbc.core.StatementCreatorUtils: TRACE 이렇게 값을 찍게 될 경우 아래 그림과 같이 ?가 찍히고 그 아래 실제 들어간 파라미터 값을 ..
Spring - p6spy 적용하기p6spy란? p6spy란 쿼리 파라미터를 로그에 남겨주고 추가적인 기능을 제공하는 외부 라이브러리입니다. 사실 이 외부 라이브러리 없이도 application.yml에 다음과 같은 설정을 통해 쿼리 파라미터의 값들을 찍을 수 있습니다. # application.yml logging: level: org.hibernate.SQL: debug org.hibernate.type: trace # for native query org.springframework.jdbc.core.JdbcTemplate: DEBUG org.springframework.jdbc.core.StatementCreatorUtils: TRACE 이렇게 값을 찍게 될 경우 아래 그림과 같이 ?가 찍히고 그 아래 실제 들어간 파라미터 값을 ..
2023.12.28 -
로깅 vs System.out.println() 로깅을 사용하면 다음과 같은 이점이 있습니다. 출력 형식을 지정할 수 있다. 로그 레벨에 따라 남기고 싶은 로그를 별도로 지정할 수 있다. 콘솔뿐만 아니라 파일이나, 네트워크 등 로그를 별도의 위치에 남길 수 있다. 성능이 System.out 보다 좋다. 로그 레벨 레벨 설명 Fatal 매우 심각한 에러로 프로그램이 종료되는 경우가 많다 Error 의도하지 않은 에러가 발생한 경우로 프로그램이 종료되진 않는다. Warn 에러가 될 수도 있는 잠재적 사능성이 있는 경우 Info 요구사항에 따라 시스템 동작을 확인할 때, 명확한 의도가 있는 에러의 경우 Debug Info 레벨보다 더 자세한 정보가 필요한 경우로 Dev환경에서 주로 사용 Trace Debug ..
Spring - Logback 설정하기로깅 vs System.out.println() 로깅을 사용하면 다음과 같은 이점이 있습니다. 출력 형식을 지정할 수 있다. 로그 레벨에 따라 남기고 싶은 로그를 별도로 지정할 수 있다. 콘솔뿐만 아니라 파일이나, 네트워크 등 로그를 별도의 위치에 남길 수 있다. 성능이 System.out 보다 좋다. 로그 레벨 레벨 설명 Fatal 매우 심각한 에러로 프로그램이 종료되는 경우가 많다 Error 의도하지 않은 에러가 발생한 경우로 프로그램이 종료되진 않는다. Warn 에러가 될 수도 있는 잠재적 사능성이 있는 경우 Info 요구사항에 따라 시스템 동작을 확인할 때, 명확한 의도가 있는 에러의 경우 Debug Info 레벨보다 더 자세한 정보가 필요한 경우로 Dev환경에서 주로 사용 Trace Debug ..
2023.12.28 -
Cache란? Cache란 나중에 요청할 결과를 미리 저장해 둔 후 빠르게 서비스해 주는 것을 의미합니다. 즉, 미리 결과를 저장하고 나중에 요청이 오면 그 요청에 대해서 DB 또는 API를 참조하지 않고 Cache에 접근하여 요청을 처리하게 됩니다. 이러한 cache가 동작할 수 있는 철학에는 파레토 법칙이 있습니다. 파레토 법칙이란 80퍼센트의 결과는 20퍼센트의 원인으로 인해 발생한다는 것을 의미합니다. 이것은 Cache가 효율적일 수 있는 이유가 될 수 있습니다. 모든 결과를 캐싱할 필요는 없으며, 우리는 서비스를 할 때 많이 사용되는 20%를 캐싱한다면 전체적으로 영향을 주어 효율을 극대화할 수 있다는 것을 의미합니다. Cache 사용 방식 Client로부터 요청을 받는다. Cache와 작업한다..
Spring - Redis 연동하기Cache란? Cache란 나중에 요청할 결과를 미리 저장해 둔 후 빠르게 서비스해 주는 것을 의미합니다. 즉, 미리 결과를 저장하고 나중에 요청이 오면 그 요청에 대해서 DB 또는 API를 참조하지 않고 Cache에 접근하여 요청을 처리하게 됩니다. 이러한 cache가 동작할 수 있는 철학에는 파레토 법칙이 있습니다. 파레토 법칙이란 80퍼센트의 결과는 20퍼센트의 원인으로 인해 발생한다는 것을 의미합니다. 이것은 Cache가 효율적일 수 있는 이유가 될 수 있습니다. 모든 결과를 캐싱할 필요는 없으며, 우리는 서비스를 할 때 많이 사용되는 20%를 캐싱한다면 전체적으로 영향을 주어 효율을 극대화할 수 있다는 것을 의미합니다. Cache 사용 방식 Client로부터 요청을 받는다. Cache와 작업한다..
2023.12.27