전체 글

Develop Blog
· Spring
Spring 이벤트와 트랜잭션, 제대로 이해하기 — @EventListener부터 Outbox까지@EventListener, @Async, @TransactionalEventListener... 이름은 익숙한데 막상 "언제 뭘 써야 하지?"라고 물으면 답이 흐릿해지는 경우가 많다. 특히 이벤트 리스너에서 예외가 나면 원래 작업이 롤백되나? 같은 질문 앞에서는 더 그렇다.이 글은 그 애매함을 하나씩 걷어내는 걸 목표로 한다. 트랜잭션 경계에서 시작해서, 동기/비동기 이벤트의 실제 동작, 그리고 "알람이 실패하면 주문을 롤백해야 하나?" 같은 정합성 문제까지 다룬다.1. Redis는 @Transactional에 묶일까?먼저 흔한 오해부터. 결론은 기본적으로 안 묶인다.Spring @Transactional은..
· DB
JPA (Java Persistence API) 에서 엔티티 간의 연관 관계를 설정하는 것은 매우 중요한 작업입니다.특히, ManyToOne 관계에서는 자식 엔티티가 부모 엔티티를 참조하는 방식을 결정해야 합니다.이 글에서는 JPA에서 ManyToOne 관계를 설정할 때 자주 사용되는 두 가지 방법인 getReferenceById()와 생성자를 활용하는 방법을 비교하고, N+1 문제를 해결하고 성능을 최적화하며 각각의 장단점과 선택 기준을 제시하겠습니다..ps) Fetch Join 과 @EntityGraph는 제외하고 말씀드리겠습니다.getReferenceById() 를 활용한 연관 관계 설정JpaRepository에서 제공하는 getReferenceById() 메서드는 엔티티의 ID를 사용하여 실제 엔..
· Java
왜 자바에서 GC를 직접 호출하면 안되는지 알아보도록 하자.GC란?자바(Java)는 개발자가 메모리 관리에 신경 쓰지 않아도 되는 편리한 언어입니다. 이 "자동 메모리 관리"의 핵심에는 바로 가비지 컬렉션(Garbage Collection, GC)이 있습니다. GC는 프로그램이 더 이상 사용하지 않는 객체를 자동으로 찾아 제거하여 메모리 공간을 확보해 주는 자바의 핵심 기능입니다. JAVA 힙(Heap) 메모리 구조GC를 이해하기 위해서는 자바 힙(Heap) 메모리 구조를 먼저 알아야 합니다. 힙 영역은 크게 다음 두 영역으로 나뉩니다.Young Generation (영역): 새롭게 생성된 대부분의 객체가 이 영역에 할당됩니다. 이 영역은 수명이 짧은 객체들이 주로 존재하여 GC가 빈번하게 일어납니다...
· Java
🔥 공정성(Fairness)이란?공정한 잠금(Fair Lock)이란 오래 기다린 스레드가 먼저 락을 획득할 수 있도록 보장하는 방식을 의미즉, FIFO(First In, First Out) 방식으로 락을 관리✅ ReentrantLock에서 공정성 모드 설정Java의 ReentrantLock은 공정성(Fair) 모드를 지원하며, 생성자에서 설정할 수 있어.// 공정한 락 (FIFO 방식)ReentrantLock lock = new ReentrantLock(true);// 비공정한 락 (기본값)ReentrantLock lock = new ReentrantLock(false);true → 공정한 락 (Fair Lock)false → 비공정한 락 (Unfair Lock, 기본값) ✅ 공정한 락(Fair Loc..
· Java
소프트웨어 개발에서 "동시성(Concurrency)"과 "병렬성(Parallelism)"은 자주 혼용되지만, 개념적으로는 확실한 차이가 있습니다.이 글에서는 두 개념을 자세히 설명하고, 각각의 특징과 활용 사례, 그리고 구현 방식에 대해 다뤄보겠습니다.1. 동시성(Concurrency)과 병렬성(Parallelism)의 개념 개념설명예시동시성(Concurrency)하나의 프로세서(또는 CPU)가 여러 작업(Task)을 빠르게 번갈아가며 실행하여 동시에 실행되는 것처럼 보이게 하는 방식싱글 코어 CPU에서 멀티태스킹(ex. 웹 브라우저에서 여러 탭을 빠르게 전환하며 사용)병렬성(Parallelism)여러 개의 프로세서(또는 CPU)가 여러 작업을 실제로 동시에 실행하는 방식멀티코어 CPU에서 비디오 렌더링..
· Spring
JWT 인증 필터를 왜 @Component로 등록하면 안 되는가? - JWT 인증 필터는 @Component로 빈 등록을 하면 Spring Security의 필터 체인에 제대로 결합되지 않아 의도한 대로 동작하지 않을 수 있습니다.필터 체인에서의 순서가 엉킬 수 있기 때문입니다. Spring Security의 필터 체인 내에서 필터를 등록하려면, @Component로 등록하는 대신 SecurityConfig에서 명시적으로 등록해야 합니다.@Component로 필터를 등록하게 되면, Spring이 이 필터를 자동으로 FilterChain에 추가하게 되는데, 이 방식은 Spring Security 필터 체인과 충돌할 수 있습니다. Spring Security는 보안 필터 체인을 구성하는 순서가 매우 중요하며..
· Server
GitLab CI/CD 와 Jenkins의 차이점서론소프트웨어 개발에서 CI/CD(Continuous Integration/Continuous Deployment)는 품질 향상과 개발 속도를 극대화하기 위한 필수 요소로 자리잡았습니다. 이를 구현하기 위해 사용하는 도구로 GitLab CI/CD와 Jenkins가 널리 알려져 있습니다. 이 글에서는 GitLab CI/CD와 Jenkins가 어떤 차이점을 가지고 있는지, 그리고 각각의 장단점은 무엇인지에 대해 자세히 살펴보겠습니다.1. 개요GitLab CI/CDGitLab CI/CD는 GitLab이라는 플랫폼 내에 통합된 CI/CD 도구입니다. GitLab은 코드 리포지토리, 이슈 트래킹, 코드 리뷰, CI/CD 파이프라인 등 다양한 개발 도구를 하나의 플랫..
· Spring
@Scheduled스프링 프레임워크에서 제공하는 @Scheduled 어노테이션을 사용하면 간단하게 스케줄러 기능을 구현할 수 있습니다. 이 글에서는 @Scheduled의 개념과 이를 활용한 구현 방법을 자세히 설명하겠습니다. @Scheduled 어노테이션 개념@Scheduled 어노테이션은 스프링의 스케줄링 작업을 간단하게 설정할 수 있게 해주는 어노테이션입니다. 주기적으로 실행되어야 하는 작업을 선언적으로 설정할 수 있으며, 다양한 스케줄링 옵션을 제공합니다.스케줄링 옵션:fixedRate: 고정된 주기로 작업을 실행합니다.fixedDelay: 이전 작업이 끝난 후 일정 시간이 지난 뒤에 작업을 실행합니다.cron: 크론 표현식을 사용하여 복잡한 주기 설정을 할 수 있습니다. @Scheduled 사용하..
· Spring
Ping 테스트네트워크 통신 여부를 확인해봅시다.import java.net.InetAddress; // InetAddress importpublic void pingCheck() { log.info("[PingService] Start Ping Check ..."); List siteList = null; try { siteList = pingStore.getSiteList(); // DB에서 ip정보가 담겨있는 site정보를 가져옵니다. log.info("[PingService] Site ID List : " + siteList); } catch (Exception e) { e.prin..
Denes
dev_Denes