Dev70 『DataBase』 설계를 위해 고민한 내용들 설계의 중요성 최근에 회사에서 애플리케이션 뒷단 관련하여 모든 권한을 위임받았다. 데이터 마이그레이션 업무와 논리적 설계 관련하여 꽤나 괜찮게 수행했고, 웹 애플리케이션을 A-Z까지 설계/개발/운영한 경험을 가진 구성원이 없기 때문에 조금 빠르게 모든 권한을 위임받았다. 처음 합류했을 때, 조직 구성원들이 비개발자 95%로 이루어져 있었다. 이로 인해 설계에 대한 일정 투자를 설득하기가 쉽지 않았는데, 프로토타입 제품을 출시하면서 설계 없이 개발한 제품을 한번 경험해 보니 만들고자 하는 제품에 대해 투자를 시도하는 문화가 생겼다. 급하게 만들기보다는 충분한 일정과 리소스를 투자한다는 말이다. 데이터베이스 설계도 이와 똑같다. '일단 만들고 보자'는 생각으로 주먹구구식으로 만들다 보면, 처음에는 빠르게 개.. 2025. 10. 9. 내가 JVM(Java Virtual Machine)에서 중요하게 생각하는 부분들 일단 쭈욱 한번 그려봤다. 자바의 신 1권, 2권을 보면서 접했던 내용들을 전체적으로 연결시켜 보았다.위 이미지만으로는 일부 내부 구조가 추상화되어 있기 때문에 중요한 내용들부터 ~ 흥미로웠던 내용들 순서로 한번 접근해보려 한다. 일단 파생되는 개념을 살펴보기 전에 JVM 동작 구조는 숙지하는 게 좋다. 잘 모르면 뿌리가 잡히지 않은 채로 암기만 하게 된다. 이번 포스팅에서는 Deep Dive를 위해, JVM이 무엇이고 각 내부 구조가 어떤 역할을 담당하는지 알아보자. Java 애플리케이션이 실행될 때 JVM은 Runtime Data Area이라고 불리는 메모리 공간을 운영체제로부터 할당받는다. 이 메모리 영역은 JVM 내부에서 여러 부분으로 나뉘어 관리되는데 다음과 같다. 📌 GC의 경우 Execu.. 2025. 4. 19. 『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. 이전 1 2 3 4 ··· 8 다음