Backend
-
헥사고날 아키텍처 겉핥기, 예제 코드Backend 2023. 12. 13. 10:01
헥사고날 아키텍처 (Hexagonal Architecture) 란? 헥사고날 아키텍처는 비즈니스가 독립적일 수 있도록 하는 아키텍처이다. 내부에서 외부로 나가는 의존성없애고 테스트를 용이하게한다. 도메인 코드가 바깥으로 하는 어떠한 의존성도 없어야한다. 내가 생각하는 장점 테스트코드 짜기가 좋다. ( 의존성을 덜어냈으므로 ) 유스케이스가 잘 보여 원하는 코드를 찾기 쉽다. 병렬로 작업이 가능하다. ( 도메인 쪽에서는 충돌이 날 수 있긴할 것 같다.. ) 계층 구조의 단점을 꽤나 보완한다. ( 계층 생략, 유스케이스 숨김, 병렬 작업 어려움, 테스트코드 짜기 힘듦, DB주도 설계 유도 등 ) 내가 생각하는 단점 제대로 구현하기가 너무 어렵다. 유스케이스별로 구분하기에 클래스가 많이 생긴다. 처음 접하게 되..
-
Cache Stempede 알아보기Backend 2023. 10. 28. 00:48
Cache Stempede ? 캐시 만료 시점에 많은 요청이 동시에 올 경우 DB 에 부하를 주는 현상을 말한다. 당연하지만 Hot Key 에서 주로 발생한다. ex) Redis Cache 사용중에 TTL 로 인해 만료된 데이터에 1000건의 요청이 동시에 온다면 RDB 에 1000건의 READ 가 발생하고 그 이후 Redis 에 1000건의 WRITE 가 발생하게 된다. 간단하게 여러 해결 방법 소개 1. 한 개의 요청만 처리할 수 있도록 한다. -> 디바운스, Lock 등으로 DB 요청이 한 번만 갈 수 있도록 해준다. * 단점 : 처리되는 한 개의 요청 외의 요청들의 레이턴시가 증가하면서 일시적인 병목이 생길 수 있다. 2. 키를 더 상세하게 나누기 -> 키 전략을 더 상세하게 가져가면서 부하를 줄..
-
템플릿 콜백 패턴으로 redisson 분산락 구현하기 (feat. Trailing Lambdas)Backend/Kotlin 2023. 9. 18. 21:04
분산 락은 대부분 redisson pub/sub 을 이용해 구현한다. ( 인프라가 갖춰져 있다면 ) 여기서는 분산 락에 대해 설명하지않고 넘어가겠다. 분산 락을 구현하는 코드를 살펴보자 나는 이 코드를 보고 바로 AOP 나 전략 패턴이 떠올랐다. 그래서 처음에 AOP 로 구현해 보려고 어노테이션으로 키 값을 파싱 하는 법 이런 걸 찾아보다가 마켓컬리에서 이미 글을 써놓은 것을 보았다. 역시 내가 떠올렸다면 누구든 떠올렸겠지 .. https://helloworld.kurly.com/blog/distributed-redisson-lock/ 풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson 어노테이션 기반으로 분산락을 사용하는 방법에 대해 소개합니다. helloworld.kur..
-
Kafka Consumer Group 알아보기Backend/Kafka 2023. 9. 10. 00:37
Consumer Group ? Consumer 이 묶여있는 그룹을 의미한다. Consumer Group 의 특징 - Consumer Group 별로 offset 을 관리한다. * offset 이란 파티션 내에서 데이터의 위치를 표시하는 유니크한 숫자이다. 내부 토픽을 통해 관리한다. - Consumer Group 은 동일 그룹내의 Consumer 가 문제가 생길 시 동일 그룹의 다른 Consumer 가 역할을 대신 수행할 수 있다. 이를 리밸런싱이라고 한다. ( Consumer Group 별로 offset 을 관리하므로 가능 ) - Consumer Group 의 Consumer 수는 Topic 의 Partition 수를 넘지 못한다. Partition 의 개수 >= Consumer Group 내의 Con..
-
JVM 개념 정리Backend 2023. 8. 20. 00:47
JVM 개념을 정리해보고자 한다. 1. JVM ? JVM (Java Virtual Machine) 이란 자바를 OS 에 독립적으로 실행할 수 있는 환경을 제공하는 소프트웨어이다. JVM 은 JRE (Java Runtime Environment) 에 포함되어 있다. JRE -> JVM + Library JDK -> JRE + Development Kit 2. 실행과정 1 - 자바 파일 (.java) 이 자바 컴파일러(javac) 에 의해 바이트 코드 (.class) 로 변환된다. 2 - Class Loader 가 변환된 바이트코드들을 로드하고 Runtime Data Area (JVM 메모리) 에 적재된다. 3 - Execution Engine 에 의해 Runtime Data Area 에 적재된 바이트 코드..
-
[DataBase] JPA에서 인덱스 사용하기 (Mysql)Backend/DataBase 2022. 7. 7. 02:47
이번 포스팅에서는 인덱스 사용하는 방법에 대해 정리해보려고 한다. 인덱스( Index )란? 인덱스는 조회(Query)에 대한 성능을 향상시키기 위한 자료구조이다. 대부분 사람들이 설명하길 책 앞에 목차를 두는 것으로 설명한다. + 중복되는 값이 적은 컬럼일수록(카디널리티 값이 높을수록) 좋은 성능을 발휘할 수 있고, 데이터를 변경하는 것에 있어서는 성능을 저하시킬 수 있다. Mysql에서의 인덱스는 B-tree 알고리즘으로 되어있다. B-tree 알고리즘으로 된 인덱스가 동작하는 방식은 밑의 이동욱님의 블로그를 참고하기 바란다. https://jojoldu.tistory.com/243 [mysql] 인덱스 정리 및 팁 MySQL 인덱스에 관해 정리를 하였습니다. MySQL을 잘 알아서 정리를 한것이 아..
-
[DataBase] 커넥션 풀(Connection Pool)을 사용하는 이유Backend/DataBase 2022. 6. 17. 01:21
커넥션 풀(Connection Pool)이란 무엇이고, 사용하는 이유는 무엇인지 알아보자. 우선 커넥션(Connection)을 알아봐야한다. 커넥션(Connection)이란 DB Connection을 의미하는데, 데이터베이스를 사용하기위한 연결을 의미한다. 그런데 이 커넥션을 획득해오는 것이 조금 복잡한데, 쉽게 설명하면 DB에 접속해서 아이디와 패스워드를 통해 인증하여 DB가 사용가능한 상태가 커넥션을 얻어오는 것이라고 생각하면 되겠다. 바로 위에서 커넥션을 획득하는 것은 복잡한 일이라고 했다. 그런데 추상화된 JdbcTemplate이나 JPA가 아닌 순수 JDBC를 통해 DB 접근하는 코드를 작성해 본 적이 있다면 어떤 작업을 할 때마다 직접 커넥션을 생성하고 획득한 후 SQL을 날릴 수 있다는 것을..
-
[Spring Security] Annotation으로 편리하게 인증된 사용자 조회하기Backend/Spring 2022. 6. 10. 16:03
프로젝트에서 로그인된 사용자를 조회하는데, " Annotation으로 편리하게 조회할 수는 없을까? " 라는 생각이 들어서 찾아보니 역시 Spring Security에서 제공하는 기능이 있었고 이를 활용해서 구현해보았다. Spring Security에서 제공하는 @AuthenticationPrincipal 라는 Annotation이 있다. 나는 Annotation을 사용하는 방법을 설명할 것이고, 자세한 동작 원리는 참고한 블로그를 밑에 남겨놓을 테니 보기를 바란다. 우선 이 Annotation을 사용하기 위해서는 SecurityContext에 인증된 객체가 존재해야한다. ( SecurityContextHolder에서 Context를 가져와서 setAuthentication이 되어있어야 한다. ) @Au..