본문 바로가기

전체 글

(80)
ElasticSearch Full GC 해결 과정 8월 3째주 세상이 멈췄다 엘라스틱서치를 사용하는 서비스 API 에서 간헐적으로 circuit breaker 가 오픈됐다. circuit breaker 가 오픈되는 이유 중에 하나는 API 반환이 제 시간에 되지 못했다는 것이다. 그 시간대에 엘라스틱서치에 무슨 일이 있었나 키바나로 확인해 보니 세상에나! Full gc 수행시간이 600 ms 가량 치솟았다. 한 번만 발생한 거라면 살짝 넘어갔겠지만.. 간헐적으로 발생하고 있었기에 조치가 필요했다. 여러 대안이 있었고 그 때 당시 Heap 메모리 사용량이 90% 에 육박했기에 메모리를 30% 가량 증설하였다. ♣ 노드 하나당 힙 메모리: 24G → 32G 8월 4째주 해결된 듯 했으나 메모리 증설 후 며칠동안 상황을 지켜봤는데 이런.. Full GC 가 ..
스프링부트 jar 구성 및 실행 원리 maven이나 gradle 같은 빌드 툴로 스프링부트 프로젝트를 빌드하면 하나의 산출물인 jar 파일이 생성된다. 이 jar의 구성은 어떻게 되어있는지, java -jar app.jar 를 하면 application이 어떻게 실행되는지 알아보겠다. 1. jar 의 구성 요소 먼저 아주 아주 간단한 프로젝트를 생성한다. 그리고 gradle의 bootJar task 를 실행하면 build/libs 폴더에 jar 가 하나 생성된다. 이 jar 는 “스프링부트” 가 “우리가 개발한 소스 코드”를 실행하는데 필요한 모든 것을 가지고 있다. jarAnalysis.jar ㄴ BOOT-INF ㄴ META-INF ㄴ org root 폴더 기준으로 하나씩 알아보자 ① BOOT-INF : “우리가 개발한 소스 코드” 영역 ..
ElasticSearch BM25 이해하기 다음 3개의 문서가 있다. [문서 1] 눈을 떠보니 커피 없는 세상에 와버렸다. [문서 2] 너도 커피 좋아해? 나도 커피 좋아해 [문서 3] 저기 저 앞에 커피 파는 가게가 있다. 한 번 가볼래? 그래 내가 쏠게 마시러 가보자 사용자가 “커피” 를 검색한다. 당신은 검색엔진이고 “커피” 와 가장 관련있는 순으로 검색 결과를 내보내야한다면 문서 순위를 어떻게 지정할 것인가? 만약 2, 1, 3 순이라고 답했다면 축하한다! 당신은 BM25를 이해했다. 날짜, 불리언 같은 간단한 필드를 검색할 때는 답이 정확이 존재하기 때문에 정답 문서를 찾는 것이 명확하다. 하지만 책, 뉴스 기사, 공고 내용 같은 full-text 로 구성된 필드를 검색하는 것은 비교적 명확하지 않다. 왜냐하면 full-text 검색은 ..
Spring Data Mongo save 시 DuplicateKeyException 나는 이유 및 해결 Spring Boot 에서 MongoDB 에 접근하기 위해 ORM을 지원하는 Spring Data MongoDB 라이브러리를 사용하였다. implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' 에러내용 MongoDB 도큐먼트와 중복된 _id 를 가진 DTO 를 넣기 위해 repository의 save 메소드를 실행했다. public interface CollectionRepository extends MongoRepository { } CollectionDto collectionDto = new CollectionDto(); // fill in dto collectionRepository.save(collectionDto); ..
TestContainers 설명 이 글은 온라인 강의를 듣고 해당 내용을 직접 실습해보며 정리한 글입니다. 더 자세한 내용은 아래 강의에서 확인할 수 있습니다. 더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의(백기선) 테스트에서 도커 컨테이너를 실행할 수 있는 라이브러리 테스트 실행시 DB를 설정하거나 별도의 프로그램 또는 스크립트를 실행할 필요 없다. 보다 Production에 가까운 테스트를 만들 수 있다. 테스트가 느려진다. https://www.testcontainers.org/ → 테스트컨테이너를 쓰면 테스트용 도커를 만들 필요도, 손수 띄우고 내릴 필요도 없다. 설치하기 디펜던시 org.testcontainers junit-jupiter 1.15.1 test ​ junit-jupiter를 지원하는 test..
ElasticSearch refresh, flush API 동작 원리 (2): ElasticSearch 관점 + translog https://elsboo.tistory.com/19 ElasticSearch refresh, flush API 동작 원리 (1): Lucene 관점 https://elsboo.tistory.com/18 ElasticSearch Lucene 인덱스 구조 엘라스틱 서치는 현업에서 많이 쓰이고 있는 오픈소스 검색엔진이다. 역색인 구조로 문서를 색인하며, 근실시간으로 문서를 검색할 수 있다. elsboo.tistory.com 이전 글에서는 엘라스틱서치의 refresh, flush 동작 방식을 루씬 관점에서 살펴보았다. 이번 글에서는 동작 방식을 육안으로 확인해보고 엘라스틱서치가 제공하는 기능인 trasnslog 에 대해서도 알아볼 것이다. 루씬에서 세그먼트를 생성하는 2가지 작업을 엘라스틱서치에서는 다른 용어..
[Postman] Runner 와 newman 으로 response 파일에 쓰기 API 테스트 툴인 Postman에서도 Jmeter 처럼 API 반복 호출 기능을 제공하여 퍼포먼스 및 부하 테스트에 활용할 수 있다. UI 로 하거나 커맨드라인으로 하는 2가지 방법이 있는데, UI는 Runner 라는 기능으로, 커맨드라인은 newman 이라는 프로그램으로 실행한다. 이제 보자! 1️⃣ 첫 번째 방법: Runner Runner는 Postman 상단에 위치해있다. (2023.07.16) 버전 10에서는 runner 가 우측 하단에 있다. 왼쪽 상단 창: Collection 목록 Environment: 포스트맨 환경 변수 Iterations: URL 호출 횟수 Delay: 한 번 호출 완료 후 기다리는 시간 (ms) Data: 호출하면서 변경될 데이터 오른쪽 창: 호출할 URL 선택 Dat..
Junit5 애노테이션 설명 이 글은 온라인 강의를 듣고 해당 내용을 직접 실습해보며 정리한 글입니다. 더 자세한 내용은 아래 강의에서 확인할 수 있습니다. 더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의(백기선) @DisplayNameGeneration : 클래스 안의 모든 테스트명 변경 @DisplayNameGeneration([테스트명 변경 규칙 클래스]) @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @SpringBootTest class StudyTest { @Test void create_new_test() { System.out.println("it is test"); } } 기본적으로 테스트명은 메소드명을 따릅니다. 클래..
Junit5 Assertions / Assumptions 설명 이 글은 온라인 강의를 듣고 직접 실습해보며 정리한 글입니다. 더 자세한 내용은 아래 강의에서 확인할 수 있습니다. 더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의 (백기선) assertEquals : 값 비교 테스트 assertEquals([나와야 하는 값], [테스트 결과 값], [실패 시 메시지]); assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값이 " + StudyStatus.DRAFT + " 여야 한다."); 실패 시 메시지 인자를 람다로도 구현할 수 있습니다. assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값이 " + S..
Mockito 설명 이 글은 온라인 강의를 듣고 해당 내용을 직접 실습해보며 정리한 글입니다. 더 자세한 내용은 아래 강의에서 확인할 수 있습니다. 더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의 ✔Mockito: Mock 을 지원하는 프레임워크 ✔Mock: 진짜 객체와 비슷하게 동작하지만 우리가 컨트롤할 수 있는 객체 어떻게 활용: 외부 API, DB를 사용하는 경우 DAO, repository 객체를 mock 으로 만들고 mockito 를 사용해 동작 방식을 코딩 하고 테스트를 한다. 장점: 외부 환경으로부터 독립적으로 테스트 가능 테스트에 대한 의견: 내가 이미 구현한 클래스는 mocking 할 필요는 없다. 하지만 외부 서비스는 mocking 을 하는 게 좋겠다. Mocking 하기 좋은 경우: ..
ElasticSearch refresh, flush API 동작 원리 (1): Lucene 관점 https://elsboo.tistory.com/18 ElasticSearch Lucene 인덱스 구조 엘라스틱 서치는 현업에서 많이 쓰이고 있는 오픈소스 검색엔진이다. 역색인 구조로 문서를 색인하며, 근실시간으로 문서를 검색할 수 있다. 하지만 색인, 검색 기능을 엘라스틱 서치에서 직접 elsboo.tistory.com 이전 글에서는 엘라스틱서치 인덱스의 전체적인 구조에 대해 알아보았다. 이번에는 두 편에 걸쳐 /refresh, /flush API 의 동작 원리에 대해 알아보겠다. 엘라스틱서치에서 문서 색인 작업은 루씬이 담당하기 때문에 루씬과 엘라스틱서치 모두 어떻게 일하는지 살펴보고 동작 방법을 육안으로도 확인해볼 것이다. 문서 색인 요청을 하면, 루씬은 곧바로 세그먼트를 생성하지 않는다. 왜냐면 ..
ElasticSearch Lucene 인덱스 구조 엘라스틱 서치는 현업에서 많이 쓰이고 있는 오픈소스 검색엔진이다. 역색인 구조로 문서를 색인하며, 근실시간으로 문서를 검색할 수 있다. 하지만 색인, 검색 기능을 엘라스틱 서치에서 직접 구현하지는 않는다. 해당 기능은 루씬이라는 오픈소스 자바 라이브러리를 임포트하여 사용한다. 즉, 엘라스틱 서치는 루씬이라는 검색 라이브러리를 코어로 하여 이것에 REST API, 관리 기능 등 여러가지 편의 기능을 붙인 검색엔진이다. 그래서 엘라스틱 서치의 인덱스 구조를 내핵까지 파헤친다면 그 끝은 결국 루씬이 만들어주는 역색인 구조의 파일이다. 그럼 엘라스틱 인덱스를 양파 까듯 까보자! 엘라스틱 서치 인덱스 ⊃ 샤드 ⊃ 루씬 인덱스 ⊃ 세그먼트 ⊃ 도큐먼트 먼저 인덱스를 하나 생성한다. PUT elsboo_index {..
티스토리로 쓴 글, 구글과 네이버에 노출시키기 우리가 티스토리에 글을 썼다고 바로 구글과 네이버의 검색 결과로 나타나지 않아요. 검색엔진은 먼저 데이터를 수집한 다음에 검색어와 맞는 데이터를 반환하는데, 우리가 쓴 글을 자동으로 수집하지 않기 때문이에요. 그래서 구글과 네이버의 검색 결과에 노출시키기 위해서는 "나의 블로그를 수집해줘"라고 직접 알려줘야 해요. 먼저, 네이버부터 해볼게요 1. 네이버 서치 어드바이저 https://searchadvisor.naver.com/ 네이버 서치어드바이저 네이버 서치어드바이저와 함께 당신의 웹사이트를 성장시켜보세요 searchadvisor.naver.com 위 URL로 접속하여 로그인한 후, 우측 상단의 웹마스터 도구 버튼을 클릭해요 우리의 티스토리 블로그 주소를 입력한 다음에 우측 버튼을 클릭해요. 우리가 입..
Java 에서 테스트용 도커 컨테이너 띄우는 법 : TestContainer 도커 컨테이너에 접근하는 프로젝트에서 테스트할 때의 컨테이너는 어떤 걸 사용하시나요? 혹시 서버에서 실운영되고 있는 컨테이너를 바라보고 있나요? 엇 그러면 만약 어떠한 이유에 의해 컨테이너 안 애플리케이션의 설정이 변경되었다면... 그래서 어제와 같은 소스인데도 불구하고 테스트가 실패한다면... 억울해!! 멱등성(idempotent) : 연산을 여러 번 적용하더라도 결괏값이 달라지지 않는 일 프로젝트 테스트 환경에서 멱등성은 중요한 속성입니다. 내가 짠 소스에 대해서만 테스트하는 것이 목적이기 때문에 외부 환경이 테스트 결과에 영향을 미쳐선 안되니까요. 그래서 독립적인 테스트 환경을 구축하기 위해 테스트할 때만 잠깐 사용할 컨테이너를 띄어주는 게 testContainer가 해주는 일입니다! 디펜던시 te..
[JAVA] stream 코드 스니펫 JAVA 8 부터 도입된 stream. 내가 사용했을 때 느꼈던 가장 큰 장점은 데이터가 어떻게 흘러가는지가 문장읽듯이 읽혀서 코드 가독성이 좋다는 점이다. 처음에는 사용법을 잘 몰라 어려웠지만 하나씩 하나씩 작성해보니 꽤나 익숙해졌고 코드 짤 때도 stream의 비중이 높아지고 있다. 다음은 내가 작성했던 stream 관련 코드 예제이다. 배열 출력하기 /* 배열 출력 */ String[] alphabetArr = new String[]{"A", "B", "C"}; Arrays.stream(alphabetArr).forEach(alphabet -> log.info(alphabet)); stream 함수 안에서 여러 문장 실행하기 List personList = new ArrayList(); /* 멀티 ..
나만 아는 노션과 에버노트의 차이 2021.05.23 1. 브라우저 글 복사할 때 서식 복사 유무의 차이 에버노트 복사가 더 잘 된다 가져오고 싶은 부분 - 위키피디아 우측 분류 영역 https://ko.wikipedia.org/wiki/인플레이션 [에버노트] 서식까지 비슷하게 붙여넣기가 된다 [노션] 최소한의 서식만 붙여넣기 된다. 색 정보나 폰트 사이즈는 붙여넣기에서 누락된다. 2. 검색 기능의 차이 에버노트의 검색 기능이 더 좋다. - 검색하고 싶은 단어: "메모리주소" (띄어쓰기 미존재) - 글 내용: "메모리 주소" (띄어쓰기 존재) 에버노트 글 노션 글 [에버노트] 토큰 검색을 지원한다. 띄어쓰기 없는 "메모리주소" 검색 시 띄어쓰기 있는 "메모리 주소"가 검색된다. [노션] 토큰 검색을 지원하지 않는다. 띄어쓰기 없는 "메모..
Spring-Data-Elasticsearch VS. Rest-high-level-client 결론: 편하게 개발하고 싶으면 Spring-data-ES / ES가 버전에 민감하면 Rest-high-level-client Spring-data-ES 도 내부적으로 (ES7부터) ES와 통신할 때 Rest-high-level-client를 사용한다. 장점: ORM을 지원해서 데이터를 객체로 ES와 왔다갔다 할 수 있다. 쿼리만들 필요없이 메소드로도 검색할 수 있다. (쿼리도 물론 생성 가능) 단점: 라이브러리가 ES 버전에 민감하다. 장점: 쿼리빌더를 생성해야한다. 단점: 버전에 민감하지 않다. 참고: 나는 Spring-Data-Elasticsearch를 사용한다. 왜냐면 ES 버전이 쉽게 변하지 않는 환경이고 쿼리도 자유자로 튜닝 가능하고 인덱싱/검색 작업 메소드를 구현하지 않아도 할 수 있고 바로 ..
플스5 예약 구매 성공 후기 2020.10.18 "만약 3차 구매가 진행된다면... 쇼핑몰보단 예약 폼을 먼저 작성하는 파트너샵을 추천한다! " 2020년 10월 7일 수요일, 플레이스테이션5 2차 예약 구매가 진행되었다. 구매 방법에는 결제를 즉시 하냐 안 하냐를 기준으로 크게 2가지 방법이 있다. 하나는 하이마트, 이마트몰 등에서 구매 사이트로 접속 후 결제를 하는 방식, 다른 하나는 플스 파트너샵 사이트에서 예약 폼을 작성하는 방식이다. 1차 예약 구매 후기로 경쟁률을 어느 정도 예상했기에 동생한테도 시켜서 12시 땡 치면 나는 쇼핑몰에서 구매, 동생은 파트너샵에서 예약하기로 했다. 당일, 네이비즘 서버시간까지 동원하여 12시 00분 00초에 URL을 클릭하는 순간... "준비된 상품이 모두 매진되었습니다." 믿을 수 없었다ㅠ..
[번역] Pro Java Programming - 자바 아키텍쳐 자바는 "간단하고, 건장하고, 객체 지향적이고, 플랫폼 독립적이고, 멀티쓰레드이고, 역동적이고, 범용적인 프로그래밍 환경'이라고 묘사되어져 왔다. 이에 따라 자바는 알아차릴 수 없을 정도로의 다양한 환경으로 확장되었다. 최근에는 마이크로 프로세서에도 자바를 사용한다. 자바를 큰 기업체에서도 작은 부품들을 위해 사용하고, 핸드폰에서 주 컴퓨터같은 장치에도 사용한다. 이렇게 다양한 범위의 환경을 지원하기 위해 코어 클래스들을 중심으로 많은 API들과 버전들이 발전되어졌다. 좋은 자바 프로그래머가 되기 위해, 기초를 잘 아는 것이 중요하다. UI가 아무리 좋아도, 코드는 많고, 메모리가 부족하다면 유저는 행복하지 않을 것이다. 이 책은 자바개발자로써 다양한 개발을 가능하게 해주는 것이 아닌 독자가 매일 마주칠..
[검색 결과 노출 팁] 게시글에 오래전 날짜를 쓰지 않는다! 2020.10.09 구글에서는 검색된 글이 언제 게시됐는지 날짜 정보를 제공한다. 하지만 우리는 글을 작성할 때 구글한테 이 게시글은 언제 작성됐어요~라고 알려주지 않는다. 그렇다면 구글은 날짜 정보를 어떻게 가져올까? ...... 나도 잘 모른다ㅋ 그러나 한 가지 확실한 건 본문 내용에 날짜 정보가 있다는 것이다. 본문에 날짜가 나오고 무언가 대단하고 엄청난 조건들을 만족하면 그 날짜를 게시일로 인식하는 것을 알 수 있다. 그렇다면... 본문에 무지 오래된 날짜를 쓰면..? 2018년에 작성된 글임에도 불구하고 검색 결과에서는 2013년 글로 분류하고 있었다. 특히 티스토리에서 작성한 지 오래된 글은 'X년 전' 같은 형식으로 표기되고 있으므로 구글에서 알아주기 어렵다. 검색 결과는 최신 글일수록 상단..