REST API 설계 & 문서화
·
TIL
웹 애플리케이션이 성장할수록 일관성 있는 API 설계와 명확한 문서화는 유지보수성과 확장성의 핵심입니다. 이번 포스트에서는 RESTful URI 설계 원칙, 응답 형태 통일, Swagger/OpenAPI 사용법을 알아보겠습니다.1. RESTful한 URI 설계 원칙1-1. 리소스(resource) 중심 설계URI는 행위(동사)가 아니라 명사(리소스) 로 표현합니다.예: /orders (주문 목록), /orders/{orderId} (특정 주문)1-2. HTTP 메서드 활용메서드의미예시GET조회(Read)GET /users, GET /users/123POST생성(Create)POST /usersPUT전체 갱신PUT /users/123PATCH부분 갱신PATCH /users/123DELETE삭제(Delete..
비동기와 병렬 처리
·
TIL
현대 백엔드 애플리케이션에서는 요청 처리의 지연(latency)을 줄이고, 리소스 활용을 극대화하기 위해 비동기와 병렬 처리가 필수적입니다. 스프링 환경에서는 @Async와 CompletableFuture를, 순수 자바에서는 Thread, ExecutorService, ForkJoinPool 등을, 더 나아가 리액티브 프로그래밍을 지원하는 Spring WebFlux까지 다양한 선택지가 있습니다. 1. @Async를 이용한 간편 비동기 처리스프링이 제공하는 어노테이션 기반 비동기 처리 방식별도 쓰레드 풀에서 메서드를 실행해 호출 스레드의 블로킹을 방지@Servicepublic class NotificationService { @Async public void sendEmail(String to..
스프링 시큐리티
·
TIL
오늘은 스프링 생태계에서 가장 널리 사용되는 보안 프레임워크인 Spring Security를 다뤄보려고 합니다. 특히 인증과 인가의 차이부터, 내부적으로 동작하는 필터 체인(Filter Chain) 구조, 그리고 실제 프로젝트에 자주 쓰이는 JWT 기반 인증과 OAuth2 간단 구현까지 살펴보겠습니다.1. 인증(Authentication) vs 인가(Authorization)먼저 보안의 기초 용어부터 정리해 보겠습니다.1. 인증(Authentication)사용자가 누구인지 증명하는 단계아이디/비밀번호를 입력하거나, 토큰을 보내서 서버가 이 사용자가 누구인지 확인하는 과정스프링 시큐리티에서는 AuthenticationManager와 UserDetailsService 등을 활용2. 인가(Authorizati..
스프링 트랜잭션
·
TIL
오늘은 스프링에서 트랜잭션의 동작 원리부터 전파, 고립 수준, 그리고 롤백되지 않는 예외 케이스까지 살펴보며, 트랜잭션을 올바르게 이해하고 활용하는 방법을 알아보겠습니다. 1. @Transactional의 동작 원리 (프록시 기반)스프링이 @Transactional을 만나면, 실제 비즈니스 로직이 담긴 Bean 대신 트랜잭션을 관리해 주는 프록시(Proxy) 객체를 생성합니다. 호출 흐름은 다음과 같습니다클라이언트 → 프록시 Bean 호출프록시가 트랜잭션 시작 (TransactionManager.getTransaction())실제 타겟(비즈니스 로직) 호출예외 여부에 따라 커밋 또는 롤백트랜잭션 종료@Servicepublic class OrderService { @Transactional pu..
JPA와 Hibernate
·
TIL
오늘은 JPA와 Hibernate를 한 단계 더 깊이 이해하기 위해 중요한 네 가지 주제를 다뤄보겠습니다. 실제 예제를 통해 영속성 컨텍스트의 동작 원리부터, 효과적인 로딩 전략, N+1 문제 해결 기법, 그리고 쿼리 성능 튜닝까지 살펴보겠습니다. 1. 영속성 컨텍스트, flush, dirty checkingJPA의 핵심은 ‘영속성 컨텍스트(Persistence Context)’입니다. 영속성 컨텍스트는 EntityManager가 관리하는 1차 캐시로, 애플리케이션에서 조회한 엔티티를 보관합니다. 이 컨텍스트 안에서는 엔티티의 변경을 자동으로 감지하고, 필요 시점에 DB로 동기화해 주죠.@Transactionalvoid dirtyCheckingTest(EntityManager em) { Member..
B-tree 인덱스 이해하기
·
TIL
RDBMS에서 성능 튜닝 얘기할 때 빠지지 않는 게 바로 인덱스(index)입니다. 이번 글에서는 오라클에서 가장 기본이 되는 B-tree 인덱스에 대해 정리해봤습니다. 공식 문서를 읽는 것도 좋지만, 실제로 테스트해보면서 구조와 특징을 익히는 게 훨씬 기억에 오래 남더라고요. 인덱스란인덱스는 쉽게 말해 책의 목차 같은 역할을 합니다. 테이블 전체를 다 뒤지지 않고도 특정 값을 빠르게 찾을 수 있도록 도와주는 자료구조입니다.테이블이 크면 클수록 인덱스 유무에 따라 성능 차이는 커집니다.오라클에서는 기본적으로 B-tree 인덱스를 사용합니다.B-tree 인덱스란B-tree 인덱스는 "균형 잡힌 트리 구조"입니다. 각 노드는 정렬된 키 값을 가지고 있고, 트리 구조로 되어 있어 O(log n) 시간 복잡도로..
스프링 내부 구조 정리
·
TIL
1. IoC 컨테이너스프링에서 흔히 @Component, @Service, @Repository 같은 애노테이션을 붙이면 "자동으로 Bean 등록된다"는 말을 많이 들어왔죠. 근데 그게 도대체 어디에 어떻게 등록되고, 진짜로 관리되고 있는지 궁금해서 직접 테스트해봤습니다.@Componentpublic class HelloService { public String hello() { return "Hello, Spring!"; }}그리고 이걸 꺼내 쓰는 테스트 코드를 만들어봅니다.@SpringBootTestclass IocTest { @Autowired ApplicationContext context; @Test void testGetBean() { ..
JVM 구조
·
TIL
JVM구조Class Loader - .class 파일을 읽고 JVM 내부 메모리에 올리는 역할 - 3가지 로더:     - Bootstrap ClassLoader: rt.jar (기본 JDK 클래스)     - Extension ClassLoader: --module-path     - Application ClassLoader: 사용자가 만든 클래스 - 클래스 로딩 순서: 로딩 → 링크(검증/준비/해결) → 초기화 Runtime Data Area1. Method Area - 모든 스레드가 공유 - 클래스 메타데이터 저장2. Heap - 객체, 배열 저장 - GC 대상 - 모든 스레드가 공유3. Stack - 스레드별로 생성 - 메서드 호출 시 스택 프레임 생성 - 지역 변수, operand stack ..
JVM 메모리 구조와 클래스 로딩 (Constant Pool과 intern())
·
TIL
Runtime Data AreaJVM이 실행 시 메모리 영역 1. Method Area - 클래스 로딩 시 클래스 메타정보, static 변수, constant pool 복사본이 저장됨 - Runtime Constant Pool은 이 영역 일부로 포함됨 - Java 8부터는 Metaspace라는 native 영역에 저장됨public class StaticExample { static String val = "loaded"; static { System.out.println("StaticExample loaded!"); }}public class LoadTest { public static void main(String[] args) throws Exception { ..
GC(Garbage Collector) 벤치마크 테스트: G1GC vs ZGC vs GenZGC
·
TIL
https://github.com/ongjin/gc-benchmark.git [G1GC 실행 결과]  GC 스트레스 테스트 시작 총 실행 시간: 72.344 초 GC 횟수: 2004 GC 지연(Pause) 시간: 28866 ms 사용된 GC 목록:  - G1 Young Generation  - G1 Concurrent GC  - G1 Old Generation   [ZGC 실행 결과]  GC 스트레스 테스트 시작 총 실행 시간: 47.4 초 GC 횟수: 920 GC 지연(Pause) 시간: 2319 ms 사용된 GC 목록:  - ZGC Cycles  - ZGC Pauses   [GenZGC 실행 결과]  GC 스트레스 테스트 시작 총 실행 시간: 47.705 초 GC 횟수: 886 GC 지연(Pause)..