전체 글 88

데이터 조회의 반환값 T vs Optional<T>

repository 계층에서 반환 타입은 어떤 타입으로 해야할까요? 먼저 EntityManager에서 getSingleResult를 조회했을 때 값이 없는 경우에는 NotResultException이 발생합니다. @Test public void findEntityNotExists(){ //given assertThrows(NoResultException.class, () -> em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", "asdasdasd") .getSingleResult()); } Spring-data-jpa에서는 NoResultException을 catch해서 null로 ..

DEV/Spring Data JPA 2023.09.24

메서드 이름으로 데이터 조회하기 vs JPQL 직접 작성해서 데이터 조회하기

@Repository public interface MemberJpaRepository extends JpaRepository { List findByNameAndEmail(String name, String email); @Query("select m from Member m where m.name = :name and m.email = :email") List findUser(@Param("name") String name, @Param("email") String email); } findByNameAndEmail은 JpaRepository를 extends한 인터페이스에서 메서드 이름으로 데이터를 조회할 조건을 지정하는 방식입니다. 이 방법은 내부적으로 JPQL을 생성해주는 Spring Data J..

DEV/Spring Data JPA 2023.09.24

어떤 기능을 먼저 만들어야할까?

저는 회사에서 로그 모니터링 서비스를 만들고 있습니다. 와탭의 로그 모니터링 서비스는 약 1년 9개월동안 성장해왔습니다. 감사하게도 로그 모니터링에 니즈가 있는 대형 고객사들를 비교적 빠른 시간 내에 만날 수 있었습니다. 게다가 On-Premise가 필요하다는 고객과 SaaS가 필요하다는 고객이 모두 있었으며, 자체적으로 로그 모니터링 시스템을 개발했던 회사와 모니터링 최대 경쟁사인 DataDog의 제품을 사용하던 고객도 있었습니다. 덕분에 최근 1년동안, 매우 많이 힘들기는 했지만, 로그 모니터링 서비스로서의 최소한의 기능은 갖추어졌다고 생각합니다. 며칠전 같이 로그 모니터링 서비스를 개발하는 동료분들과 경쟁사의 로그 모니터링 제품을 비교 분석해본 적이 있습니다. DataDog, Sumo Logic, ..

DEV/INSIGHT 2023.09.20

성능과 사용자 경험의 사이에서

저는 회사에서 로그 모니터링 서비스를 만들고 있습니다. 위의 화면에서 검색 조건은 content:*Exception*으로 입력되어 있습니다. 수집 된 로그 중에서 Exception이 포함된 로그를 조회하는 모습을 보여줍니다. 지정한 키워드가 포함되었는지 확인할 때에는 java.lang.String#startsWith(java.lang.String)을 사용합니다. 물론 이렇게 수집된 모든 로그에 대해서 FULL-SCAN을 하면 검색 속도도 안나오고 CPU도 많이 사용할 수 있습니다. 더 큰 문제는 지정한 검색 시간 안에 로그가 N개 있으면 N개의 문자열에 대해서 모두 startsWith 연산을 수행한다는 점입니다. RDBMS를 사용하는 환경이라면 Connection Pool을 오랫동안 점유하게 되고, Fi..

DEV/INSIGHT 2023.09.20

문제의 원인은 집 밖에 있었다

저는 사내에서 로그 모니터링 서비스를 만들고 있습니다. 어떤걸 만들고 있는지는 아래의 문서에서 확인하실 수 있습니다. https://www.whatap.io/ko/log-monitoring/ 로그 모니터링 | 와탭 와탭 로그 익스텐션은 다른 모니터링 서비스와 이용 할 때 부가 기능으로 사용하는 로그 모니터링 입니다. 와탭의 application, server, kubernetes 모니터링을 이용하고 있다면 Log 기능 활성화만으로 시 www.whatap.io 본 문서에서는 '문제의 원인은 집밖에 있었다'라는 주제로 이야기를 풀어보려고 합니다. (보안에 문제가 없는 선에서 이야기해야해서 생각보다 싱겁게 끝날 수 있습니다) 어느 날, 운영 환경에서 아래와 같은 현상이 발생했습니다. 약 오전 10시 13분부터..

java-grok 라이브러리 수정해서 오픈소스로 배포하기 (with gradle 8.*)

오픈소스를 수정 배포하게 된 배경 저는 사내에서 로그 모니터링 서비스를 만들고 있습니다. 위 사진에서 파란색 태그는 임의의 로그(문자열)에서 semantic(의미를 가지는) 키워드로 추출된 값들입니다. 이렇게 추출된 태그를 기반으로 인덱스가 생성되고 로그를 조회할 수 있습니다. 임의의 형태로 수집되는 로그에서 유의미한 형태의 키워드를 추출하기 위해서 thekrakken/java-grok 라는 라이브러리를 사용하고 있었습니다. 직접 만들고 있는 로그 모니터링을 사용해서 운영환경에서 발생하는 문제를 분석하다보니 크게 2가지 문제의식을 갖게 되었습니다. 1. 다양한 환경에서 수집되는 로그와 인덱스를 체계적으로 관리할 필요성이 있다. 2. 로그를 메트릭스로 변환해서 메트릭스 기반으로 개발된 다양한 기능들을 사용..

DEV/JAVA 2023.09.18