전체 글

· Web Project
1. 형태소 분석기란?형태소 분석기는 문장을 의미 있는 최소 단위로 쪼개는 도구입니다. 본문에서 다룰 내용은 한국어 형태소 분석기입니다.영어와 달리 한글은 조사, 어미 등의 문법이 존재하고 맥락에 따라 의미가 달라지기 때문에 더 복잡한 형태소 분석기가 필요합니다. 예를 들어, '나는 학교에 간다'라는 문장을 형태소로 쪼개면 아래와 같아집니다.나 (대명사) 는 (조사) 학교 (명사) 에 (조사) 가 (동사) ㄴ다 (어미)2. 형태소 분석기를 사용하는 이유각 포털 사이트의 뉴스 기사를 기반으로 키워드를 추출해서 '이슈 키워드'를 찾아내려면 정해진 기준이 필요합니다.'키워드가 한 번의 기사에 얼마나 등장했는가' 또는 '몇 개의 기사에 등장했는가' 등이 기준이 될 수 있을 것입니다. 그러나 하나의 기사에도 수많..
· Web Project
1. 문제 정의스케줄러를 통해 들어오는 실시간 인기 검색어 목록 중, 같은 주제지만 단어나 어미 같은 것들이 달라서 다른 값으로 취급하게 되는 문제가 발생했습니다.예를 들어, '이진숙 체포 사건'과 '이진숙 경찰 체포'는 같은 주제를 다루고 있지만, equals가 아니기 때문에 같은 키워드로 취급하지 않습니다. 이렇게 '이진숙'이라는 하나의 키워드를 다루는 게시판이 2개, 3개씩 생기는 것이 UX를 해친다고 판단했습니다.2. 문제 해결가장 먼저 생각난 방법은 새로운 키워드 목록이 들어왔을 때, 기존 키워드들 간에 '문자열 유사도'를 측정하고 일정 Treshold 값이 넘으면 같은 값으로 취급하는 것이었습니다.이를 위해 여러가지의 문자열 유사도 알고리즘을 조사했습니다.2-1. 레벤슈타인 거리레벤슈타인 거리..
1. 문제 상황사용자가 content를 수정하는 시나리오는 아래와 같습니다.텍스트 변경새로운 이미지 추가기존(수정 전) 이미지 삭제기존 이미지 삭제하고 새로운 이미지 추가이 시나리오에서 1번과 2번은 정상적으로 동작하나 3번과 4번 상황에서 수정사항이 DB에 반영되지 않는 문제가 발생했습니다. 2. 문제 원인이미지 삭제라는 중복되는 행위가 있었으므로, 이미지 삭제 로직 위주로 살펴봤습니다.@Transactionalpublic void deleteImageByIdList(List imageId) { // S3에서 이미지 삭제 List s3Keys = imagesRepository.findS3KeyByIdIn(imageId); s3Service.deleteByS3KeyList(s3Keys);..
· Web Project
1. Gemini 사용 이유현재 게시판에 접속하게 되면, 보이는 화면입니다.게시판 이름을 통해 어느 정도는 인기 검색어인 이유를 유추할 수 있지만, 보다 정확한 이유를 사용자에게 안내해주기 위해 AI 요약 기능을 추가하기로 했습니다.2. 사용할 AI 모델 선정결과적으로 GEMINI 모델을 사용하기로 택했습니다.단순한 내용 요약을 위해 사용하기 때문에 고성능의 AI가 필요하지 않다.GEMINI는 flash-lite라는 아주 저렴하지만 똑똑하진 않은 모델을 제공하고 있습니다.실시간 인기 검색어이기 때문에 검색 기능을 탑재한 AI가 필요하다.이후에 알게된 사실이지만, 검색 기능을 활성화 할 경우 무료 한도 내에서 사용할 수 있는 횟수가 현저히 적어집니다.따라서 이 부분은 '네이버 뉴스 API'로 대체했습니다...
1. 옵티마이저(Optimizer)CPU가 컴퓨터의 두뇌 역할을 하는 것처럼 옵티마이저는 DBMS의 두뇌 역할을 하는 소프트웨어입니다.개발자가 SQL을 작성하고 실행하면, 가장 먼저 옵티마이저라는 곳에서 "최적의 쿼리 실행 계획"을 수립합니다.위 그림과 같이 옵티마이저는 규칙 기반 옵티마이저와 비용 기반 옵티마이저로 나뉩니다.1-1. 규칙 기반 옵티마이저 (RBO)규칙 기반 옵티마이저는 말 그대로 규칙을 세워놓고 무조건적으로 이 규칙을 따라가는 방식입니다.예를 들어, "인덱스가 있으면 인덱스를 사용하라"와 같은 규칙이 있다면 다른 상황은 고려하지 않고 인덱스를 사용하는 방식을 채택합니다.과거에는 옵티마이저가 실행 비용을 예측하는 능력이 그다지 좋지 않아, 이러한 방식을 주로 사용했습니다. (1990년대 ..
1. 문제 상황프로덕트 환경에서 실시간 게시판 목록의 타이머 값이 실제 Redis의 TTL 값과 일치하지 않는 문제가 발생했습니다.위 페이지에서 사용되는 API는 실시간 게시판 목록 조회 API입니다.이 API는 게시판의 정보와 남은 타이머 시간을 반환하며, 같은 방식으로 동작합니다.Redis에 저장 돼 있는 실시간 게시판의 KEY LIST를 조회합니다.조회된 KEY LIST에서 ID만 추출하여 boardIdList를 생성합니다.WHERE id IN boardIdList 쿼리로 DB에서 게시판의 정보를 조회합니다.KEY LIST의 각 KEY 별로 Redis에서 TTL을 조회합니다.3번 과정에서 조회된 값(게시판 정보)과 4번 과정에서 조회된 값(게시판 타이머)을 연결하여 Response 객체를 생성합니다..
· Spring Boot
본 포스팅에 등장하는 코드는 Spring WebFlux를 기반으로 작성되었습니다. Spring Web MVC를 사용하는 경우 사용되는 구현체가 달라집니다. (예를 들어, Spring MVC는 JpaRepository를 구현해서 사용하지만, Spring WebFlux는 R2dbcRepository를 구현해야 한다)1. WebClient란?WebClient는 시스템 내에서 HTTP 요청을 생성하여 외부 API에서 데이터를 받아오기 위한 기술입니다.RestTemplate가 주로 사용되던 Spring 진영에서 2017년에 등장하여 현재까지 활발하게 사용되고 있습니다.(RestTemplate은 더 이상 업데이트가 되지 않는다...)1-1. WebClient와 RestTemplate모든 신기술이 그렇듯 레거시한 기..
· Web Project
간단한 CRUD라도 최적의 시나리오를 구성하고 개발하려고 노력한다.그 중 게시글을 작성할 때 이미지가 서버에 업로드 되고 삭제되는 과정을 풀어봤다.1. 기존 방식기존 게시글과 이미지를 같이 저장하는 대략적인 흐름은 아래와 같다.1. 클라이언트가 작성된 게시글의 제목, 내용, 이미지를 모두 담아 전달한다.2. 서버에서 이미지를 S3에 저장한다.3. 그 후 이미지의 S3Key, URL과 같이 게시글의 제목, 내용을 저장한다.1-1. 문제한 번의 API 요청으로 위 단계를 모두 처리하기 위해서는 한 번에 게시글의 정보 + 이미지를 모두 담아서 요청해야 한다.이렇게 처리할 경우 아래와 같은 문제가 발생한다.하나의 API에 너무 많은 책임이 모여있다.게시글 등록 기능과 이미지 업로드 기능은 다른 기능으로 취급해도..
PersistentObjectExceptionHibernate에서 발생하는 문제로 detached(준영속성) 상태의 엔티티 객체를 persist() 메서드로 저장하려고 했을 때 발생한다.쉽게 말해서 이미 로직 상 한 번 DB에 저장된 엔티티(Detached 상태)를 또 다시 저장하려고 했을 때 발생하는 문제이다.식별자 값(ID)의 존재 유무를 통해 어떤 영속성 엔티티인지 준영속성 엔티티인지 판별한다. Deatached 상태의 엔티티는 merge()로 저장하거나 변경 감지를 통해야 한다.변경 감지는 원하는 값만 변경할 수 있음.Merge는 모든 값이 변경됨.엔티티의 생명 주기 상태:Transient: 엔티티가 영속성 컨텍스트에 저장되지 않은 새로운 상태.Persistent: 엔티티가 영속성 컨텍스트에 저장..
꽉악꽉
카악퉤