[Ticketable] 대기열 구현하기(Redis)
·
TIL
이번 글에서는 최종프로젝트[Ticketable] 에서 대기열 기능의 설계와 구현내용을 담았습니다.대기열의 필요성Ticketable 프로젝트는 야구 경기를 대상으로 한 티켓 예매 및 경매 시스템입니다.이 중에서도 티켓팅 기능은 특정 시간에 트래픽이 폭발적으로 몰릴 가능성이 높으며,서버 과부하로 인해 예매 실패 또는 서비스 장애가 발생할 수 있는 구조였습니다.이러한 문제를 해결하기 위해 트래픽 제어 방식으로는 다음과 같은 방법들을 고려할 수 있었습니다.Scale-Up: 서버 자체의 스펙(CPU, 메모리 등)을 높여 처리 성능을 향상시키는 방법Scale-Out: 여러 서버에 트래픽을 분산시키는 방법 (예: 로드 밸런서 + 복수 서버 구성)대기열(Queue): 서버가 감당할 수 있는 요청만 처리하고, 나머지는 ..
TransactionSynchronizationManager를 활용해 AOP 분산락 문제 해결하기
·
TIL
@Slf4j @Aspect @Component @RequiredArgsConstructor public class StockLockAspect { private final RedissonClient redissonClient; @Around("@annotation(com.example.ddakdaegi.global.common.annotation.RedissonLocked)") public Object lockAdvice(ProceedingJoinPoint joinPoint) throws Throwable { log.info("AOP Lock 로직 시작"); MethodSignature signature = (MethodSignature) j..
주특기 플러스 과제 트러블 슈팅
·
TIL
🚀 JPA 대량 데이터 INSERT & 검색 성능 최적화 (트러블슈팅)🛠️ 문제 상황Spring Boot + JPA 환경에서 대량 데이터(100만 건 이상) INSERT 시 속도 저하 & 메모리 문제 발생saveAll() 사용 시 1만 건 저장에 11초 소요100만 건 실행 시 프로그램 멈춤 (메모리 부족)🎯 1️⃣ JPA의 saveAll()을 이용한 INSERT (비효율적)🔍 코드List users = LongStream.range(0,10000) .mapToObj(o -> { String name = UUID.randomUUID().toString(); User user = new User..
스프링 시큐리티 와 OAuth2
·
TIL
클라인언트 : 사용자서버 : 내가 만든 서버프로바이더 : 카카오톡, 구글 ..OAuthOAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준.OAuth 1.0 vs OAuth 2.0 차이점구분OAuth 1.0aOAuth 2.0🔑 인증 방식서명(Signature) 기반 인증 (HMAC-SHA1, RSA-SHA1)토큰 기반 인증 (Access Token 사용)🔒 보안 방식HTTPS 없이도 사용 가능 (서명 필요)HTTPS 필수 (서명 불필요)🔄 사용법복잡한 서명 과정 필요상대적으로 단순함📱 지원 범위웹 기반 서비스 중심웹, 모바일, IoT 등 다양..
일정관리 앱 트러블 슈팅
·
TIL
로그인 검증과 인증정보jwt를 이용해서 로그인을 구현하기로했는데 한가지 문제가 생겼다 .서블릿 필터를 통해서 사용자가보낸 토큰을 검증하고 검증이 완료됐다면 컨트롤러로 넘어가서 요청작업을 수행하도록 코드를 작성했었는데. 로그인검증이 필요한 작업의경우 사용자를 식별할수있는 정보(이하 식별키)가 필요하다는것이였다. 때문에 식별키를 알아내기위해 필터에서 검증한 토큰을 컨트롤러 단계에서 다시한번더 검증하고 식별키를 추출하게되는 개인적으로는 불필요한 작업이 발생하게된다는 것이였다.나름대로 이 문제의 해결책을 알아냈는데, 팀원중 한분이 이전 과제에서 사용했다는 spring security의 SpringContextHolder로 이 문제를 해결해보기로했다. 저번 과제발제시간에 튜터님이 스프링시큐리티를 사용하지말라고 ..
다이나믹 프록시(JDK Dynamic Proxy, CGLIB)
·
TIL
스프링 프레임워크를 활용하다 보면 AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍) 을 적용할 일이 많다고 한다. 로깅, 트랜잭션 관리, 성능 모니터링 등의 공통 기능을 핵심 로직과 분리하여 관리할 수 있기 때문이라는데이러한 AOP의 핵심 기술 중 하나가 다이나믹 프록시(Dynamic Proxy)다. 다이나믹 프록시는 런타임에 객체의 동작을 가로채고, 추가적인 로직을 주입할 수 있도록 도와고. 스프링은 다이나믹 프록시를 활용하여 빈(Bean)에 부가 기능을 적용하는데, 대표적으로 두 가지 방식이 있다.JDK Dynamic Proxy: Java 표준 기능을 활용한 인터페이스 기반의 동적 프록시CGLIB(Code Generation Library): 바이트코드 조작을 통해 클..
일정관리 앱 트러블슈팅 1
·
TIL
1.테이블 연관관계 설정 public class Todo { private Long id; //외래키 private Long userId; private String todo; private String pwd; private LocalDateTime createDt; private LocalDateTime modDt;}처음에는 단순히 위와같이 Todo 엔티티에 userId를 추가하는 방식으로 연관관계를 구현하려했지만 약간의 문제가 발생했다. 일정을 조회했을때는 사용자의Id가 아니라 이름을 가져오도록 해야한다는것이였다.public class Todo { private Long id; //외래키 private Long userId; private ..
어노테이션 / @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor
·
TIL
@AllArgsConstructor@Target(ElementType.TYPE)@Retention(RetentionPolicy.SOURCE)public @interface AllArgsConstructor { String staticName() default ""; AnyAnnotation[] onConstructor() default {}; AccessLevel access() default lombok.AccessLevel.PUBLIC; @Deprecated @Retention(RetentionPolicy.SOURCE) @Target({}) @interface AnyAnnotation {}}모든 필드에 해당하는 매개변수를 갖는 생성자(all-args constru..