Backend
-
[DB] 커버링 인덱스, 실행 계획 Using indexBackend/개발 2023. 9. 11. 01:25
작년에 작성했던 인덱스로 조회 시 개선되는 성능 확인해 보기 에 이어서, 이번에는 실행계획을 확인하고, 커버링 인덱스가 사용되는 쿼리는 어떤 것인지 좀 더 정리해보려고 한다. 기본 개념 및 특징 예전에 정리했던 인덱스 개념 https://github.com/kang-jisu/dev-study-log/blob/main/background/database/%EC%9D%B8%EB%8D%B1%EC%8A%A4.md 인덱스 insert, update, delete (Command)의 성능을 희생하고 select(Query)의 성능을 향상시킨다. 데이터 파일이 있는 디스크에 직접 접근하지 않고, 메모리 저장소 내(인덱스) 안에서 최대한 해결하면서 성능을 개선할 수 있다. 클러스터드 인덱스 물리적으로 데이터가 정렬되어..
-
[Kotlin] Kotest, mockkBackend/공부,개념 2023. 9. 3. 17:50
코틀린 스타일 테스트코드 기존에 사용하던 Junit, AssertJ, Mockito를 이용해서도 테스트코드를 작성할 수 있지만, 중괄호를 활용한 코틀린 dsl 스타일을 적용하기 쉽지 않은데 kotest와 mockk(코틀린에서 사용하는 mocking라이브러리)를 이용하면 Mocking이나 assertion 과정에서 Kotlin dsl이나 infix를 사용해 조금 더 코틀린스럽게 테스트코드를 작성할 수 있다. Kotest 코틀린 진영에서 가장 많이 사용되는 테스트 프레임워크 코틀린 DSL을 활용해 테스트코드를 작성할 수 있다. 다양한 테스트 레이아웃(StringSpec, FunSpec, BehaviorSpec 등 ) 제공 Kotlin DSL 스타일의 Assertion 기능 제공 # kotlin dsl이란 D..
-
[Kotlin] DSL (Domain Specific Language) 이란Backend/공부,개념 2023. 7. 18. 23:41
DSL Domain Specific Language 특정 과업, 영역에 초점을 맞추고 그 영역에 필요하지 않은 기능을 없앤 영역 특화 언어 ex) SQL, 정규식 SQL 문장을 실행할 때 클래스나 함수를 선언하는 것부터 시작하지 않고, 모든 SQL 문장은 첫 키워드가 수행하려는 연산의 종류를 지정하고, 각 연산은 처리해야 할 작업에 맞춰 각각 서로 다른 문법과 키워드를 사용한다. 범용 프로그래밍 언어 컴퓨터로 풀 수 있는 모든 문제를 충분히 풀수있는 기능을 제공 ex) C, C++ 언어 DSL의 특징 선언적 선언적이다 명령적(범용 프로그래밍 언어) 어떤 연산을 완수하기 위해 필요한 각 단계를 순서대로 정확히 기술하는 명령적 언어와는 달리, 선언적 언어는 원하는 결과를 기술하기만 하고 세부 실행은 언어를 ..
-
[Monitoring] APM, Spring Boot Actuator, micrometerBackend/공부,개념 2023. 5. 24. 03:18
서버 모니터링에 사용되는 기술/개념들을 하나씩 찍먹 해보아야겠다. 다른 블로그나 공식 문서에 아주 잘 나와있어서 나는 대략 개념만 이해할 정도로 적으려고 한다 @_ @ APM(Application Performance Management/Monitoring) : 애플리케이션 성능 관리 / 모니터링 어느 구간에서, 어느 사용자가, 어떤 애플리케이션 사용 중 어느 과정에서 문제가 생긴 것인지를 신속하게 탐지하는 것이 중요함 APM 구성 APM은 Agent / Repository Server / Application Server로 구성됨 Agent : 웹 서버에 설치되어 데이터를 수집한 뒤 Repository Server : Agent에서 데이터를 전송하거나 Agent서버로 pull하여 데이터를 받아감 App..
-
Local Cache, Rate LimiterBackend/공부,개념 2023. 4. 15. 21:51
Local Cache vs Global Cache Local Cache 서버마다 캐시 따로 저장 로컬 서버 장비의 리소스 이용 (Memory, Disk) 서버 내에서 작동하므로 속도가 빠름 (네트워크를 타지 않음) 코드 내에서 Map에 넣고 꺼내오는 방식과 유사하다. (직접 로컬캐시를 구현한다면ConcurrentHashMap) 분산 시스템에서 데이터 정합성이 깨질 수 있다. ex) Caffeine Cache, Ehache Global Cache 여러 서버에서 캐시 서버에 접근하여 참조 서버간 데이터 공유 가능 네트워크 트래픽 이용 데이터 분산하여 저장 (Master / Slave, Sharding) ex) Redis 출처 Local Cache, Global Cache 차이 Guava Cache Googl..
-
[Kotlin] Collection, 함수, 람다, 기타 ..Backend/코틀린 2023. 3. 26. 22:15
출처 - 인프런 자바개발자를 위한 코틀린 입문 강의 https://www.inflearn.com/course/java-to-kotlin CH15. 배열과 컬렉션 배열 val array = arrayOf(100, 200) for (i in array.indices) { println("${i} ${array[i]}") } for ((idx, value) in array.withIndex()) { println("${idx} ${value}") } array.plus(300) 인덱스 가져오기 : array.indices 인덱스랑 값 같이 가져오기 : array. withIndex() 배열에 값 추가하기 : array.plus Collection 코틀린은 불변, 가변을 지정해주어야한다. (기본은 불..
-
[Kotlin] 클래스, 상속, 접근제어, objectBackend/코틀린 2023. 3. 20. 17:10
출처 - 인프런 자바개발자를 위한 코틀린 입문 강의 ( 9~14강 ) https://www.inflearn.com/course/java-to-kotlin CH9. 클래스를 다루는 방법 코틀린에서는 필드를 만들면 getter와 setter를 자동으로 만든다. 필드 하나를 프로퍼티라고 부름 코틀린에서는 주 생성자가 필수임 custom getter, setter를 만들 수 있음 생성자 class Person { val name: String, var age: Int, } { init { // 가장먼저호출 if (age < 0) { throw new Exception() } } constructor(name: String): this(name, 1){ println("첫번째 부 생성자") } } 부생성자보다는 ..
-
헥사고날 아키텍처 공부중..Backend/공부,개념 2023. 3. 6. 01:43
쓰면서 정리하고 있어서 좀 더 보완해서 다시 수정할 예정 레이어드 아키텍처 인터페이스를 통해 의존성을 낮춘다고 해도, 데이터 액세스 계층이 변경되었을 때 비즈니스 로직 계층의 클래스가 데이터 액세스 계층에 존재하는 인터페이스를 의존하기 때문에 영향을 받을 수밖에 없다. 데이터 액세스 인터페이스의 위치 데이터 액세스 계층에 존재 항상 하위 계층에 의존해야함 애플리케이션 -> 비즈니스 로직이 핵심임 프레젠테이션, 데이터 액세스 계층을 저수준영역이라 하고 비즈니스 영역을 고수준영역이라고 하는데 레이어드 아키텍처의 규칙에 따르면 고수준 영역이 저수준 영역에 의존하게 되는 상태 DIP를 이용해 데이터 액세스 계층에서 정의한 인터페이스 위치를 비즈니스로직 계층으로 이동시켰음. 데이터 액세스 계층의 구현체는 비즈니스..