본문 바로가기

분류 전체보기

(80)
[2] 어떤 데이터 모델을 어떤 경우에 쓰면 좋을까? ✹ 데이터 모델이 중요한 이유: 해결하려는 문제를 어떻게 생각해야 하는지에 대해서도 영향을 미치기 때문 대부분의 애플리케이션은 데이터 모델간의 계층을 둬서 만든다. 하위 계층은 추상화 되어 있어 복잡성을 숨기고 효율적으로 일할 수 있게 한다. API 를 개발해서 인풋 아웃풋만 제공하고 내부 구조는 숨긴다거나 데이터 구조를 저장할 때는 범용 모델인 json, xml, 테이블, 그래프로 한다거나 json,xml,테이블,그래프 데이터를 디스크/메모리/네트워크 상태의 바이트 단위로 표현하는 방법을 결정해서 질의,처리 등을 할 수 있게 한다거나 이번 2장에서 할 것: 범용 데이터 모델 (관계형, 문서, 그래프기반) 비교 & 질의 언어 관계형 모델 vs. 문서 모델 관계형 데이터베이스(Relational Dateb..
[1] 데이터를 중심으로 하는 애플리케이션은 어떤 걸 생각해봐야할까? 데이터 중심 애플리케이션은 어떤 기능을 공통으로 필요할까? 데이터베이스 : 나중에 다시 데이터를 찾을 수 있도록 저장 캐시: 읽기 속도 향상을 위해 값이 비싼 수행 결과를 기억 검색 색인: 사용자가 데이터를 검색할 수 있는 기능 제공 스트림 처리: 비동기 처리를 위해 다른 프로세스로 메시지 보내기 일괄 처리: 주기적으로 대량의 데이터 분석 신뢰성, 확장성, 유지보수성 대부분의 소프트웨어 시스템은 신뢰성, 확장성, 유지보수성에 관심이 많다. 엔지니어링 관점에서 이 3가지를 어떻게 생각해야하는지 알려주겠다. (다음 장에서는 이를 잘 지키기위한 방법에 대해 말할 것이다.) 신뢰성 : 무언가 잘못되더라도 지속적으로 올바르게 동작해야한다. 올바르게 동작해야한다는 것은? 사용자가 기대한 기능을 수행해야 한다. 사용..
ListenableFuture 의 Callback Hell 해결하기 ※ 이 글은 정보 전달의 목적보다는 토비님의 강의를 참고하여 ListenableFuture 을 메소드 체이닝으로 리팩토링하는 과정 기록입니다. Future vs. ListenableFuture Future 멀티스레드 작업 시 사용하는 ExecutorService 에서 작업 결과를 받거나 기다리기 위해 Future 클래스의 future.get() 메소드를 사용했을 것이다. 하지만 get() 은 작업이 끝날 때 까지 blocking 되어 다음 라인으로 내려가지 못한다는 한계가 있다. ListenableFuture 하지만 ListenableFuture 은 가능하다! 비동기 프로그래밍 패턴으로 구현되어 있기 때문에 작업스레드! 너 끝나면 이 콜백메소드 실행해! 하고 던져주고 바로 다음으로 넘어가기 때문이다. 💡..
노리 형태소 분석기 이해하기 (2/2) 이 글은 ES 공식 블로그 공식 한국어 분석 플러그인 “노리” 내용 중 어떻게 형태소를 분석하는 가에 대해 중점을 둔 글이다. 공식 블로그를 먼저 읽어보고 이해를 돕기 위해 이 글을 읽는 것을 추천한다! (사실 노리라 쓰고 mecab 얘기를 더 많이했는지도 모른다😅) 버전 mecab-ko-dic-2.1.1-20180720 mecab-0.996-ko-0.9.1 2 더 좋은 분석임을 판단하는 기준 한국어형태소분석기 라는 명사구를 어떻게 분리하면 좋을까? 한국어 / 형태소 / 분석기 로? 아니면 한국어 / 형태 / 소분 / 석기 로? 사람이 보기에는 한국어 / 형태소 / 분석기 로 분리하는게 적절해 보인다. 한국어 / 형태 / 소분 / 석기 로 분리하기에는 뭔가 안어울리는 단어들끼리 붙어있다는 느낌이 들지 않..
노리 형태소 분석기 이해하기 (1/2) 노리는 Lucene 7.4 (= ElasticSearch 6.4) 부터 제공되는 ES 공식 한국어 형태소 분석기이다. 노리 가 만들어지기까지 어떤 과정을 거쳐왔는지 살펴보고, 다음글에서는 노리가 어떻게 문장에서 형태소를 분석하는지 알아볼 것이다. 노리가 세상에 나오기까지 💡 말뭉치가 뭐야? 도서관,1781,3535,2110,NNG,*,T,도서관,Compound,*,*,도서/NNG/*+관/NNG/* 이런거다. 예를 들면 형태소 분석기를 만든다고 할 때, “[도서관]은 일반명사인 [도서]와 일반명사인 [관]으로 분리돼” 같이 학습을 위해 필요한 데이터를 뜻한다. (노리는 81만개 이상) 영어로는 코퍼스(corpus) 라고 부른다. 1. 노리의 조상은 mecab 이라는 일본어 형태소 분석엔진이다. mecab ..
[후기] 도메인 주도 개발 시작하기 느낀 점 ① 도메인 주도적으로 개발을 하지 않아도 기능 구현은 할 수 있다. 하지만 도메인 주도 개발을 하는 궁극적인 이유는 코드 리팩토링을 하는 이유와 같다고 생각한다. DDD를 한다는 것은 - 애그리거트라는 이름으로 같은 역할을 하는 클래스끼리 군집화하는 것 - 금액을 표현하는 필드를 int 가 아닌 Money 클래스로 표현하는 것 - 도메인 로직은 응용 계층이 아닌 도메인 계층에 모아 응집도가 높이는 것 ... 등등 같은 원칙을 지켜가면서 개발을 하는 것인데 이는 코드를 이해하는 것이 보다 쉬워지고, OCP 원칙을 지킬 수 있기 때문이다. 그래서 새로 생성하는 프로젝트 뿐만이 아니라 기존 프로젝트에서 조금씩 조금씩 도메인 주도 개발화를 해보는 것도 괜찮을 것 같다. ② 애플리케이션을 역할에 따라 4..
Kafka-ui 설치하기 (Docker 말고) 환경 kafka: version 3.3.1, kraft 모드 kafka-ui: kafka-ui-api-v0.4.0.jar (도커 아니고 로컬에 설치) Java 13 버전 필요 kafka-ui 를 도커로 띄우려고 했으나 Caused by: [org.apache.kafka.common.errors.TimeoutException](http://org.apache.kafka.common.errors.timeoutexception/): Timed out waiting for a node assignment. Call: fetchMetadata 에러나서 jar로 띄움 설치 1. kafka-ui jar 다운 받기 2. java 13 설치하기 구성 application.yml kafka: clusters: - name..
[JPA] QueryDSL stream DB connection 에러 해결 과정 ② - @Transactional 버전 Spring Boot 2.7.4 QueryDSL 5.0.0 MySQL 5.7 이전 글 https://elsboo.tistory.com/40 [JPA] QueryDSL stream DB connection 에러 해결 과정 ① 버전 Spring Boot 2.7.4 QueryDSL 5.0.0 MySQL 5.7 DB 데이터를 가공해 카프카로 전송하는 애플리케이션을 만들면서 약 1주간 많은 난관에 봉착했고 많은 삽질을 했다. 어떤 에러가 있었고 어떻게 해결하였는 elsboo.tistory.com ② stream 데이터 사용 좀 해보려는데 forEach() 에서 Operation not allowed after ResultSet closed 에러… 결론 @Transactional 가 붙은 메소드는 메소드 종료..
[Docker] <none> image야 잘 가~! 도커에서 컨테이너 생성하는데 자꾸 에러가 나서 Dockerfile을 고치고 이미지 다시 생성하고 컨테이너 생성해보고 반복 삽질 중인 평화로운 나날이었다. 그런데 어느 순간 sudo docker images 를 쳐보니.. 누가 생성했는지도 모르는 : 이미지들이 증식되어있었다. 결론부터 말하자면 sudo docker rmi $(sudo docker images -f "dangling=true" -q) --force 필요없는 이미지이니 지워주면 된다. image가 뭔데요? : 이미지는 어떤 코드에서든 더 이상 참조되지 않는 이미지이다. docker build를 하거나 이미지를 pull했을 때 생겨난다. 현재 도커 이미지의 상황을 보면 IMAGE ID가 7184b27319b4 이고 이름이 test:0.1 인 이..
[JPA] QueryDSL stream DB connection 에러 해결 과정 ① 버전 Spring Boot 2.7.4 QueryDSL 5.0.0 MySQL 5.7 DB 데이터를 가공해 카프카로 전송하는 애플리케이션을 만들면서 약 1주간 많은 난관에 봉착했고 많은 삽질을 했다. 어떤 에러가 있었고 어떻게 해결하였는지에 대해 공유하고자 한다. ① stream() 으로 레코드 한 건씩 가져오는 건 줄 알았는데 왜 타임아웃이 나지!? 결론 .fetch().stream() 는 Java의 스트림, .stream() 은 DB의 스트리밍 방식이다! 에러 현상 쿼리 호출 대상인 tableA 테이블은 몇 십 만건의 데이터를 가지고 있다. 그래서 데이터를 한꺼번에 들고 오면 타임아웃이 나거나 메모리가 터질 수 있으므로 스트리밍 방식을 적용해 한 건씩 처리하기 위해 다음과 같이 구현을 하였다. publi..