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() { ..
Flix 프로젝트: 개발 기록 - 8
·
포트폴리오
1. 오늘의 진행 상황 & 구현 내용오늘은 스트리밍 서비스의 핵심 API를 구현했습니다. 주요 구현 내용은 다음과 같습니다:스트리밍 세션 관리 API 구현스트리밍 세션을 관리하기 위한 API를 구현했습니다. 사용자는 스트리밍을 시작하고, 이어보기를 하고, 재생 위치를 업데이트할 수 있습니다.@RestController@RequestMapping("/api/v1/history")@Slf4j@RequiredArgsConstructorpublic class HistoryController { private final ObjectMapper objectMapper; private final SessionService sessionService; @PostMapping("/start") pu..
Flix 프로젝트: 개발 기록 - 7
·
포트폴리오
1. 오늘의 진행 상황 & 구현 내용Redis 기반 세션 관리 API 구현오늘은 Redis를 활용한 세션 관리 API를 구현했습니다. 주요 구현 내용은 다음과 같습니다:세션 생성, 조회, 갱신, 삭제 API 구현사용자별 세션 관리 기능 구현세션 상태 관리 시스템 구현구현된 주요 API 엔드포인트:@RestController@RequestMapping("/api/v1/sessions")public class SessionController { @PostMapping public ResponseEntity createSession(@RequestBody SessionRequest request) { // 세션 생성 로직 } @GetMapping("/{sessi..
Flix 프로젝트: 개발 기록 - 6
·
포트폴리오
1. 오늘의 진행 상황 & 구현 내용Spring Cloud Config 설정 중앙화 적용 점검지난번에 Spring Cloud Config를 통해 각 마이크로서비스의 설정을 중앙집중식으로 관리하도록 구성했지만, 도커 환경에서는 config-server와의 통신이 원활하지 않아 정상 작동하지 않았습니다. 오늘은 해당 문제를 집중적으로 분석하고 해결하는 데 주력했습니다. 그 결과 다음과 같은 조치를 통해 도커 환경에서도 설정 중앙화가 정상적으로 작동하도록 만들었습니다: - config-server 애플리케이션 설정 확인 및 Git 연동 점검- 서비스 내에서 config-server 주소를 참조할 때 Host 헤더 문제로 인해 오류 발생- 도커 네트워크 내부에서 config_server와 같은 언더스코어(_) ..