Tiny Star

분류 전체보기 74

[사용자 쿠폰] 이벤트 쿠폰 생성 (DB, Redis)

쿠폰 발급 테스트를 하기 전 사전 준비는 아래와 같다.테이블 생성(사용자, 이벤트, 쿠폰, 토큰, 발급이력) ✅ 이벤트 생성 API ✅Coupon Pool 생성 API ✅쿠폰 발급 API쿠폰 발급만 테스트할거라서 이벤트 및 쿠폰풀 API는 필요하지 않으나, "그래도 하는김에..!"라는 생각으로 만들었다. 이번 포스팅은 완료한 세 가지에 대해 가볍게 기록하려고 한다. 1. 테이블 생성-- 1) 사용자CREATE TABLE `user` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `email` VARCHAR(255) NOT NULL, `phone` VARCHAR(20) NULL, `status` ..

프로젝트/쿠폰 2025.08.22

[사용자 쿠폰] 기획

아직 Redis에 익숙하지 않아서 이걸 사용한 쿠폰 서비스를 새롭게 만들어보려고 한다. 리디북스에서는 알림을 받은 사용자 외에는 참여하지 못하는 이벤트가 있고, 알라딘은 알림을 받은 사용자만 적립금을 받을 수 있는 이벤트(?)가 있다. 이렇게 구독중인 회원에게만 쿠폰을 발급하는 경우가 있고 여기에도 트래픽이 몰리기 때문에 이 아이디어를 가지고 작은 프로젝트를 기획했다. 기존에 했던 프로젝트에선 쿠폰 발급을 누르면 모든 사용자가 발급이 가능했지만, 이번에는 알림을 받은 사용자가 해당 알림으로 접속해야지만 쿠폰 발급이 가능하도록 만들 것이다. 목표알림에 포함된 링크로 진입한 사용자만 쿠폰 발급 가능링크 공유·재사용·위조 방지동시성 높은 상황에서도 중복 발급 없이 빠르게 처리 핵심서명 토큰: 알림 링크에 ..

프로젝트/쿠폰 2025.08.14

[SpringBoot/JSP] 다국어 처리

한영 변환 기능 관련 얘기가 나왔다. 내가 하게 되는지는 확정되지 않았지만...예전에 타임리프 태그로는 언어 변환을 해본 적이 있다. 반면 JSP에서는 해본 적이 없어서 이번 기회에 정리해보려고 한다. 이번에는 단순히 한/영만 고려하지 않고, 확장성을 위해 다국어로 생각해봤다.일단 간단하게 떠올려본 방식은 아래 네 가지다. 1. properties에 정리하고 JSTL `` 태그로 변환 (예: `message_ko.properties`, `message_en.properties`) 2. 언어별 별도 데이터베이스 사용 (예: `mariadb://../project1_kr`, `mariadb://../project1_en`) 3. 언어별 별도 테이블 분리 (예: `project.table1_kr`, `proj..

IT 2025.08.08

[Spring Batch] Cursor vs Paging

Spring Batch를 사용해 대용량 데이터를 처리할 때 가장 먼저 고민해야 할 것은 데이터를 어떻게 읽을 것인가라고 생각한다.이때 많이 사용되는 두 가지 방식이 바로 Cursor 기반과 Paging 기반인데, 두 방식의 동작 방식, 장단점을 정리해봤다. 1. Cursor 기반JDBC의 ResultSet을 활용하여, DB에서 쿼리 1번으로 결과셋을 열어두고, 그 결과를 한 줄씩 순차적으로 읽는 방식 동작 방식`JdbcCursorItemReader`가 쿼리를 단 1번 실행DB는 결과를 계산한 뒤 커서(cursor) 를 열고 기다림Spring Batch가 `read()`를 호출할 때마다 한 줄씩 커서를 통해 받아옴메모리에는 항상 1~2개의 row만 존재@Beanpublic JdbcCursorItemRea..

IT 2025.07.25

[Spring] @Transactional 이 일어나지 않는 경우

"트랜잭션이 일어나지 않는 경우"에 대해서 설명해달라는 질문을 받았다.트랜잭션 메서드 안에 트랜잭션 메서드가 있는 경우에는 작동하지 않는다는 건 알고 있었는데, 알고 있는 것조차 대답을 못할정도로 충분히 숙지되어있지 않다는 걸 느껴 다시금 정리해보려고 한다. 1. 자기 자신을 호출하는 경우 (self-invocation)@Servicepublic class MyService { @Transactional public void methodA() { this.methodB(); // 프록시를 거치지 않아 @Transactional 무시됨 } @Transactional public void methodB() { userRepository.save(new U..

IT 2025.07.23

[뉴스 요약] Cloudflare 해외 국가 차단 (러시아 트래픽 발생)

Cloudflare로 트래픽을 확인해보니 24시간 내에 러시아에서 300건 가까이 되는 요청이 온 것을 확인했다. 세부 정보를 보니 HTTP로 계속 접근을 시도중인 것 같다. 비정상 접근 예방1. HTTPS 요청만 허용 Always Use HTTPS: HTTP로 들어온 요청을 자동으로 HTTPS로 리디렉트Automatic HTTPS Rewrites: 리소스 내 HTTP 링크도 자동 HTTPS로 변환 이렇게 하면 브라우저가 강제로 암호화 연결(TLS) 사용하게 되므로, 중간자 공격(MITM), 비정상적인 봇 요청 대부분은 차단되거나 무력화됩니다. 2. 방화벽 설정Cloudflare WAF에서 `ip.src.country ne "KR"`→ 차단(Block) 설정 시 KR(대한민국) 외 국가에서 들어오는..

[Cloudflare Tunnel] 우리집 IP 노출 없이 노트북을 연결해보자

왜 Cloudflare Tunnel을 알아보게 되었을까?처음에는 Oracle Cloud Free Tier로 서버를 구성해보려 했다. 하지만 예상치 못한 문제가 있었는데, "Out of host capacity" 에러가 2주 넘게 지속되면서, 언제쯤 VM을 생성할 수 있을지 알 수 없었기 때문에 마냥 기다릴 수만은 없었다. [관련 글 보기]그래서 대안을 고민하다가, 내부 서버를 직접 구축해보기로 했다. 라즈베리파이도 고려했지만 추가 비용이 들어 부담이 되었고, 결국 기존에 사용하던 노트북을 서버로 활용해보기로 했다.하지만 여기에도 문제는 있었는데, 외부에서 접속하려면 내부 IP를 노출하고 포트를 개방해야 하기 때문에 보안 측면에서 불안했다.그러던 중 Cloudflare Tunnel을 알게 되었고, 이걸 이..

IT 2025.07.16

[SpringBoot] Entity 객체 반환 오류 (SerializationFeature.FAIL_ON_EMPTY_BEANS)

SerializationFeature.FAIL_ON_EMPTY_BEANS 오류aused by: cohttp://m.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->io.github.news..

오류 2025.07.08

[SpringBoot] response.getCharacterEncoding() 문자(한글) 깨짐

log4j2 + LoggingFilter 로 로그 작업 중 한글 깨짐이 발생했다. response 인코딩을 보니 UTF-8로 별도 지정이 안되어있어서 기본값인 ISO-8859-1로 설정되어 있다. @PostMapping("/login")public ResponseEntity login(@RequestBody LoginRequest request) { LoginResponse loginResponse = authService.login(request); return ResponseEntity .status(HttpStatus.OK) .contentType(new MediaType(MediaType.APPLICATION_JSON, StandardCharse..

오류 2025.07.05

[SpringBoot] No appenders present in context [default] for logger [org.jboss.logging].

SLF4J 에러 org.springframework.boot spring-boot-starter-log4j2 org.apache.logging.log4j log4j-core 2.25.0...이렇게 log4j 의존성을 추가하고 최종적으로 `No appenders present in context [default] for logger [org.jboss.logging].` 로그를 마주했다. SLF4J(W): Class path contains multiple SLF4J providers. SLF4J(W): Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@4034c28c] SLF4J(W): Found provide..

오류 2025.07.04
top