전체 글142 Redis 메모리 33% 줄인 캐시 키 재설계 목차계기: 행안부 건물관리번호 도입 → 캐시 키 개선 아이디어기존 문제: 호수별로 캐시가 분리되어 90% 중복 저장해결: 캐시 키를 건물관리번호 기준으로 변경 + Cache-Aside 패턴 적용결과: 캐시 건수 1/10 감소, 메모리 33% 절감1. 배경배송가능권역 조회 API는 고객 주소를 받아서 "이 주소로 새벽배송이 가능한가?"를 응답합니다.요청: "서울시 강남구 XX아파트 102동 1501호"응답: { deliveryType: "DAWN", regionCode: "A01" }매번 DB를 조회하면 느리니까 Redis에 캐싱하고 있었습니다.기존 캐시의 문제점은 알고 있었다캐시 키가 전체 주소 기반이라 같은 건물이어도 호수별로 캐시가 따로 저장되는 건 알고 있었습니다.delivery:region:서울시.. 2026. 1. 12. 인덱스 다 걸었는데 왜 안 타나요? - DocumentDB 개선기 목차사례 1: 복합 인덱스가 3/3 조건 매칭이 많지만 Planner가 단일 인덱스 선택했던 문제사례 2: 복합 인덱스 필드 순서 미스매칭으로 73% 문서 낭비사례 3: $or 연산자 → $in 변경 + 필드 순서 정렬원인: DocumentDB Query Planner 1.0의 Trial Execution 한계, Leftmost Prefix Rule, $or 비효율해결: 쿼리 패턴에 맞는 인덱스 설계 + 불필요한 단일 인덱스 삭제 + $or → $in 변경1. 배경어느 날 모니터링 대시보드에서 이상한 점을 발견했습니다.DB CPU 사용률이 피크 시간대에 60%를 찍고 있었습니다.쿼리 자체가 복잡한 것도 아닌데, 왜 이렇게 리소스를 많이 쓸까요?원인을 추적해보니, 인덱스가 분명히 있는데 제대로 활용되지 않.. 2026. 1. 2. [스프링] AOP와 JPA 트랜잭션 동작 방식 AOP란? AOP란 관점 지향 프로그래밍의 약자로 흩어진 관심사를 하나로 모듈화 한 것이다. OOP의 개념에서 더 확장된 개념이다. AOP를 구현하는 방법 1. AspectJ 2. Spring AOP AspectJ는 자바에서 제공하는 AOP 기술이다. 3가지 바이트 코드 위빙을 사용한다. 위빙이란? Aspect 를 대상 객체(Target)에 연결시켜 AOP 객체로 만드는 바이트 코드 및 객체 조작과정 1. Compile-time weaving: 소스 코드를 입력하고 클래스 파일을 생성한다. 2. Post-compile weaving: 컴파일 후 위빙, JAR와 클래스 파일을 위빙하는데 사용한다. 3. Load-time weaving: 클래스 로더가 클래스 파일을 JVM에 로드할 때까지 위빙이 연기된다. .. 2022. 11. 1. [자바] BigDecimal 클래스란? BigDecimal BigDecimal은 자바 언어에서 숫자를 정밀하게 다룰 수 있는 유일한 방법이다. 돈과 소수점을 다룰땐 BigDecimal을 반드시 써야한다. 불변 클래스라는 특징이 있다. BigDecimal은 다른 타입보다 상대적으로 느리다는 단점이 있다. 소수점을 저장할 수 있는 float, double은 정밀도가 정확하지 않아 정확한 값을 출력하지 못한다. double의 부정확함 자바는 IEEE 754 부동 소수점 방식을 사용해 정확한 실수를 저장하지 않고, 근사치 값을 저장하기 때문에 정확한 값이 저장이 안된다. 따라서 정수를 이용해 실수를 표현하는 BigDecimal을 사용해야 한다. BigDecimal의 변수 intValue: 정수 scale: 지수, 소수점 첫째 자리부터 0이 아닌 자리.. 2022. 10. 14. [자바] ConcurrentHashMap이란 무엇인가? ConcurrnetHashMap이란? ConcurrentHashMap이란 HashMap 클래서에서 보장하지 않는 Thread-Safe를 보장할 수 있도록 하는 클래스이다. ConcurrentHashMap은 읽기 작업에는 여러 쓰레드가 동시에 읽기가 가능하지만 쓰기 작업 시에는 특정 버킷에 대한 락을 사용한다는 것을 알 수 있다. public class ConcurrentHashMap extends AbstractMap implements ConcurrentMap, Serializable { public V get(Object key) {} public boolean containsKey(Object key) { } public V put(K key, V value) { return putVal(key, .. 2022. 10. 14. [자바] Hashmap의 동작 원리에 대해 알아보자 HashMap은 충돌 시 Separate Chaining 방식을 사용한다. Java 7 이전까지는 LinkedList 자료구조를 사용하고, Java 8 부터는 Red-Black Tree를 이용해 동작한다. 어떠한 차이가 있는지 알아보자. 해시 충돌이란? 두 개의 동일하지 않은 객체에 해시 함수를 적용했을때 서로 같은 값이 나와 Key 값이 충돌하는 경우를 말한다. 따라서 이를 해결하기 위한 두 가지 방법이 있다. Open Addessing Seperate Chaining Open Addressing 해시 버킷이 사용 중인 경우 다른 해시 버켓에 넣는 방식이다. Searate Chaining 이 방식은 충돌이 생기면 해시 버킷을 연결하여 해결하는 방식이다. 두 개의 방식 모두 최악의 경우 O(M)이 된다... 2022. 10. 14. [스프링] 동시성 문제를 처리하는 2가지 방법 스프링에서 발생할 수 있는 동시성 문제에 대한 해결 방법 3가지를 알아보자 목차 낙관적 락 비관적 락 낙관적 락 낙관적 락이란 자원에 락을 걸지 않고 동시성 문제가 발생했을때 처리하는 방법이다. 트랜잭션이 충돌하지 않는다고 가정하고, 만약 충돌이 된다면 롤백을 진행시킨다. DB단에서 동시성 처리하지 않고 제어권을 어플리케이션이 가지고 있다는 특징이 있다. 언제 사용할까? 충돌이 잘 일어나지 않는 트랜잭션 -> 락을 걸지 않기 때문에 성능이 좋다. 단점은 없나? 롤백이 발생할때 개발자가 수동으로 하나하나 처리해주어야 한다. Alice가 id 1번을 조회 Bob이 id 1번을 조회 Bob이 id 1번을 업데이트 후 커밋 Alice이 id 1번을 업데이트 시도했으나 이미 version이 달라졌기에 업데이트 쿼.. 2022. 10. 11. [스프링] 톰캣의 NIO Connector Connector란? 서블릿 컨테이너가 외부와 소통이 가능하게 하는 것을 말한다. 톰캣은 통신을 위해 자바의 IO 기술을 이용하는데 BIO와 NIO 기술이 있다. JAVA Blocking IO Blocking IO는 바이트 스트림을 기반으로 하며, 배열처럼 인덱스가 없고 단순한 데이터의 연속된 흐름이다. Blocking IO 작업을 하게 되면 해당 쓰레드가 진행하는 작업을 중지해야 한다. 따라서 클라이언트 별로 분리된 연결 쓰레드가 생성되야 한다. 그러나 갑자기 접속자가 많아질 경우 쓰레드 수가 늘어나게 된다. 쓰레드가 많으면 많을수록 CPU의 컨텍스트 스위칭이 늘어 오버헤드가 증가하게 되고, 성능에 악영향을 일으키게 된다. JAVA NIO Java.nio는 소켓 연결을 위한 비차단 API로 스레드 수에.. 2022. 10. 8. [스프링] Hibernate란 Hibernate란? Hibernate는 ORM 프레임워크 중의 하나이다. JPA 인터페이스의 구현체이며, JDBC API를 사용해 DB와 통신한다. JPA란? 자바에서 RDBMS를 사용하는 방식을 정의한 인터페이스이다. 구현체로는 Hibernate가 있다. JDBC란? JPA와 DB를 연결해주는 표준이다. RDBMS는 JDBC 인터페이스를 구현해 제공된다. JDBC 드라이버라고 부른다. 프로그래머는 어떤 종류의 RDBMS를 사용하더라도 똑같은 개발 방법으로 구현하면 된다는 장점이 있다. JPA의 장점 1. SQL 반복 작업을 하지 않아도 되기에 생산성이 올라간다. 2. 인터페이스가 제공되기 때문에 특정 벤더에 종속되지 않는다. 3. 객체와 RDBMS의 패러다임 불일치 문제를 해결해준다. JPA의 단점 .. 2022. 10. 8. [자바] JVM 설정 옵션 JAVA GC 알고리즘 튜닝 처리량 관점 -> Parallel GC 클라이언트 응답시간 관점 -> CMS GC, G1 GC Serial GC 32비트 JVM에서 돌아가는 싱글 쓰레드 어플리케이션에서 주로 사용한다. 실제론 거의 사용하지 않는다. Parallel GC Full GC 시 compact 작업이 수행되기에 GC 시간은 많이 든다. 하지만 처리량은 가장 많다. CMS GC compact 작업을 수행하지 않아 stop-the-world가 짧으나 자주 compaction이 발생할땐 오히려 시간이 더 걸릴 수 있다. 메모리 파편화의 단점 G1 GC 가장 성능이 우수한 GC로서 Java 9부터 default GC로 채택되었다. JVM 메모리 설정 메모리가 클땐 GC 발생 횟수 감소, 그러나 GC 수행 시.. 2022. 10. 8. [스프링] 히카리CP란? 우선 JDBC의 개념에 대해서 알아보자 JDBC란 자바에서 데이터베이스에 접속할 수 있도록 하는 API를 말한다. 커넥션 풀이란? 비용이 많이 드는 커넥션 연결 과정을 제거하기 위해 미리 커넥션을 생성해두고, 요청 시마다 연결한 커넥션을 통해 빠르게 DB에 연결한다. Hikari CP Spring Boot 2.0 이상부터 기본 제공 Hikari cp는 DB 커넥션 풀을 관리한다. JDBC의 커넥션 맺는 과정이 복잡하고 많은 자원을 소모하는 작업이기 때문이다. Hikari cp는 미리 정해놓은 커넥션만큼 풀에 담아놓고 요청 시 만들어진 커넥션을 연결한다. 제공되는 설졍 옵션 maxLifeTime: 커넥션이 커넥션 풀에 머무를 수 있는 시간 활성 커넥션은 관계없이 계속 연결된다. maxLifeTime의 값은.. 2022. 10. 7. TCP, Socket Timeout TCP Timeout TCP는 3 way-handshake로 연결, 이 작업이 수행되는 시간을 Connection Time이라고 한다. 이러한 연결 시간을 지정해야 하는데 이를 Connection Timeout이라고 한다. Socket Timeout 여러 패킷으로 데이터를 나누어 전송하게 된다. 각 패킷 간 시간의 차이가 나게 되는데 이 시간의 임계치를 Socket Timeout이라고 부른다. 두 가지 설정을 하지 않는다면 무한 대기가 될 수도 있다. 2022. 10. 7. 이전 1 2 3 4 ··· 12 다음