# Back-End
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에..
[InteliJ] 인텔리제이 설정 백업
Java Code Template #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java") /** * ${NAME} class. * * Describe here. * * * * History: * damian.lee, 0.1.0, Created at ${YEAR}.${MONTH}.${DAY} * * * @author : ${USER} * @version : 0.1.0 */ public class ${NAME} { } Live Template xptmxm @org.junit.jupiter.api.Test @org.junit.jupiter.api.DisplayName("") void ..
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 @..
[Git] 에러 remote: Invalid username or password. fatal: Authentication failed for
remote: Invalid username or password. fatal: Authentication failed for ... 깃허브 비밀번호를 바꿨을 때 발생하는 오류 맥북 : 키체인 접근 들어가서 github 검색 → 변경한 비밀번호로 다 바꿔줌 다른 방법은 퍼스널 토큰을 발급받는 방법도 있는듯한데 이렇게도 해결이 가능하다
Semantic Versioning
개요 프로그램의 변화에 따라 의미 있고 적절한 버전을 붙여주기 위해, Semantic Versioning 이라는 버전 관리 규칙을 알아본다. Semantic Versioning이란? Semantic Versioning은 Github의 공동창업자인 Tom Preston-Werner가 위의 문제를 해결하기 위해 기존의 현안을 모아 만든 제안입니다. 스펙 문서는 RFC 2119에 의해 규칙을 표기하여 의미적 엄격함을 높이고, 패키지 개발 생명주기에 발생할 수 있는 여러 상황을 포괄적으로 담아 일관성과 유연성을 균형 있게 갖추고 있습니다. 0.1.0 Major Version : 기존 api 변경 및 삭제 되거나 하위 호환이 되지 않는 버전 Minor Version : 신규 기능이 추가되거나 개선되었고 하위 호환..