꽥블로그
최신 글
-
Jackson 직렬화 시 > 기호가 깨질 때 원인과 해결법
Jackson 직렬화 시 > 기호가 깨질 때 원인과 해결법
2025.03.30문제 상황API 응답에서 특수문자가 Unicode escape 형태로 내려오는 현상이 있었다. 예를 들어, > 기호가 \u003E로 바뀌는 경우가 해당된다. 디버깅 시에는 >로 보이지만, 실제 응답에서는 인코딩된 문자처럼 보이는 이유와 해결방법을 정리해보았습니다. 예시public class Product { @JsonProperty("description") private String description = "1 > 0";}디버깅 출력 : 1 > 0 (그대로)JSON 응답 : 1 \u003E 0 원인 분석디버깅 : 단순 문자열 표시라 > 그대로 보임JSON 직렬화 : Jackson 등 직렬화 도구에서 보안 목적으로 이스케이프 처리> 에서 \u003E 로 보임 : , & 등은 XSS 방지 .. -
공통 쿼리 재사용을 고려한 랜덤 추출 쿼리 작성 방법 (Oracle + MyBatis)
공통 쿼리 재사용을 고려한 랜덤 추출 쿼리 작성 방법 (Oracle + MyBatis)
2025.03.23최근 프로젝트에서 조건에 맞는 카테고리 중 랜덤으로 하나씩 상품을 뽑고, 조건에 맞는 나머지 상품을 추가로 추출하여 총 n개를 만드는 쿼리를 작성할 일이 있었다. 단순히, union all 로 처리할 수 있지만, 중복 상품, 조건 필터링, MyBatis와의 연동 등을 고려하다 보니 쿼리가 점점 길어졌다. 이 글에서는 Oracle에서 중복을 피하면서 효율적인 쿼리를 작성하고, MyBatis XML에서 공통 쿼리를 재활용하는 방법을 소개한다. 처음 작성한 쿼리 처음에 간단하게 각각 하나씩 뽑고 UNION ALL 로 붙이면 될 줄 알았다. 하지만 이 방식은 조건에 맞는 데이터를 추출하면서 쿼리 중복과 중복된 결과 처리 문제가 발생했다.반복되는 UNION ALL 쿼리를 효율적으로 관리하고, MyBatis에서 .. -
kakao_n진수 게임
kakao_n진수 게임
2025.01.26N진수 게임튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다.숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.이렇게 게임을 진행할 경우,0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, …순으로 숫자를 말하면 된다.한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는0, 1, 1, 0.. -
웹 브라우저 요청 흐름
웹 브라우저 요청 흐름
2025.01.06URI vs URL vs URNURI는 Locator, name 을 분류할 수 있다. 즉, 자원을 식별하는 역할을 수행한다.URL = 리소스 위치URN = 리소스 이름 예를 들면 URN:ISBN:8960777331 도서 책 ISBN에서 사용하는 유즈케이스이다. 하지만, URN 이름만으로는 실제 리소스를 찾는데 방법이 보편화되어있지는 않다. 그래서 거의 대부분 URL을 사용한다고 생각하면 된다. 일반적으로 URL 분석은 아래 포맷을 따르게 된다. scheme://[userinfo@]host[:port][/path][?query][#fragment] 형태를 가지게 된다. scheme - 어떤 프로토콜을 사용할지 결정한다. userinfo - URL에 사용자정보를 포함해서 인증한다. host - 도메인명을 .. -
알림 시스템 설계
알림 시스템 설계
2024.12.15알림 시스템 설계 개요알림 시스템은 이벤트, 선물 중요할 만한 정보를 비동기적으로 제공한다. 알림 시스템은 단순히 모바일 푸시 알림에 한정되지 않는다. 1단계 문제 이해 및 설계 범위 확정대상은 푸시 알림, SMS 메시지, 그리고 이메일이 될 수 있다. 실시간 시스템임을 감안한다. 지원하는 단말은 iOS 단말, 안드로이드 단말, 그리고 랩톱/데스크톱이다.지원 알림 유형: 푸시, SMS, 이메일성능 특성: 연성 실시간(soft real-time) 시스템, 높은 부하 시 약간의 지연 허용사용자 설정: opt-out 기능(사용자가 알림을 받지 않도록하는 기능) 지원중요한건 확장성을 고려해 천만 건의 모바일 푸시 일림, 백만 건의 SMS 메시지, 5백만 건의 이메일 보낼 수 있어야 한다. 단말 토큰페이로드알.. -
RxParallelRunner 소개
RxParallelRunner 소개
2024.12.02소개앱에서 대량의 데이터를 읽거나 분석하는 작업은 처리 속도가 느리면 사용자 경험에 부정적인 영향을 미칠 수 있다. 이것을 최근에 겪어서 성능 처리에 대한 고민이 깊어졌다. 우선.. RxParallelRunner 이 남용되서 사용되었던 점이 문제였다. 이번 기회에 RxParallelRunner 를 다뤄서 제대로 사용해보고자 한다! 대규모 데이터를 병렬로 처리하는 앱 개발 중, 다음과 같은 문제에 직면할 수 있다.1. 작업 속도 문제- 처리해야할 데이터가 커지면 작업이 느려진다. 2. 자원 관리 문제- 작업이 많아질경우 스레드 수 증가로 GC가 과도하게 발생될 수 있다.3. 스레드 관리 문제- 모든 과하면 탈난다. 스레드가 과도하게 생성되면 비효율적이다. RxParallelRunner 란?RxParall.. -
Internal, external gateway 에 대해서
Internal, external gateway 에 대해서
2024.11.25아래 그림은 서버와 클라이언트가 API Gateway를 통해 통신하는 구조를 보여주는데 처음 보면 다소 복잡해 보일 수 있지만, Gateway는 이 과정을 효율적으로 관리해 준다. API Gateway는 내부 서비스 간 통신을 담당하는 Internal Gateway와 외부 클라이언트 요청을 처리하는 External Gateway로 나누게 되는데, 이번 글에서는 이를 알아보려 한다. API Gateway: MSA 환경에서 External Gateway와 Internal Gateway 차이모놀리틱 구조에서는 모든 컴포넌트가 하나의 애플리케이션 안에서 동작했었다. 통신 레이어가 필요하지 않았고, 변경 시 시스템 전체에 영향을 미치곤했었다. 그래서 이를 해결하기 위해 MSA(Microservices Archit.. -
몽고디비 인덱스 정리
몽고디비 인덱스 정리
2024.11.03인덱싱 소개인덱스를 사용하지 않은 쿼리를 컬렉션 스캔이라고 한다. 인덱스를 선택할때는 자주 사용되는 열을 적용하는것이 효과적이다. 예를들어, 자주 중복되지 않은 ID나 이메일 컬럼에 인덱스를 설정하면 좋다. 인덱스 생성인덱스가 생성된 후에 아래와 같이 쿼리해보면 executionTimeMillis 가 1s로 쿼리 시간을 단축시켜준다. 하지만, 인덱싱은 필드를 변경하는 쓰기 작업은 오래 걸린다. 데이터가 변경될때 도큐먼트만 아니라 모든 인덱스를 갱신해줘야 하기 때문이다. (인덱스는 필드의 순서값을 유지하기 때문이다.) 복잡한 인덱스 소개아래 쿼리는 email 로 정렬한 후에 name으로 정렬한다. 우리가 미리 만들어둔 name으로 정렬하는건 크게 도움이 되지 않는다. 정렬을 최적화하기 위해서는 email,.. -
Kubernetes
Kubernetes
2024.10.27Kubernetes란?Kubernetes는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식할 수 있고, 확장 가능한 오픈소스 플랫폼으로, 선언적 구성과 자동화를 모두 지원한다.Traditional Deployment : 초기 조직은 애플리케이션을 물리 서버에서 실행했다. 한 물리 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 없었기에, 리소스 할당의 문제가 발생했다.Virtualized Deployment: 그 해결책으로 가상화가 도입되었다. 이는 단일 물리 서버의 CPU에서 여러 가상 시스템 (VM)을 실행할 수 있게 하였다. 가상화를 사용하면 VM간에 애플리케이션을 격리하고 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스 할 수 없으므로, 일정 수준의 보안성을 제공할 수 있다.. -
ConcurrentHashmap 동시성 처리 방법
ConcurrentHashmap 동시성 처리 방법
2024.10.13ConcurrentHashMap 이란?Java의 동시성을 지원하는 HashMap의 변형이다. 여러 스레드가 동시에 데이터에 접근하고 수정할 때 발생할 수 있는 문제를 해결하기 위해 설계된 자료구조이다. 기본적으로 Java 의 HashMap은 스레드에 안전하지 않기 때문에 여러 스레드가 동시에 접근할 경우 데이터 무결성이 깨질 수 있다. HashTable/Synchronized Map 은 전체 lock 을 걸어 사용하고 있기 때문에 thread-safe 한 면은 있지만 성능 오버헤드를 발생시킨다. 세그먼트라는 작은 해시 테이블 여러 개를 만들어서 관리한다. 위 그림을 보면 보다 명확하게 알 수 있다. HashMap, Synchronized 는 synchronized 키워드로 HashMap 메서드를 래핑해..
모든 글
-
Jackson 직렬화 시 > 기호가 깨질 때 원인과 해결법
Jackson 직렬화 시 > 기호가 깨질 때 원인과 해결법
2025.03.30문제 상황API 응답에서 특수문자가 Unicode escape 형태로 내려오는 현상이 있었다. 예를 들어, > 기호가 \u003E로 바뀌는 경우가 해당된다. 디버깅 시에는 >로 보이지만, 실제 응답에서는 인코딩된 문자처럼 보이는 이유와 해결방법을 정리해보았습니다. 예시public class Product { @JsonProperty("description") private String description = "1 > 0";}디버깅 출력 : 1 > 0 (그대로)JSON 응답 : 1 \u003E 0 원인 분석디버깅 : 단순 문자열 표시라 > 그대로 보임JSON 직렬화 : Jackson 등 직렬화 도구에서 보안 목적으로 이스케이프 처리> 에서 \u003E 로 보임 : , & 등은 XSS 방지 .. -
공통 쿼리 재사용을 고려한 랜덤 추출 쿼리 작성 방법 (Oracle + MyBatis)
공통 쿼리 재사용을 고려한 랜덤 추출 쿼리 작성 방법 (Oracle + MyBatis)
2025.03.23최근 프로젝트에서 조건에 맞는 카테고리 중 랜덤으로 하나씩 상품을 뽑고, 조건에 맞는 나머지 상품을 추가로 추출하여 총 n개를 만드는 쿼리를 작성할 일이 있었다. 단순히, union all 로 처리할 수 있지만, 중복 상품, 조건 필터링, MyBatis와의 연동 등을 고려하다 보니 쿼리가 점점 길어졌다. 이 글에서는 Oracle에서 중복을 피하면서 효율적인 쿼리를 작성하고, MyBatis XML에서 공통 쿼리를 재활용하는 방법을 소개한다. 처음 작성한 쿼리 처음에 간단하게 각각 하나씩 뽑고 UNION ALL 로 붙이면 될 줄 알았다. 하지만 이 방식은 조건에 맞는 데이터를 추출하면서 쿼리 중복과 중복된 결과 처리 문제가 발생했다.반복되는 UNION ALL 쿼리를 효율적으로 관리하고, MyBatis에서 .. -
kakao_n진수 게임
kakao_n진수 게임
2025.01.26N진수 게임튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다.숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.이렇게 게임을 진행할 경우,0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, …순으로 숫자를 말하면 된다.한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는0, 1, 1, 0.. -
웹 브라우저 요청 흐름
웹 브라우저 요청 흐름
2025.01.06URI vs URL vs URNURI는 Locator, name 을 분류할 수 있다. 즉, 자원을 식별하는 역할을 수행한다.URL = 리소스 위치URN = 리소스 이름 예를 들면 URN:ISBN:8960777331 도서 책 ISBN에서 사용하는 유즈케이스이다. 하지만, URN 이름만으로는 실제 리소스를 찾는데 방법이 보편화되어있지는 않다. 그래서 거의 대부분 URL을 사용한다고 생각하면 된다. 일반적으로 URL 분석은 아래 포맷을 따르게 된다. scheme://[userinfo@]host[:port][/path][?query][#fragment] 형태를 가지게 된다. scheme - 어떤 프로토콜을 사용할지 결정한다. userinfo - URL에 사용자정보를 포함해서 인증한다. host - 도메인명을 .. -
알림 시스템 설계
알림 시스템 설계
2024.12.15알림 시스템 설계 개요알림 시스템은 이벤트, 선물 중요할 만한 정보를 비동기적으로 제공한다. 알림 시스템은 단순히 모바일 푸시 알림에 한정되지 않는다. 1단계 문제 이해 및 설계 범위 확정대상은 푸시 알림, SMS 메시지, 그리고 이메일이 될 수 있다. 실시간 시스템임을 감안한다. 지원하는 단말은 iOS 단말, 안드로이드 단말, 그리고 랩톱/데스크톱이다.지원 알림 유형: 푸시, SMS, 이메일성능 특성: 연성 실시간(soft real-time) 시스템, 높은 부하 시 약간의 지연 허용사용자 설정: opt-out 기능(사용자가 알림을 받지 않도록하는 기능) 지원중요한건 확장성을 고려해 천만 건의 모바일 푸시 일림, 백만 건의 SMS 메시지, 5백만 건의 이메일 보낼 수 있어야 한다. 단말 토큰페이로드알.. -
RxParallelRunner 소개
RxParallelRunner 소개
2024.12.02소개앱에서 대량의 데이터를 읽거나 분석하는 작업은 처리 속도가 느리면 사용자 경험에 부정적인 영향을 미칠 수 있다. 이것을 최근에 겪어서 성능 처리에 대한 고민이 깊어졌다. 우선.. RxParallelRunner 이 남용되서 사용되었던 점이 문제였다. 이번 기회에 RxParallelRunner 를 다뤄서 제대로 사용해보고자 한다! 대규모 데이터를 병렬로 처리하는 앱 개발 중, 다음과 같은 문제에 직면할 수 있다.1. 작업 속도 문제- 처리해야할 데이터가 커지면 작업이 느려진다. 2. 자원 관리 문제- 작업이 많아질경우 스레드 수 증가로 GC가 과도하게 발생될 수 있다.3. 스레드 관리 문제- 모든 과하면 탈난다. 스레드가 과도하게 생성되면 비효율적이다. RxParallelRunner 란?RxParall.. -
Internal, external gateway 에 대해서
Internal, external gateway 에 대해서
2024.11.25아래 그림은 서버와 클라이언트가 API Gateway를 통해 통신하는 구조를 보여주는데 처음 보면 다소 복잡해 보일 수 있지만, Gateway는 이 과정을 효율적으로 관리해 준다. API Gateway는 내부 서비스 간 통신을 담당하는 Internal Gateway와 외부 클라이언트 요청을 처리하는 External Gateway로 나누게 되는데, 이번 글에서는 이를 알아보려 한다. API Gateway: MSA 환경에서 External Gateway와 Internal Gateway 차이모놀리틱 구조에서는 모든 컴포넌트가 하나의 애플리케이션 안에서 동작했었다. 통신 레이어가 필요하지 않았고, 변경 시 시스템 전체에 영향을 미치곤했었다. 그래서 이를 해결하기 위해 MSA(Microservices Archit..