728x90
전체 글
543

[PostgreSQL] NL Join과 Hash Join은 어떻게 선택된걸까

Table우선 식당(restaurants)과 게시글(articles) 테이블을 가지고 여러 가지 테스트를 해볼 것이다. 식당 테이블에는 약 34만개, 게시글에는 1000개의 데이터가 존재한다. PK인 id만을 가지고 테스트를 해볼 것이기 때문에 스키마는 생략한다. 단, 추가로 articles의 restaurant_id를 가지는 인덱스 restaurant_idx를 생성했다.NL Join & Index Scanselect * from restaurants r , articles a where r.id Nested Loop (cost=0.70..71.30 rows=1 width=855) (actual time=0.047..0.049 rows=0 loops=1) -> Index Scan using r..

Database 2024.10.02

Content-based 추천 시스템 구현 (2)

이전 포스트 Content-based 추천 시스템 구현 (1)에서 Content-based 방식의 추천 알고리즘에대해 알아보고 간단하게 구현해보았다. 이때 상품의 카테고리를 기준으로 one-hot encoding한 벡터값을 활용하여 코사인 유사도를 계산하였는데, 이러한 방식은 단순히 많이 구매한 카테고리에 속한 상품을 추천해주는 것으로 밖에 안된다. 이러면 굳이 계산할 필요없이 카테고리 별로 구매한 횟수만 저장해놓고 가장 많이 구매한 카테고리의 상품들을 추천해줄 수 있다. 또한 가장 많이 구매한 카테고리에만 편향(Bias)되어 다른 카테고리에 속한 상품은 추천 대상에서 제외되는 문제가 발생하게 된다.상품 프로필 구성위와 같은 문제를 해결하기위해 카테고리 뿐만 아니라 상품 등록시 작성한 제목과 본문도 활용..

Python 2024.08.17

Content-based 추천 시스템 구현 (1)

휴리스틱 알고리즘으로 추천 시스템을 구현하는 방법으로 Content-based와 Collaborative Filtering이 있다. 이 두 가지 방법 중 Content-based를 적용할 것이고, 이에 대해 먼저 간단히 살펴보겠다.Content-based 추천Content-based 추천 방법은 각 사용자가 구매/만족했던 상품과 유사한 것을 추천하는 방법이다. 동작 순서는 다음과 같다.상품 프로필 수집사용자 프로필 구성사용자 프로필과 다른 상품들의 상품 프로필 매칭사용자에게 상품 추천이제 하나씩 순서대로 어떤 것을 하는지 간단하게 알아보겠다.1. 상품 프로필 수집상품 프로필이란, 상품의 특성을 나열한 벡터이다. 이를 Feature라고도 부른다. 예를 들어, 영화의 프로필의 특성을 나열한 벡터라고 한다면 ..

Python 2024.08.14

Spring Data Repository 를 사용하여 Redis에 캐싱할 경우 Connection을 사용하는 문제

Repository로 Redis를 사용?Redis Repositories에서 CrudRepository를 상속받아 JpaRepository를 사용하여 DB에 데이터를 조작하는 것처럼 사용할 수 있다고 한다.예시로 다음과 같이 Repository 인터페이스를 정의할 수 있다.interface UserRepository extends CrudRepository { long countByLastname(String lastname); } id를 key 값으로 lastname이라는 value가 저장되는 것이다. 만약 객체 자체를 저장하게될 경우 JSON 형식이 아닌 HSET 명령어로 저장하는 것과 같은 결과로 저장된다. 그리고 실제로 동작할 때, 구체 클래스는 SimpleKeyValueRepository..

Java & Spring 2024.08.02

알람 기능의 Template Method + Strategy 패턴 적용기

이전 포스트에서 Template Method 패턴을 적용하여 확장성을 개선해보았다. 하지만 이후 알람을 보내야하는 이벤트가 추가됨에따라 해당 알람을 전송하는 클래스를 추가하고 변경해야하는 코드가 많아지게 된다는 문제가 있다. 따라서 이러한 문제를 개선하기 위해 Strategy 패턴을 적용한 경험을 설명해보려고 한다.설계이전 구조에서 AlarmTemplate이라는 인터페이스와 AlarmMappingHandlerAdapter라는 클래스를 추가해주었다.AlarmTemplate: Template Method를 적용한 추상 클래스의 다형성을 제공한다.AlarmMappingHandlerAdapter: 알림 전송 기능 수행을 대신 진행해준다.구현AlarmTemplateAlarmTemplate 인터페이스를 추가하고 지..

Java & Spring 2024.07.30

알림 기능의 Template Method 패턴 적용기

[Design Patterns] Template Method Pattern 에서 간단한 예시로 Template Method 패턴에 대해서 이해할 수 있다.기능 요구사항중고 거래 서비스를 개발하면서 판매자, 구매자에게 알림을 보내는 기능을 구현하게 되었다. 각 알림은 다음과 같은 경우 발생한다.거래가 완료되었을 경우, 판매자와 구매자에게 알림을 전송하고 채팅을 통해 관심을 가졌던 사용자들에게도 알림을 전송한다.판매 상태가 예약 중으로 변경 되었을 경우, 예약을 신청한 사용자에게 알림을 전송한다.예약이 취소되어 판매 상태가 판매 중으로 변경 되었을 경우, 예약을 취소한 사용자를 포함하여 채팅을 통해 관심을 가졌던 사용자들에게 모두 알림을 전송한다.구현 (패턴 적용 X)RabbitMQPublisher알림 기능..

Java & Spring 2024.07.27

운영(배포) 환경에서 jpa.show_sql=false 로 설정해야하는 이유

배경1:1 채팅 기능이 구현되어있고 상대방을 어떤 이유로 신고하는 기능이 있다고 하자. 그리고 신고할 수 있는 횟수가 제한이 없다고하면 상대방을 계속 신고할 수 있다.이때, 여러명이 상대방을 쉼없이 신고할 경우를 가정하여 테스트를 진행해보았다.부하 테스트Spring Boot로 구현한 API는 Docker 환경에 올려서 실행했으며, [CPU 2, Memory 4G]로 Resource를 설정했다.Jmeter 테스트부하 테스트는 Jmeter를 사용하여 수행했다.아래 설정은 200명의 사용자가 60초 동안 쉼없이 상대방을 신고하는 경우를 테스트하기 위한 설정이다.실행 후 TPS 그래프를 확인해보면 7 ~ 8 초 이후 갑자기 TPS가 떨어지고 중간중간에 멈추는 구간이 발생하는 것을 볼 수 있었다. 왜 요청을 잘 ..

Java & Spring 2024.07.16

[JaCoCo] 코드 커버리지 측정

테스트 커버리지테스트 범위를 측정하는 테트 품질 측정 기준이며, 테스트의 정확성과 신뢰성을 향상시키는 역할테스트 케이스의 부족한 부분을 파악하고 추가적인 테스트 케이스를 개발할 수 있음테스트 커버리지의 종류1. 구문 커버리지 (Statement Coverage)모든 구문에 대해 한 번 이상 수행하는 테스트 커버리지테스트 케이스 집합에 의해 실행된 문장의 수 / (전체 실행 가능한 프로그램 문장의 수) * 100%if (x > 0) { y = x * 2;} else { y = x / 2;}x의 값을 3으로 설정한 경우 -> 첫 번째 구문이 True가 되어 두 번째 구문이 실행x의 값을 -2 또는 0으로 설정한 경우 -> 첫 번째 구문이 False가 되어 네 번째 구문이 실행이처럼 모든 구문을 한..

Java & Spring 2024.07.10
728x90