전체 글 167

[RabbitMQ] 기초 개념 - 2 (Work queues)

첫 번째 포스팅에서는 하나의 Producer가 하나의 Consumer에게 메시지를 전달하는 형태에 대해 정리했습니다. 이번에는 하나의 Producer가 여러개의 Consumer에게 메시지를 전달하는 형태에 대해 정리 하겠습니다. Round-robin dispatching Queue는 병렬화 할 수 있다는 장점이 있습니다. 즉, 같은 Queue의 Consumer에게 메시지를 균등 분배 할 수 있습니다. 또한 Consumer 갯수를 계속 추가하면서 쉽게 수평 확장이 가능합니다. 이 방식에서 모든 Consumer는 평균적으로 동일한 수의 메시지를 처리합니다. Message acknowledgment 특정 처리를 하다가 Consumer가 하나 죽으면, 해당 Consumer가 처리하던 메시지를 잃게됩니다.. 이를..

RabbitMQ 2022.04.08

[RabbitMQ] 기초 개념 - 1

RabbitMQ는 메시지 브로커입니다. AMQP 프로토콜을 구현하여씅며, 시스템 간 메시지를 전달해줍니다. 주로 사용하는 몇 가지 용어가 있는데, 해당 용어부터 정리해보겠습니다. - Producer : 메시지를 전송 - Consumer : 메시지를 수신해서 처리 - Queue : RabbitMQ안에 있는 큐. 메시지들은 큐 안에 저장 이해가 쉽게 이미지와 함께 보면 아래와 같습니다. 위 이미지에서는 단순하게 전송, 수신 2가지 기능이 있습니다. - 전송(Sending) Producer에서 큐로 메시지를 보냅니다. 과정은 간단히 다음과 같이 처리 됩니다. 1. Producer에서 RabbitMQ 연결 2. Producer에서 RabbitMQ로 메시지 전송 3. 전송 완료 후 연결 종료 - 수신(Receiv..

RabbitMQ 2022.04.01

[subList] Java.Util.ArrayList$SubList Deserialization 이슈 해결

Dto에서 선언한 List를 Service로직이나 Dao단에서 subList를 이용할 경우가 있습니다. 해당 subList를 통해 특정 길이로 잘라서 아래와 같이 사용하는 경우가 있었습니다. List dataList = new ArrayList(); dataList = dataList.subList(0,5); subList는 fromIndex, toIndex를 받아 해당하는 크기만큼 리스트를 반환합니다. 해당 값을 Redis로 캐싱할 때 아래와 같은 이슈가 발생했습니다. Redis deserialization error could not read JSON: cannot construct instance of ` Java util. ArrayList$SubList` subList로 자르면서 캐싱된 데이터 ..

Java 2022.03.30

[PostgreSQL] upsert 시 excluded 명령어

upsert 쿼리 시에 excluded 명령어에 대한 개념과 사용법을 정리해보겠습니다. - excluded 정의 기존의 파라미터 값을 그대로 사용할 때 사용. insert 에서 이용한 값을 재이용하고 싶을 때 excluded 키워드를 사용합니다. - 예시 INSERT INTO post (title, contents) values ('POST TITLE', 'POST CONTENTS') ON CONFLICT (title) DO UPDATE SET (contents) = (excluded.contents) 아래 excluded.contents 라는 것은 위에서 사용한 contents 값을 그대로 사용한다는 의미입니다.

Database 2022.03.25

STOMP에 대한 이해

STOMP란? (STOMP : Simple Text Oriented Messaging Protocol) STOMP는 메시지 전송을 효율적으로 하기 위한 프로토콜로, 기본적으로 Publish-Subscribe 구조로 되어있다. Publish-Subscribe 구조란 메시지를 공급하는 주체와 소비하는 주체를 분리해 제공하는 메시징 방법이다. 따라서 메시지를 전송하고 / 받아서 처리하는 부분이 확실하게 구조로 정해져있다. COMMAND key(header):value key(header):value ... BODY^@ COMMAND 리스트 - CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE, BEGIN, COMMIT, ABORT, ACK, NACK, DISCONNECT 참고 : http:/..

Spring 2022.03.14

QueryDSL StringTemplate 사용

* QueryDSL StringTemplate 사용 QueryDSL에서도 SQL Function 사용을 통해 쿼리를 간단하게 작성해야 할 경우가 있습니다. 이 경우 Expressions.stringTemplate() 혹은 Expressions.numberTemplate() 등을 통해 SQL Function을 사용할 수 있습니다. 이를 통해 Date cast, lower case 작성 등을 QueryDSL에서 쉽게 사용 가능합니다. Postgres에서 사용하는 간단한 예시 쿼리문을 몇개 살펴보겠습니다. 예시1) Date 추출 JPAQuery query = this.queryFactory.selectfrom(myTable) .groupby(Expressions.stringTemplate( "DATE_FORM..

Java 2022.02.23

[gUnicorn 이슈] WORKER TIMEOUT 에러

이번 글에서는 간단하게 에러 발생 원인과 해결 방안에 대해서 정리해보겠습니다. gUnicorn을 사용하여 Flask 서버를 구동 시 아래와 같은 에러가 발생하는 경우가 있습니다. [CRITICAL] WORKER TIMEOUT (pid:00000) 제가 겪은 위 에러가 발생한 상황에 대해서 정리하자면 다음과 같습니다. 1. DB 또는 다른 서버와의 통신이 불가할 경우 해당 경우는 다른 DB 또는 서버와 통신이 불가하여 Connection Timeout이 발생하였고, 이로 인해 gUnicorn에서도 Timeout이 발생한 경우였습니다. 위의 경우 Timeout이 발생하는 서버와의 통신을 허용해주면 됩니다. 2. Flask 구동 전 수행되는 로직이 너무 오래 걸릴 경우 저의 환경에서 gUnicorn의 Time..

ETC 2020.12.07

[NLP] Tokenizer에 대해

■ [NLP] Tokenizer에 대해 Tokenizer에 대해 간단히 정리해보겠습니다. ● Tokenization 먼저 Tokenization이 무엇인가에 대해 알아야 할 것 같습니다. 간단하게 말하면 Tokenization이란 Text를 여러개의 Token으로 나누는 것을 말합니다. 보통 공백, 구두점, 특수문자 등으로 이를 나누는데요. 그 방법에 따라 다양한 Tokenizer가 있습니다. ● Tokenization 그리고 이런 Tokenization을 하는 것을 Tokenizer라고 합니다. 간단한 예로 2가지의 Tokenizer를 보겠습니다. 1. nltk.tokenize의 word_tokenize from nltk.tokenize import WordPunctTokenizer target_sen..

AI/NLP 2020.12.01

[MyBatis] if와 foreach를 활용하여 동적 쿼리생성 (필터링 기능)

● MyBatis - if와 foreach를 활용하여 동적 쿼리 생성 MyBatis에서 if와 foreach를 활용하여 동적 쿼리를 생성하는 방법에 대해 정리하겠습니다. 그리고 이를 이용하면 간단한 검색 필터링 기능을 쉽게 구현할 수 있습니다. 이 내용에 대한 예제를 통해 간단히 정리해보겠습니다. ■ MyBatis에서의 if와 foreach 먼저 MyBatis에서의 if와 foreach에 대해 살펴보겠습니다. 이름 그대로 if는 조건문이며, foreach는 반복문에서 사용됩니다. 사용방법은 다음과 같습니다. 해당 조건에 참일 경우만 내부의 쿼리문이 더해집니다. {QUERY 문} 다음으로 foreach의 사용법은 다음과 같습니다. collection에는 전달받은 파라미터값이 들어가며, item은 실제 쿼리..

ETC 2019.12.18

[Linux Study-23] Linux Python 기본 버전 변경

● Linux Python 기본 버전 변경하기 Linux에서 기본 Python버전을 변경하는 방법을 간단히 정리하겠습니다. 여기서 예시는 2.7 버전을 3.6버전으로 변경하는 방법입니다. 먼저 현재 파이썬 버전을 확인합니다. [root@localhost ~]# python -V python 2.7.16 그 다음은 파이썬의 위치를 확인합니다. 아래 명령어를 사용하면됩니다. [root@localhost ~]# which python /usr/bin/python 위 경로는 실제 경로가 아니라 심볼릭 링크로 설정된 경로입니다. 정확한 위치를 확인하기 위해 해당 경로를 다리 ls로 살펴보면 다음과 같을거에요. [root@localhost ~]# ls -al /usr/bin/python usr/bin/python ..

Linux 2019.07.21