본문 바로가기

분류 전체보기

(212)
동적 프로그래밍 - 예제 1번째 문제 https://leetcode.com/problems/unique-morse-code-words/ 알파벳에 해당되는 모스 부호가 있고, 특정 단어가 인풋으로 들어오면 해당 단어를 모스부호로 변경을 한 후 , 중복되지 않은 문자가 몇개인지 return 시키는 문제다. public int uniqueMorseRepresentations(String[] words) { List morse = List.of(".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."); Lis..
카프카의 내부 동작 원리와 구현 내부 동작 원리 - 리플리케이션 - 리더와 팔로워의 역할 - 리더에포크와 복구 동작 카프카 리플리케이션 고가용성 분산 스트리밍 플랫폼인 카프카는 데이터 파이프라인들의 메인 허브 역할을 하는데, 이 카프카가 문제가 생겨 전체 파이프라인에 영향을 미치면 심각한 문제가된다. 따라서 일시적인 장애가 발생하더라도 안정적이게 서비스 할 수 있게 리플리케이션 동작을 하게 됐다. 리플리케이션 동작 카프카는 브로커가 장애 나도 안정적인 서비스를 제공함. 이 리플리케이션 동작을 위해 토픽 생성시 replication factor 옵션 설정 어떻게 동작을 하는지 알아보자. 예제에서는 토픽을 하나 생성하고, (파티션 1, 리플리케이션 팩터 3) describe 로 상세보기를 했다. 그럼 파티션 0에 리더는 브로커1, 리플리케..
동적 프로그래밍 동적 프로그래밍 이란? DP는 문제에 대한 모든 경우의 수를 효율적으로 탐색하는 프로그래밍 패러다임. 1. 문제를 원래 문제의 더 작은 중첩 하위 문제로 나눈다. 2. 중첩 하위 구조에서 최적 솔루션이 형성될수있다. (작은 단위에서 문제를 해결할 솔루션 찾는걸 말하는듯?) 이 두가지 특성을 좀 더 자세히 봐보자. 피보나치 수열 - DP 를 설명하는 고전적인 예다. 앞의 두 수를 더하면 다음 수열이 나오는구조. 피보나치 수 f(n) 이 있다면 작은 하위 문제로 나눌수 있다. f(n-1) , f(n-2) 그럼 f(n-1) , f(n-2) 이 하위 문제에서 솔루션을 찾고 f(n-1) + f(n-2) 로 f(n) 을 구할수있다. 핵심은 작은 단위로 잘라서 거기서 해결책을 찾자 DP 알고리즘 구현 방법 1. bo..
[실전 카프카 개발부터 운영까지] 카프카 기본 개념과 구조 카프카의 기본 개념과 구조를 보고, 카프카의 처리량을 높이기 위해 설계된 분산 시스템, 페이지 캐시, 배치 전송을 본 후 주키퍼 역할도 봐보자. - 카프카 기본 개념 구조 - 분산 시스템 - 페이지 캐시 - 배치 전송 리플리케이션 각 메시지들을 복제해서 클러스터내 브로커들에 분산시킨다. 브로커가 하나 종료 되더라도 안전하게 유지 가능. --partition 1, --replication-factor 3 replication-factor 는 몇개의 리플리케이션을 유지할지 의미다. 3이면 원본을 포함한 복제본이 3개가 있다는 뜻. (토픽의 파티션이 복제되는것.) 복제 수가 크면 안전하긴 하지만, 리소스를 많이 사용한다. 3일 경우가 꽤 안정적이었다. 파티션 하나의 토픽이 한번에 처리할수있는 한계 때문에 하나..
Local cache Cache 데이터를 미리 복사해 놓는 임시 장소다. Ehcache ehcache 는 빠르고 단순하다. 하이버네이트나 mybatis 에서 제공하는 기본 캐시. ehcache 는 카페인 캐시 보다 많은 기능이 있다. 분산 처리, 등등.. 분산 캐싱을 통해 수평 확장이 가능해진 부분.. 물론 저 테라코타 서버가 먼저 배포가 되어야 함. caffeine cache 카페인 캐시는 아주 고성능의 로컬 캐시다. Guava Cache의 최적화되고 강화된 로컬 캐시라고 할 수 있다. 스프링 5에서도 Guava Cache를 포기하고 Caffeine 을 로컬 캐시로 사용한다. Concurrent hash map, Guava 보다 성능이 빠르다. 카페인 캐시는 왜 빠를까? 캐시는 적중률이 중요하다. 캐시 제거 전략이나, 캐시..
동작 파라미터화 코드 전달하기 동작 파라미터화 코드 전달하기 요구사항은 항상 바뀌게 된다. 비용을 최소화 하면서 변화의 대응하는게 좋다. 동작 파라미터화를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응 할 수 있다. 동작 파라미터화란 아직 어떻게 실행할지 결정되지 않은 코드 블록을 의미한다. 즉, 코드 블록의 실행이 나중으로 미뤄진다. 동작 파라미터 책에서의 예제는 Predicate 를 이용해서 설명 하고 있다. Predicate 는 true, false 를 반환하는 함수 전략패턴을 쓰고 있는데 ApplePredicate 인터페이스를 구현한 여러 클래스를 두고 클래스에서는 필터링할 조건들을 return 시키고 있다. filterApples 라는 메소드에서 전략에 맞게 클래스를 구현해서 쓰는 방식이다. 즉 filterApples 의 ..
자바 8,9,10,11 1.1 역사의 흐름은 무엇인가? 자바 8에서는 대대적인 변화가 있었다. 멀티코어 CPU 대중화 같은 하드웨어 변화가 자바 8에 영향을 미쳤다. 자바 8이 등장하기 전에는 코어를 활요하려면 스레드를 사용하는것이 좋았지만, 스레드는 관리하기 어렵고 많은 문제가 생길 수 있다. 자바는 이런 병렬 실행 환결을 쉽게 관리하고 에러가 덜 발생하는 뱡향으로 변경되려 노력했다. 자바1.0 에서는 스레드 와 락, 메모리 모델까지 지원했었는데 이런 저수준 기능들을 활용하긴 어려웠다. 자바 5에서는 스레드 풀, 병렬 실행 컬렉션 등 강력한 도구들이 나왔고 자바 7에서는 병렬에 도움을 줄 수 있는 포크, 조인 등이 나왔지만 여전히 활용하기 어려웠다. 자바 8에서 단순한 방식으로 병렬실행을 할 수 있는 방법을 제공했다. 자바 ..
AOP AOP AOP의 등장 배경과 스프링이 도입한 배경을 알아야한다. 스프링에서 가장 인기 있는 AOP 적용 대상은 바로 선언적 트랜잭션 기능이다. 서비스 추상화를 통해 해결했던 트랜잭션 경계설정 기능을 AOP를 이용해 변경 할 수 있다. 트랜잭션 코드의 분리 UserService에 트랜잭션을 추가했었는데, 트랜잭션 코드가 추가된건 아쉬운 느낌이다. 하지만 논리적으로 비즈니스 로직 전후에 있긴 해야된다. 이 로직들을 클래스로 분리를 시킬 수 있다. 트랜잭션 담당 클래스와 비즈니스 로직 클래스 둘로 나뉘어서 사용하는 곳에서 트랜잭션 클래스를 호출 후 트랜잭션 클래스에서 비즈니스 로직을 호출해서 공존시킬 수 있다. public class UserServiceTx { private UserService userSe..