# Back-End/Spring

    ShedLock을 이용한 스케줄 작업 중복 방지하기

    주제 다중 어플리케이션 환경에서 스케줄 작업을 하기 위한 ShedLock을 알아본다 1. ShedLock에 대해 알아보기 1.1 ShedLock이란? 스프링 부트 애플리케이션에서 분산된 환경에서 스케줄된 작업을 동시에 실행하지 않도록 막아주는 라이브러리 이를 통해 여러 인스턴스 또는 클러스터에서 동시에 실행되어서는 안 되는 작업을 안전하게 스케줄링할 수 있음 ShedLock은 데이터베이스를 사용하여 작업 잠금을 관리하며, 다양한 데이터베이스를 지원 1.2 ShedLock의 3가지 속성 name : 잠금의 이름 lockAtMostFor : 최대 잠금 기간 lockAtLeastFor : 최소 잠금 기간 lockAtLeastFor의 설정이 너무 짧으면 작업이 충분한 시간 동안 Lock으로 보호되지 않을 수 있..

    스프링 배치 익혀보기 : 개념 정리 + 간단한 실습

    주제 배치의 개념과 구성 요소에 대해 알아본다. 하나의 Job을 여러 Step으로 구성하는 방법을 알아본다. Tasklet, Chunk 단위로 처리해본다. 1. Spring Batch란 1.1 정의 1.1.1 Batch 작업이란? 대용량 데이터를 처리하려면 많은 시간과 자원이 소요될 수 있고, 동일한 데이터를 사용하는 다른 서비스에 영향을 줄 수 있다. 때문에 이를 실시간이 아닌 한번에 많은 데이터를 처리할 때가 있다. 실시간이 아닌 일괄적으로 모아서 처리하는 작업을 배치 작업이라고 한다. 1.1.2 Spring Batch란? 엔터프라이즈 시스템의 일상적인 작업에 필수적인 강력한 배치 응용 프로그램을 개발할 수 있도록 설계된 가볍고 포괄적인 배치 프레임워크 로깅/추적, 트랜잭션 관리, 작업 처리 통계, ..

    [JPA] 낙관적 락(Optimistic Lock), 비관적 락(Pessimistic Lock)

    주제 비관적 락과 낙관적 락에 대해 알아본다. 각각 적합한 사용처를 알아본다. 1. 비관적 락, 낙관적 락 1.1 락이 왜 필요한가요? 트래픽이 낮은 서비스에서는 자주 발생하지 않겠지만, 트래픽이 많아진다면 여러 트랜잭션/요청이 동시에 같은 데이터에 접근하는 경우가 생길 수 있다. 이때 각기 다른 요청이 수행하는 작업은 서로의 작업 결과에 영향 끼칠 수 있다. 데이터의 일관성을 유지하기 위해 Lock을 통해 이를 제어할 수 있다. 1.1 비관적 락(Pessimistic Lock) 1.1.1 정의 자원 요청에 따른 동시성 문제가 발생할 것이라 예상하고 락을 거는 방법론 트랜잭션 간에 충돌이 발생할 것이라고 가정한다. 하나의 트랜잭션이 자원에 접근했을 때 락을 걸고, 다른 트랜잭션은 접근하지 못한다. DB에..

    Insert문 전에 발생하는 Select문을 제거해보자

    주제 JPA save 호출 시 Insert문 전에 Select문이 발생하는 이유를 알아본다. Select문을 제거하여 성능 개선을 경험한다. 1. JPA Insert 하기 전에 Select 문이 발생하는 이유 1.1 Save 메소드를 열어보자 SimpleJpaRepository를 확인하면 저장하려는 엔티티가 새로운 것인지 isNew를 통해 확인하고 저장한다. 새로운 엔티티의 경우 persist 기존에 있던 엔티티라면 merge 1.2 isNew의 기준을 재정의하자 AbstractEntityInformation.class 를 보면 isNew의 기준은 엔티티의 ID(식별자)를 보고 새로운 엔티티인지 판별하게 된다. 우리는 엔티티에 Persistable를 구현하여 이 기준을 재정의 한다. package com..

    JPA Batch Insert/Update를 적용하여 성능 향상하기

    주제 하이버네이트, JDBC에 Batch Insert/Update 설정을 추가해본다 Batch로 처리했을 때의 성능 개선을 경험한다. 1. Batch Insert/Update에 대해 알아보기 1.1 Batch Insert/Update 란? INSERT INTO USER (ID, USER_NAME, AGE) VALUES (1, '춘식이', 19); INSERT INTO USER (ID, USER_NAME, AGE) VALUES (2, '라이언', 20); INSERT INTO USER (ID, USER_NAME, AGE) VALUES (3, '어피치', 21); ... ... 대량의 데이터를 조작하려면 여러 번 Save 혹은 Update를 수행해야 한다. 저장할 데이터가 10,000건일 경우 데이터 1개를..

    @Transactional 어노테이션을 이용한 트랜잭션 관리

    주제 @Transactional 어노테이션에 대해 알아본다. @Transactional을 적용해본다. 1. @Transactional 어노테이션이란? 1.1 트랜잭션이란? 트랜잭션이란 어떠한 작업들의 묶음이다. 트랜잭션이란 어떠한 작업들의 묶음이다. 데이터를 동기화 시키기 위한 작업들을 나열해보면 다음과 같다. 새로운 데이터를 받아옴 필요에 따라 데이터를 백업 기존 데이터에 반영(삭제, 수정, 저장) 이러한 여러 작업을 하나로 묶는다면 동기화 트랜잭션으로 만들 수 있다. 트랜잭션은 ACID 라는 특성이 있는데, 이는 하나의 트랜잭션에서 일어나는 작업들의 일관성/안전성을 보장하기 위한 특성이다. Spring 에서는 @Transactional 어노테이션을 통해 트랜잭션을 적절하게 관리할 수 있다. 1.2 @..

    [Spring Data JPA] Pageable을 이용한 Paging 조회

    개요 Paging 처리를 하는 여러 방법 중 Pageable 객체를 사용한 방법을 알아본다. 코드 1. Controller @RequiredArgsConstructor @RestController public class MovieController { private final MovieService movieService; @GetMapping("api/movies") public ApiResponse getMoviesPaging(@RequestParam(defaultValue = "0") Integer pageNo, @RequestParam(defaultValue = "10") Integer pageSize) { Pageable pageable = PageRequest.of(pageNo, pageSiz..

    Logback과 slf4j 간단한 예제

    로그 레벨 TRACE : 추적 레벨은 DEBUG보다 좀 더 상세한 정보를 표시 DEBUG : 프로그램을 디버깅하기 위한 정보를 표시 (운영 서버에서는 표시하지 않도록 설정) INFO : 상태 변경과 같은 정보성 로그를 표시 WARN : 처리 가능한 문제, 시스템 에러의 원인이 될 수 있는 경고성 메시지를 표시 ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시 ※ 로그 레벨로 설정한 값 이상의 로그가 출력됨 (EX: 로그 레벨 INFO : INFO, WARN, ERROR가 출력됨) Yaml 단순 설정 # log logging: level: root: INFO org: hibernate: SQL: OFF type: descriptor: sql: BasicBinder: OFF file: name: $..

    Spring Boot Java 8에서 11로 업그레이드

    1. 로컬 PC 자바 세팅 (윈도우는 환경변수 바꿔줘야 함) 2. 인텔리제이 Gradle JVM 변경 3. build.gradle 자바 버전 변경 sourceCompatibility = '11' targetCompatibility = '11' 4. Project Structure에서 SDK 설정 변경

    [Spring] POI 라이브러리를 이용한 Excel 생성

    POI 라이브러리를 이용한 Excel 생성 마케팅팀, 운영팀에서 요청하는 데이터를 제공하기 위해 MySql Workbench의 데이터 내보내기 기능을 사용하고 있었는데, 매번 쿼리를 입력하고 엑셀로 추출하는 번거로움이 있기 때문에 이를 직접 원하는 기간 등을 입력하고 다운받을 수 있도록 API로 만들게 되었다. 1. 의존성 compile('org.apache.poi:poi-ooxml:3.16') // .xlsx compile('org.apache.poi:poi:3.16') // .xls Excel 파일을 생성하기 위해 POI 라이브러리를 추가합니다. 2. Code 2.1 ReportService.java package com.kingpiggy.study.service; import com.kingpigg..