본문 바로가기

Dev68

『Spring Cloud』 리전에 따라 경로에 차이가 생기면 어떻게 해결할까? 잠깐 도와주러 들어간 프로젝트에서 한국 리전에서만 서비스를 운영하다가 VM 생성과 관련된 특정 기능은 미국 리전에서도 동시에 운영하고 싶다는 요구를 들었다. 기존 API Gateway를 통해 라우팅 되는 방식은 /vms/..., /lb/..., /os/... 이런 식으로 서비스 기준으로 설정했다. 프론트엔드에서 VM 생성 관련 기능에만 prefix를 붙여서 요청을 보내기에는 공수가 꽤 클 걸로 예상을 했고, 이에 따라 모든 기능에 대해 공통된 prefix를 붙여서 요청을 보내면 Gateway 기능을 통해 경로를 재작성해 라우팅 하는 방법을 선택했다. 핵심은 아래와 같다./vms 및 /sas/vms 경로를 각각 다른 포트(서버)로 라우팅 한다.여러 리전에서 제공하지 않는 /sas/lb, /sas/os 기능.. 2025. 1. 27.
『Spring Boot』 선언적 트랜잭션(Declarative Transaction) 선언적 트랜잭션 (Declarative Transaction)에 대해 알아보기 전에 트랜잭션과 비교를 한번 해보자.  선언적 트랜잭션 설정 파일이나 어노테이션을 통해 코드에 트랜잭션 로직을 직접 작성하지 않고 선언적으로 트랜잭션을 처리하는 방식. 트랜잭션 Java 코드 내에서 트랜잭션 관리 객체를 직접 사용하여 트랜잭션 시작, 커밋, 롤백을 명시적으로 관리하는 방식.  간단하게 말하자면 선언적 트랜잭션을 사용하면 PlatformTransactionManager와 TransactionTemplate을 사용하여 코드로 트랜잭션을 제어하는 귀찮은 작업을 하지 않아도 된다. 물론 복잡한 트랜잭션 제어가 필요한 상황이라면 @Transactional 어노테이션에서 지원해 주는 다양한 속성들을 활용해야 되지만 말.. 2025. 1. 12.
『Spring Boot』 application.yml과 Profile 전 프로젝트에서는 "Profile 별로 모든 설정"을 각각 관리했는데 이번 프로젝트에서는 "공통 설정 + Profile별 설정"을 분리해서 관리한다. 프로젝트마다 환경을 다루는 방법에 차이가 존재하는데 이번 기회에 "공통 설정 + Profile별 설정"에 대해 알아볼 겸 정리하려 해 본다.  application.yml과 Profileapplication.yml 혹은 application.properties는 Spring Boot 애플리케이션 구동 시 자동으로 로드되는 구성 파일이다.Key-Value 혹은 yml 포맷을 통해 애플리케이션에서 사용할 설정 값을 정의한다. 설정 값 예시 서버 포트 DB 접속 정보 로그 레벨 설정 외부 API Token 정보   application-{profile}.y.. 2024. 12. 28.
『DataBase』 Oracle SQL & MyBatis Mapper 부먹 복잡한 결재 시스템을 구축한다고 가정하고, Oracle SQL과 MyBatis Mapper를 조합해서 다양한 쿼리들을 구현해 보자.간단한 예제 쿼리로는 복잡한 비즈니스 로직이 녹아있는 실무의 쿼리를 이해할 수 없기에 조금 복잡한 내용들을 다루어 보려고 한다. 우선 쿼리를 작성하려면 테이블이 존재해야 되기 때문에 아래와 같이 4개의 예제 테이블을 정의하겠다.  하나의 사용자는 여러 결재 요청을 생성할 수 있어 둘 사이에는 1대 N(One-to-Many) 관계가 성립한다.  동시에 결재 단계 테이블을 매개로 하나의 결재 요청은 여러 사용자에게 결재를 받을 수 있고, 한 사용자도 여러 결재 요청의 승인자가 될 수 있어 결재 단계와 사용자 사이에는 N대 N(Many-to-Many) 관계가 성립한다.  또한 사용.. 2024. 12. 22.
『Java』 자바에서 Charset 클래스와 UTF-8의 관계는 무엇인가? Charset 클래스란 무엇인가? Java에서 Charset은 텍스트 데이터가 byte 배열과 String 간에 변환될 때 사용되는 문자 인코딩을 정의하는 클래스다. 즉, Java Application이 다양한 언어와 지역의 문자열을 처리하기 위해 특정한 인코딩 방식을 지정하고 이를 통해 바이트와 문자 간 변환을 수행하는 데 핵심적인 역할을 한다. Charset 클래스는 다음과 같은 기능을 제공한다.   등록된 Charset 조회 현재 JVM에서 사용 가능한 Charset들의 목록을 조회할 수 있다. Charset 인스턴스 생성 forName(String charsetName) 메서드를 통해 "UTF-8", "ISO-8859-1"와 같은 표준 명칭을 이용하여 해당 Charset 객체를 얻을 수 있다.. 2024. 12. 10.
『Spring Batch』 스프링 배치 반복 및 오류 제어 Repeat  Spring Batch는 얼마나 작업을 반복해야 하는지 알려 줄 수 있는 기능을 제공한다. 특정 조건이 충족될 때까지 Job 또는 Step을 반복하도록 설정할 수 있으며, 스프링 배치에서는 Step의 반복과 Chunk 반복을 RepeatOperation을 사용해서 처리하고 있다. 기본 구현체로는 RepeatTemplate를 제공한다. 반복을 종료할 것인지 여부를 결정하는 세 가지 항목  RepeatStatus스프링 배치의 처리가 끝났는지 판별하기 위한 열거형(enum)CONTINUABLE: 작업이 남아 있음FINISHED: 더 이상의 반복 없음CompletionPolicyRepeatTemplate의 iterate 메소드 안에서 반복을 중단할지 결정한다.실행 횟수 또는 완료 시기, 오류 발생.. 2024. 12. 10.
『Spring Batch』 스프링 배치 메타 데이터 스키마 스프링 배치의 실행 및 관리를 위한 목적으로 여러 도메인들(Job, Step, JobParameters..)의 정보들을 저장, 업데이트, 조회할 수 있는 메타 데이터를 스키마로 제공한다. 데이터베이스와 연동할 경우 필수적으로 메타 테이블이 생성되어야 하는데 이와 관련된 스키마 설정을 우선 알아보자.  스키마 생성 설정 스프링 배치 메타데이터 스키마를 사용하는 예제 코드 및 예시를 보자.  Gradle 의존성 application.yaml Java Config 1. yaml에서 설정한 initialize-schema=ALWAYS 설정으로 인해 애플리케이션 시작 시 스프링 배치에 필요한 메타 데이터 테이블들이 H2 메모리 DB에 자동 생성된다.2. Java Config에서 @EnableBatchProcess.. 2024. 12. 9.
『Spring Batch』 스프링 배치 도메인 이해 스프링 배치는 Job을 중심으로 JobInstance, JobExecution, Step, StepExecution, 그리고 이들의 상태 정보인 ExecutionContext 등을 통해 배치 작업을 수행하고 관리할 수 있는 구조를 제공한다.  도메인 객체들의 관계를 이해하면 배치 실행 흐름에서 발생하는 상태 변화와 재시작 로직을 보다 명확히 파악할 수 있다. 도메인 객체들을 자세히 살펴보기 전에 간략하게 정리한 표를 우선적으로 보겠다.도메인 객체설명Job 배치 작업 단위 JobInstance Job의 특정 파라미터로 실행한 인스턴스 JobParameter JobInstance를 식별하는 실행 파라미터 JobExecution JobInstance 별 실제 실행 정보 Step Job을 구성하는 실행 단위 S.. 2024. 12. 7.
프레임워크와 라이브러리의 차이 프레임워크란 프레임워크(Framework)란 개발자가 소프트웨어를 개발함에 있어 구현에 드는 시간을 단축하고 재사용성을 높이기 위해 미리 정해진 구조나 설계 패턴을 제공하는 ‘뼈대’이다.  이는 일련의 클래스 묶음이나 템플릿을 라이브러리 형태로 제공하는 것으로 개발자가 해당 구조를 기반으로 애플리케이션을 구성하고 확장해나가게 된다.  대표적으로 IoC(Inversion of Control, 제어의 역전) 개념이 적용되어 있어 프로그램의 전체적인 흐름(Flow)을 프레임워크가 주도하고 개발자는 필요한 부분을 확장하거나 구현하는 방식으로 개발을 진행한다.  특징 프레임워크는 정형화된 개발 방식과 구조를 제시한다. 예를 들어 Spring Framework에서는 애플리케이션 컨텍스트나 Bean 설정 방식을 지키.. 2024. 12. 6.