
상용 DB를 막 만져봤던 뉴비 시절에 "우리 서비스의 데이터베이스는 HA 구조야" 라는 말을 들었었다. 그 당시에는 아무것도 몰라서 "오 상용서비스에서는 이렇게 구성하는구나"하고 넘어갔었다. 몇 년이 지난 지금, 그 기억을 곰곰이 떠올려보니 HA는 구조가 아니라 High Availability, 고가용성을 말하는 것이었다. 고가용성은 구조를 의미하는게 아니라, 예상치 못한 중단 없이 지속적으로 운영될 수 있는 능력을 의미하는 개념이다. 데이터베이스의 고가용성을 보장하기 위해 여러 가지 이중화 전략이 사용된다. 이중화는 단순히 하나의 시스템이 고장나더라도 다른 시스템이 그 기능을 대신할 수 있도록 구성하는 것이다. 전회사에서는 DB 고가용성을 제공하기위해서 Active/StandBy 구조를 사용하고 있..

작년 말에 Aurora MySQL 5.7 버전의 지원 종료와 연장 지원 안내를 받았었다.https://aws.amazon.com/ko/blogs/korea/your-mysql-5-7-and-postgresql-11-databases-will-be-automatically-enrolled-into-amazon-rds-extended-support/ 요약하면 권장 사항인 MySQL 8.0 대신 MySQL 5.7 버전을 계속 사용할 경우 돈을 더 내라는 내용이었다. 올해 전반기 내내 다사다난해서 지금껏 미뤘다가 이제서야 업데이트를 시작할 여유가 생겼다. 버전 업데이트에 앞서 문제 상황을 확인해보자. 1. 연장 지원 비용비용이 저렴하다면 그냥 둬도 될 것 같다. 그런데 연장 지원 비용을 계산해보면 다음과 같다...

정말 오랜만에 Elasticsearch 관련 글을 쓰는 것 같다. 데이터를 생성하는 모델이 변경되어서 기존 데이터를 싹 마이그레이션 할 일이 생겼다. 가장 편한건 데이터를 싹 만들어두고 서버가 보는 index를 변경하는 것이었지만, 그럼 서버의 재배포가 필요하다. 그래서 그냥 index를 새로하나 만들고 두 index를 교체하는 방식으로 작업을 진행하려고 했다. 불행하게도 두 index를 교체하는 방식은 따로 제공하지 않았고, copy to 하는 형식의 reindex를 제공했다. 사용법은 간단하다. POST _reindex { "source": { "index": "from index" }, "dest": { "index": "to index" } } 이렇게 요청했을 때 바로 동작했으면 참 좋았겠지만, ..

테스트를 하다보면 key로 사용하고 있는 Auto Increment 값이 아래와 같이 계속 증가하다 못해 차이가 나서 보기 싫은 경우가 있다. 이러다보면 FE 팀원에게 이게 맞는 상태냐고 연락을 자주 받게 된다. 어... 네 맞는상태긴한데, 내가 보기에도 이상하다. 이런 문제는 간단한 쿼리문 하나로 해결이 가능하긴하다. ALTER TABLE your_table_name AUTO_INCREMENT = 6; 매번 수동으로 해줘야해서 불편하긴 하지만 비정상적으로 큰 간격을 보지 싫으면 테스트 후에는 정리하는 겸 해서 한번 입력하는게 좋은 것 같다.

이전 글에서는 QueryDSL을 왜 도입하려했는지, 왜 선택했는지 다른 툴과 비교 분석을 해봤다. 이번 글은 스프링부트에 어떻게 설치하고 사용할지 작성해보려 한다. build.gradle plugins { id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' ... } dependencies { implementation "com.querydsl:querydsl-jpa:5.0.0" implementation "com.querydsl:querydsl-apt:5.0.0" ... } def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDi..

SI 회사에서 일할 무렵엔 항상 MyBatis만 사용했었다.(생각해보니 현재 기준으로 반년도 안지났다.) JPA를 사용하자고, 사용해보자고 자주 이야기했지만 결국 도입에 실패했던 기억이 있다. ㅠ 그런데 이직한 곳도 막 서비스가 런칭한지 얼마 안됐음에도 MyBatis를 쓰고 있었다. 하지만 여긴 JPA 도입을 권장해줘서 JPA를 사용해볼 수 있었는데, 사용하면서 마음에 들지 않는 부분들이 보이기 시작했다. 가장 큰 문제점이라 생각하는건 쿼리가 복잡해지면 JPQL이란걸 사용해야 했다. 아래는 JPQL의 예시다.public interface HistoryRepository extends JpaRepository { @Query("SELECT h FROM UserActivity h WHERE h.tim..

이전 글에서 사용했던 Cosine Search는 dense vector 하나만을 이용한 방법이었다. 그래서 내가 조금 더 다양한 정보를 갖고 있을 때, 이를 전부 활용하기 어렵다는 단점이 있다. 예를 들어, 내가 알고 있는게 게시물의 제목, 내용, 작성자, 작성 시간 등 몇 가지의 정보가 있음에도 게시물의 제목만 활용할 수 있다는 것이다. 모든 내용을 한문장에 섞어서 하나의 벡터화를 할 수도 있겠지만, 이럴 경우 엄밀히 말하면 각각을 비교한 결과가 아니게 된다. 이렇게 다양한 정보를 활용하기 위해서 Elasticsearch에서는 K-NN search 기능을 제공한다. 이를 이용해 검색 기능을 Springboot로 구현해봤다. 대략적인 구현은 cosine search에서 구현한 방식을 따라가려고 한다. 그..

작은 프로젝트로 텍스트 기반 검색 기능을 구현할 일이 생겼다. 처음에는 너무 막연했는데 Elasticsearch에서 텍스트 유사도 검색이라는 기능을 제공하는 것을 알게되었다. https://www.elastic.co/kr/blog/text-similarity-search-with-vectors-in-elasticsearch 벡터 필드를 사용한 Elasticsearch의 텍스트 유사도 검색 Elasticsearch 7.3 릴리즈에서는 벡터를 사용하여 문서 점수를 매기는 기능을 제공합니다. 이 게시물에서는 텍스트 임베딩과 벡터 필드를 사용하여 유사도를 검색하는 방법을 살펴봅니다. www.elastic.co 이 문서를 기반으로 Elasticseach cloud + Springboot를 이용해 검색 기능을 구현..
- Total
- Today
- Yesterday
- serverless
- 람다
- AWS EC2
- AWS
- ChatGPT
- docker
- JWT
- ecs
- 후쿠오카
- Spring
- springboot
- GIT
- terraform
- java
- elasticsearch
- EKS
- Kotlin
- S3
- cache
- 티스토리챌린지
- object
- AOP
- 오블완
- 후기
- 스프링부트
- OpenAI
- CORS
- lambda
- Log
- CloudFront
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |