Tiny Star

분류 전체보기 71

[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(..

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

[Oracle Cloud] 인스턴스 생성 자동화 (Out of host capacity)

나도 이제 최대 4CORE, 24RAM 무료 인스턴스를 생성할 수 있다는 설레는 마음으로 생성을 시도했다. Out of capacity for shape VM.Standard.A1.Flex in availability domain AD-1. Create the instance in a different availability domain or try again later.If you specified a fault domain, try creating the instance without specifying a fault domain. If that doesn’t work, please try again later.Learn more about host capacity.헛된 꿈이었음을...싱가포르(가입 ..

IT 2025.07.03

[Oracle Cloud] 오라클 클라우드 프리티어(Free Tier) 가입

서버를 구성하기 위해 가장 많이 알려진건 AWS 무료티어라고 생각한다. 옛날기억으로는 잘못된 설정으로 과금이 됐을지 온종일 조마조마하며 바라봤었다. 찾아보니 최근에도 과금되는 건 어쩔 수 없는 것 같다.알아보니 오라클 클라우드 무료티어는 설정에 따라 1~4대 서버를 제공하고 무료로 제공하는 것만 잘 체크하면 과금되는 일이 없는 것 같아서 사용해보기로 했다. 신중하게 도전하는 걸 추천한다. 필자는 이거저거 틀리고 계속 재시도하라고해서 다시했더니 너무 많은 시도로 막혔다. 몇 분뒤하면 되는데 다음 단계에서 또 시도횟수가 많다고 막히고... 얼마만큼의 간격으로 시도가 가능한지 모르므로 각 잡고 시도하자. 오라클 클라우드 무료 티어(Oracle Cloud Free Tier) 페이지에 접속해서 [무료로 시작하기..

IT 2025.07.02

[뉴스 요약] 로그인 구현 (Spring Security ,JWT Token)

전체 흐름프론트에서 로그인 요청(`login`)을 보내면 백엔드는 이를 처리해 `accessToken`, `refreshToken`을 발급하고, 클라이언트는 이를 저장한 뒤 홈 화면으로 이동합니다. 이후 홈 페이지에서 사용자 정보 요청(`me`)을 다시 보내 사용자 정보를 렌더링합니다. AuthController로그인 요청 처리@PostMapping("/login")public ResponseEntity login(@RequestBody LoginRequest request) { LoginResponse loginResponse = authService.login(request); return ResponseEntity.ok().body(loginResponse);}프론트에서 사용자 ID..

top