분류 전체보기 135

PDF 내보내기 첫 페이지 공백 및 잘림

문제PDF 인쇄 및 출력 시 첫 페이지가 공백으로 출력되고,특정 기준(송장번호)으로 페이지 나누기(page-break-after: always)가 동작하지 않음 1. #printDiv에 position: absolute 추가 : 첫 페이지 공백 해결, 페이지 나누기 안 됨 2. #printDiv에 position: fixed 추가첫 페이지 공백 해결, 페이지 나누기 안 됨3. #printDiv에 position 제거: 페이지 나누기 정상, 첫 페이지 공백 재발4. console.log로 부모 체인 디버깅: 근본 원인 발견 원인AdminLTE의 CSS가 .content-wrapper에 overflow: hidden을 적용하고 있었음 - overflow: hidden → Block Formatti..

카테고리 없음 2026.04.01

[MONITORING] 예외발생 시 Slack 으로 알림 보내기

1. 코드작성public enum ErrorLevel { LOW(Level.INFO, false), MEDIUM(Level.WARN, false), HIGH(Level.ERROR, true), CRITICAL(Level.ERROR, true);}- 에러레벨 ENUM으로 작성 if (level.isSlackNotify()) slackNotifier.send(e, request);- true일 경우 심각한 예외로 지정, slack에 메세지 전달 public class SlackNotifier { @Value("${slack.webhook.url:}") private String webhookUrl; private final RestClient restClient = R..

Monitoring 2026.04.01

시스템 설계(모놀리식 vs 마이크로서비스 아키텍처)

최근에 Spring Batch와 RabbitMQ를 활용하며 대규모 트래픽 처리와 대용량 데이터 처리에 관심이 생겼다. 그러다“이런 트래픽이 실제 서비스에서 발생한다면, 시스템을 어떻게 설계해야 안정적이고 효율적으로 운영할 수 있을까?”라는 고민이 들었고, 그 궁금증을 계기로 시스템 설계에 대해 본격적으로 공부하게 되었다. 시스템 설계란?시스템 설계는 웹 서비스가 트래픽이 많아지거나 데이터량이 커지더라도안정적으로 동작할 수 있도록 구조를 설계하는 과정이다.서비스가 커질수록 단순한 CRUD 구조만으로는 한계가 생긴다.성능, 확장성, 신뢰성, 유지보수성을 고려하여 구조를 잡아야 한다.실제로는 하나의 서버/DB로는 부족해지며 여러 컴포넌트를 나누고 연결해야 한다. 시스템 설계를 공부하면서 가장 먼저 접하게..

웹 개발 종합 2025.12.09

[OS] 세마포어(Semaphore)와 뮤텍스(Mutex)

세마포어(Semaphore)와 뮤텍스(Mutex)다중 스레드 환경에서 웹 애플리케이션을 개발할 때, 공유 자원(Shared Resource) 에 대한 접근 제어는 피할 수 없는 문제다여러 스레드가 동시에 동일한 데이터를 수정하려 하면, 데이터 무결성이 깨지거나 경쟁 상태(Race Condition) 가 발생할 수 있다.이러한 문제를 해결하기 위한 대표적인 동기화 기법이 세마포어(Semaphore) 와 뮤텍스(Mutex) 이다.이들은 모두 운영체제(OS) 수준에서 공유 자원에 대한 접근을 제어하기 위해 사용되는 동기화 메커니즘으로,자원 접근을 제어하는 ‘락(lock)’을 관리하는 기술이라 할 수 있다. 즉, 낙관적 락(Optimistic Lock), 비관적 락(Pessimistic Lock), 분산 락(D..

OS 2025.10.17

낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)

동시에 여러 트랜잭션이 같은 데이터를 수정하려고 할 때, 데이터의 정합성(Consistency)이 깨질 수 있다.이를 방지하기 위해, 트랜잭션 간의 충돌을 제어하는 동시성 제어(Concurrency Control) 기법이 필요하다.세마포어(Semaphore)와 뮤텍스(Mutex)는 운영체제(OS) 수준에서 스레드 간 자원 접근을 제어하기 위해시스템 락을 거는 방법이다.반면, 낙관적 락과 비관적 락은 서버 애플리케이션 혹은 데이터베이스(DB) 레벨에서 적용되는 동시성 제어방식이다.즉, 단일 프로세스 내의 스레드 동기화가 아니라,여러 트랜잭션이 같은 데이터를 수정하려 할 때 데이터의 정합성(Consistency)을 유지하기 위한 방법이라 할 수 있다. 비관적 락 (Pessimistic Lock)비관적 ..

DB 2025.10.17

분산 락(distributed lock) 이란?

동시성 문제를 해결하기 위해 뮤텍스(Mutex), 세마포어(Semaphore)나데이터베이스의 비관적/낙관적 락을 떠올리게 된다.하지만 이 기법들은 모두 모놀리식(Monolithic) 아키텍처 안에서만 동작한다.하지만 MSA 환경에서는 각 서비스가 독립된 서버와 데이터베이스를 사용하는 것이 일반적이다.프로세스 간에는 메모리를 공유하지 않기 때문에 서로의 락 상태를 확인하거나 제어할 수 없다.즉, 한 서버에서 설정한 락을 다른 서버가 인식할 방법이 없다.따라서 여러 대의 서버가 네트워크를 통해 동일한 공유 자원(예: 재고, 쿠폰, 포인트 등) 에 접근할 수 있는 상황에서는분산 락(Distributed Lock) 이 필요하다. 분산 락(distributed lock) 이란?공통 저장소에 락의 상태를 저..

DB 2025.10.16

Spring Batch를 활용한 쿠폰발급 및 메일전송

중고물품 거래 플랫폼을 개발하면서, 마케팅 측면에서 유저가 이메일 수신을 허용하도록 유도하기 위해 생일인 유저에게 생일 쿠폰을 자동으로 발송하는 기능을 구현했다. 이 기능을 어떤 방식으로 구현할지 고민하던 중, 확장성과 유지보수성을 고려하여 Spring Batch를 도입하기로 결정했다. Spring Batch란? Spring Batch는 대용량 데이터를 효율적으로 처리하기 위한 Java 기반 배치 프레임워크다. 주로 청크(Chunk) 단위로 데이터를 나누어 처리함으로써, 상황에 따라 메모리를 유연하게 사용할 수 있다는 장점이 있다. Spring Batch의 청크 처리 구조는 다음과 같은 구성요소로 이루어진다. 1. Scheduler → 배치 실행을 트리거(JobLauncher 실행) 한다.2..

Java 2025.10.15

DDD, 헥사고날 아키텍처, 멀티모듈 — 개념 및 흐름

들어가며현대 애플리케이션은 복잡한 비즈니스 규칙과 빠른 기술 교체 요구를 동시에 맞닥뜨린다.이를 잘못 설계하면 코드가 외부 라이브러리·프레임워크에 묶여 변경이 어렵고, 여러 팀이 동시에 작업할 때 충돌이 잦아진다. DDD, 헥사고날, 멀티모듈은 이러한 문제를 해결하는 실용적인 조합이다. 이 글은 DDD → 헥사고날 → 멀티모듈 순으로 설명할 예정이다. 도메인 주도 설계 (DDD; Domain-Driven Design)도메인 주도 설계.. 알듯 말듯한 단어이다. 도메인 중심으로 설계를 한다는 것 같은데.. 과연 DDD에서 말하는 도메인은 무엇일까? 🤔DDD에서 도메인은 현실 세계에서 해결해야 하는 비즈니스 문제 영역을 정의하는 것이라 볼 수 있다.예를들어 티켓 예매 프로그램을 만든다고 가정할 경우예..

아키텍처 2025.09.14

동기 / 비동기 (Sync / Async) 와 블로킹 / 논블로킹 (Blocking / Non-Blocking)

CS를 진행하며 동기 / 비동기와 블로킹 / 논블로킹이 헷갈려 찾아봤다.찾아보면 볼수록 헷갈렸지만, 알고보니 동기와 블로킹은 단지 조합하여 사용되는 것 뿐 전혀 다른 개념이었다. 1. 핵심 요약동기 / 비동기 (Sync / Async) : 결과를 누가 확인하는가?동기: 호출한 쪽(A)이 계속 결과를 확인해야 함비동기: 호출받은 쪽(B)이 결과가 끝났을 때 알려줌 블로킹 / 논블로킹 (Blocking / Non-Blocking) : 제어권(실행 흐름)을 누가 갖고 있나?블로킹: 호출받은 쪽(B)이 끝날 때까지 호출한 쪽(A)은 멈춤 (제어권을 B가 가짐)논블로킹: 호출받은 쪽(B)은 실행되지만 호출한 쪽(A)은 멈추지 않고 자기 할 일 함 (제어권 A가 계속 가짐) 2. 일상 비유카페에 코딩을 하기..

CS 2025.08.18