본 글에서는 메시지의 저장과 소비만을 다룬다.- keyword: topic, partition, offset, partitioner, segment, clean-up policy들어가며이벤트는 키-밸류 구조로 되어있는, 무슨 일이 일어났는지에 대한 사건의 기록이다.사건을 기록하고 꺼내어봄으로써 각 어플리케이션의 요구에 맞게 특정한 행동을 수행할 수 있다.키는 기록에 대한 구분자로, 어떤 user 가 될 수도 있고, 번호가 될 수도 있다. 하나의 키에 여러 가지 사건이 발생될 수 있으므로 유니크할 필요도 없고 반드시 있어야만 하는 것도 아니다. 이 키에 대한 내용을 밸류로 갖고, 이벤트 메시지는 사실 키-밸류와 함께 타임스탬프, 메타정보인 헤더를 갖는다. 이벤트는 하나의 기록이므로 당연히 변경되지 않는다...
빅오표기법: 시간 복잡도를 효율적으로 나타내기 위한 표기법 탄생배경 어떤 알고리즘을 "22단계의 알고리즘"과 같은 식으로 표기하는 방식은 원소수가 달라질 때마다 몇 단계가 필요한지 달라지기 때문에 부적절하다. 또한 "N개의 원소가 있을 때 선형 검색에 N단계가 필요하다"와 같은 표기는 너무 길다. O(N): 데이터 원소가 N개일 때 알고리즘에 몇 단계가 필요한지 표기 빅오표기법은 최악의 경우를 상정해 표기한다. 위의 표기는 선형검색에서 최악의 경우를 고려하여 표현한 것이다. 빅오표기법은 "데이터 원소가 N개일 때 알고리즘에 몇 단계가 필요할까?"에 대한 답을 표현한 것이다. 그에 대한 답은 "알고리즘에 N단계가 필요하다"는 것이다. O(1): 가장 빠른 알고리즘 유형 = 상수 시간을 갖는 알고리즘 읽기는..
오늘 한 것 1. 면접준비 2. 모의면접 3. 코딩테스트 배운 것 1. stream 내에서 if 문 사용하는 방법: 중괄호 활용 List nameList = Arrays.stream(split) .map(name -> { String[] nameArr = name.split(" "); if (nameArr.length > 2) { return nameArr[0].substring(0, 1) + nameArr[1].substring(0, 1); } else { return nameArr[0].substring(0, 1); } }) .collect(Collectors.toList()); 2. 필터와 인터셉터 - 오늘 모의면접 중, 필터와 인터셉터의 차이에 대해 질문했는데 이 질문에 대답을 못했다. 간단히 아..
오늘 한 것 1. 코딩테스트 연습 배운 것 1. Array, List 2. 프로세스, 스레드 3. Wrapper 클래스 1. - 컬렉션 프레임웤 데이터 집단을 저장하는 클래스들을 표준화한 설계 컬렉션 인터페이스: Collection(List, Set), Map 컬렉션 클래스: ArrayList, HashMap, ... - List 순서가 있는 데이터의 집합 데이터의 중복을 허용한다 -- ArrayList 배열의 저장공간을 처음부터 지정해야 한다 더 큰 공간이 필요하면 새로운 더 큰 배열을 생성해서 기존 배열의 내용을 복사하여 새로운 배열에 저장한다 메모리 상에 연달아 공간을 확보한다 첫 번째 위치만 알면, index로 상대적 위치를 빠르게 찾을 수 있다 Vector는 스레드 세이프하기 때문에 멀티 스레드..
Wrapper 클래스란? 기본형을 객체로 포장하는 것 기본형: char, boolean, int, byte, short, double, float, long 참조타입으로 변환되므로, 주소를 저장하게 된다(equals 사용) 언제 사용되는가? 메소드의 파라미터로 객체 타입만이 요구되는 경우 클래스의 장점 - 클래스에 포함된 메소드를 활용하는 경우 제네릭의 사용 박싱 & 언박싱 박싱: 기본형을 Wrapper 클래스로 변환할 때 사용 Integer num = new Integer(1); 언박싱: Wrapper 클래스를 기본형으로 변환할 때 사용 int n = num.intValue(); 오토박싱 & 오토언박싱 위처럼 직접 쓰지 않고 바로 대입해도 박싱/언박싱이 이뤄진다 오토박싱: Integer num = 1;..
Join - inner join: 교집합 예시: A, B 테이블에 모두 존재하는 데이터 중, A 테이블 기준 기간이 긴 데이터 찾기 SELECT * from animal_ins A left join animal_outs B on A.animal_id=B.animal_id where A.datetime > B.datetime order by A.datetime - outer join: 합집합 예시: A, B 테이블 중 B 테이블에만 존재하는 데이터 찾기 SELECT B.animal_id, B.name from animal_ins A right outer join animal_outs B on A.animal_id=B.animal_id where A.animal_id is null If / case when..
오늘 한 것 티끌 ver.2 - 네이버 쇼핑 API 붙이기 모의 면접 레디스를 사용한 이유는? 레디스 말고 다른 것도 있는데 레디스를 사용한 이유는 무엇인가? pub/sub란 무엇인가? OAuth2가 작동하는 프로세스에 대해 설명해보라 구글 토큰을 별도로 저장하지 않았는지? - 별도 저장을 통해 자동 로그인을 구현할 수 있다 @Autowired 어노테이션에 대해 설명해보라 스프링의 기본 동작 프로세스에 대해 설명해보라 싱글톤은 어떻게 유지되는지? - 인스턴스를 static으로 만들어서 유지 배운 것 예를 들어 UserService에서 BoardRepository를 참조해야 할 일이 생긴다. 이것은 옳은 방식일까? 두 가지로 나눌 수 있을 것 같다 한 번만 호출하는 경우: Repository를 바로 호출하..
1. SRP 단일책임원칙 Single Responsibility Principle * 한 클래스는 하나의 책임만 가져야 한다. -> 변경이 있을 때 파급효과가 적어야 한다. 2. OCP 개방-폐쇄원칙 Open/Closed Principle * 확장에는 열려 있으나, 변경에는 닫혀 있어야 한다. * 다형성을 활용하여, 인터페이스를 구현한 새로운 클래스를 만들어서 새로운 기능을 구현했다고 해보자. 이때, 서비스 단에서는 아래와 같은 코드를 작성하게 된다. MemberRepository mp = new MemoryMemberRepository(); 그런데, mp를 new JdbcMemberRepository();로 바꾸어야 한다면? DIP를 위반하게 되고, 변경에 열려 있는 것이 되어 버린다. -> 이것을 해..
통계 스케쥴러 구현 - 내가 아낀 이력 월별 통계 구현 Scheduler 선정 이유 일정 시간에 정해진 일을 수행하는 데는 batch, quartz, scheduler가 있다. - batch: 여러 job을 순차적으로 처리. 보다 규모가 큰 경우 사용 - quartz, scheduler: 특정 job을 특정 시간에 처리. 단, quartz는 클러스트링 등 세부적인 조작이 가능하지만 구현이 복잡하다. 단순히 통계만을 위한 작업이므로, scheduler를 사용하기로 했다. * scheduler는 스프링부트 스타터에 기본적으로 포함되어 있어 새로 주입할 필요가 없다. 고려해야할 것 * 서버 시간과 로컬 시간이 다를 수 있음 * cron 표현 방식 * 사람이 없는 시간대에 작동시켜야 함(ex. 새벽 5시) *..
- Total
- Today
- Yesterday
- jinja2
- 자바의정석
- GIT
- 제어자
- IOC
- 고민
- 상속
- clean-up policy
- 몽고db
- ManyToMany
- MVC
- overfatching
- 스프링부트
- 패키지
- controller
- 단항연산자
- bean
- 배열
- DI
- OneToMany
- ManyToOne
- toCharArray
- Java
- 항해99
- 서버환경
- ORM
- 임포트
- AssertJ
- ResetController
- AfterEach
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
