[개발일지] 230608 실시간 급상승 검색어 알고리즘
·
성장이야기/TIL
실시간 급상승 검색어 알고리즘이전에 알아봤던 랭킹 알고리즘을 바탕으로 실시간 급상승 검색어 랭킹 알고리즘을 만들어야 하는데 지금까지 구상한걸 기록해보려고 한다. 우선 실시간 급상승 검색어 기능에서 고려해야 하는 점은 아래와 같다.평소 검색 유입량에 대비 많은 유입량을 보이는 검색어를 탐지시간 가중치(최근에 검색된 검색어에 더 높은 점수를 적용하기 위함)검색한 시간대에 따른 점수 보정 (새벽시간대에 검색한 검색어의 점수는 낮게 측정되게 하기 위함)전체 검색량에 따른 점수 보정 (평소에 검색량이 많았던 키워드일 수록 점수를 낮게 측정하기 위함) 시간 가중치: 실시간 검색어 랭킹에서 최신 정보를 반영하기 위해 시간 가중치를 부여할 수 있다. 최근에 검색된 검색어에는 더 높은 가중치를 적용하여 기대 점수를 산..
[개발일지] 230607 Ranking Algorithm(순위 알고리즘)
·
성장이야기/TIL
실시간 급상승 검색어 기능을 위한 Ranking Algorithm에 대한 조사 우선 공개된 Ranking Algorithm을 살펴보면 게시글의 추천수를 기반으로 인기 게시글을 선별해 사용자에게 추천해 주는 알고리즘, 추천/비추천을 이용해 순위를 매기는 알고리즘, 평점을 기반으로 하는 순위 알고리즘 등등 여러 알고리즘이 존재한다. Hacker News Ranking Algorithm Hacker News에서 사용하는 ranking algorithm은 생각보다 간단하다. p = 게시글에 대한 추천 수 (-1을 한 이유는 글 작성자의 추천도를 고려한 것) t = 글을 게시한 시간과 현재 시간 사이의 시간(시간 단위). 예를 들어, 2시간 전에 게시된 글은 t = 2 G = 중력계수 (news.arc에서는 기본..
[개발일지] 230602 Java Varargs(가변인자)란?
·
성장이야기/TIL
오늘 새로 배운 내용 Java Varargs (가변인자) 오늘은 Java 5부터 도입되었다는 Varargs (가변인자) 기능을 알게 되었다. Varargs기능은 메서드의 매개변수로 동적인 개수의 인수를 전달할 수 있게 해주는 기능으로, 메서드가 동일한 타입의 인수를 다양하게 받을 수 있게 해 준다. 아래 예시 코드르 보면 이해가 편하다. public void printNumbers(int... numbers) { for (int num : numbers) { System.out.println(num); } } printNumbers(1, 2, 3); // 1, 2, 3을 인수로 전달 printNumbers(10, 20); // 10, 20을 인수로 전달 printNumbers(100); // 100을 인..
[개발일지] 230531 직렬화 중 만난 Jackson 버전 문제
·
성장이야기/TIL
오늘은 응답 객체 직렬화 관련해서 고생을 했는데 그 과정을 짧게나마 기록해 본다. 간단하게 문제상황을 설명하면 market의 open 여부를 확인하는 api를 get 요청했을 때 market의 open 여부에 따라 true, false 값을 반환하는 api인데 동일한 응답값이 두 개가 나오는 문제가 발생했다. 필드명이 isMarketOpen이라 치면 아래와 같이 두 개가 중복돼서 나오는 문제가 발생했다. { "isMarketOpen":false, "marketOpen":false } 이건 누가 봐도 dto객체의 getter 메서드에 문제가 있기 때문에 발생한 문제라고 생각하고 dto객체를 살펴보는데 별 이상 없어 보였다.. 아래는 문제의 dto객체이다. @JsonAutoDetect(fieldVisibil..
[개발일지] 230529 인스턴스화를 막기 위해 private 생성자를 사용하자
·
성장이야기/TIL
오늘 새로 배운 내용 이펙티브 자바 아이템 4를 읽던 중 처음 알게 된 사실이 있다. 자바 클래스에 생성자를 명시해주지 않을경우에 컴파일러가 자동으로 매개변수를 받지 않는 public 기본 생성자를 만들어 준다는 사실을 전혀 모르고 있었다. public 한 기본 생성자가 있을 경우 의도치 않게 클래스가 인스턴스화될 가능성이 존재한다. 문제가 되는건 인스턴스로 만들어 쓰려고 설계한 클래스가 아닌데 인스턴스화가 되면 안 되기 때문에 인스턴스화를 막아야 한다. 인스턴스화할 필요가 없는 클래스들이 존재하는데 (예를 들어 java.lang.Math나 java.util.Array처럼 기본 타입값이나 배열 관련 메서드만 모아놓은 클래스들) 이러한 클래스들은 private 생성자를 추가해 인스턴스화를 막고 있다. 컴파..
[개발일지] 230526 정적 멤버 클래스를 이용해 불필요한 중복을 제거하자
·
성장이야기/TIL
오늘 새로 배운 내용 테스트 코드에서 반복해서 생성되는 객체는 정적 멤버 클래스를 이용해서 중복을 줄이자. 테스트 코드에서 각각의 독립적인 테스트 케이스마다 객체 검증을 위해 반복적으로 객체를 생성해야 할 일이 있을 것이다. 예를 들어 아래와 같이 Post라는 객체를 검증하기 위해서는 각각의 테스트 케이스마다 post를 생성해줘야 한다. @Test void test1() { Post post = new Post(...); ... } @Test void test2() { Post post = new Post(..); ... } 테스트 케이스가 많아질 수록 Post 객체를 생성하는 작업은 귀찮고 코드도 중복되는 문제가 발생한다. 이런 문제를 해결하기 위해서 중첩 클래스의 한 종류인 정적 멤버 클래스를 이용할..