기본 콘텐츠로 건너뛰기

Guava BloomFilter 사용 기초

Guava BloomFilter 사용 기초

사용 환경

  • Windows 10
  • Java 1.8
  • Gradle 7.2
  • Spring Boot 2.5.4
  • Oracle DB 19
  • MyBatis 2.2.0

프로젝트 생성하기

  1. 프로젝트 생성

    브라우져에서 spring initializr를 방문하여 아래와 같이 입력하고 GENERATE 버튼을 클릭합니다.

    • Project: Gradle Project
    • Language: Java
    • Spring Boot: 2.5.5
    • Project Meta:
      • Group: trvoid.bloomfilter
      • Artifact: bloom-filter
      • Name: bloom-filter
      • Package name: trvoid.bloomfilter
      • Packaging: Jar
      • Java: 8
    • Dependencies:
      • JDBC API
      • MyBatis Framework
      • Oracle Driver

    생성된 프로젝트 파일을 다운로드하여 압축을 풉니다. 프로젝트 폴더 구조는 아래와 같습니다.

    bloom-filter
      |-src
        |-main
          |-java
            |-trvoid.bloomfilter
              |-BloomFilterApplication.java
          |-resources
            |-application.properties
        |-test
          |-java
            |-trvoid.bloomfilter
              |-BloomFilterApplicationTests.java
      |-build.gradle
    

    build.gradle 파일에서 의존성 항목을 확인할 수 있습니다.

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
        runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    

    BloomFilterApplication.java 파일의 내용은 아래와 같습니다.

    package trvoid.bloomfilter;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class BloomFilterApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BloomFilterApplication.class, args);
        }
    
    }
    
  2. @Mapper 추가

    src/main/java/trvoid/bloomfilter/Reject.java

    package trvoid.bloomfilter;
    
    public class Reject {
        private String fromPhoneNo;
        private String toPhoneNo;
    
        public Reject(String fromPhoneNo, String toPhoneNo) {
            this.fromPhoneNo = fromPhoneNo;
            this.toPhoneNo = toPhoneNo;
        }
    
        public String getFromPhoneNo() {
            return fromPhoneNo;
        }
    
        public void setFromPhoneNo(String fromPhoneNo) {
            this.fromPhoneNo = fromPhoneNo;
        }
    
        public String getToPhoneNo() {
            return toPhoneNo;
        }
    
        public void setToPhoneNo(String toPhoneNo) {
            this.toPhoneNo = toPhoneNo;
        }
    
        @Override
        public String toString() {
            return String.format("Reject[fromPhoneNo:%s, toPhoneNo:%s]", fromPhoneNo, toPhoneNo);
        }
    }
    

    src/main/java/trvoid/bloomfilter/RejectMapper.java

    package trvoid.bloomfilter;
    
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    @Mapper
    public interface RejectMapper {
        String SELECT = " SELECT FROM_PHONE_NO, TO_PHONE_NO FROM REJECT ";
    
        @Select(" SELECT COUNT(1) FROM ALL_OBJECTS " +
                " WHERE OBJECT_TYPE = 'TABLE' AND OBJECT_NAME = 'REJECT' ")
        int countTable();
    
        @Insert(" CREATE TABLE REJECT ( " +
                "    FROM_PHONE_NO VARCHAR2(20) NOT NULL, " +
                "    TO_PHONE_NO VARCHAR2(20) NOT NULL, " +
                "    CONSTRAINT REJECT_PK PRIMARY KEY (FROM_PHONE_NO, TO_PHONE_NO) " +
                " ) ")
        void createTable();
    
        @Insert(" INSERT INTO REJECT ( " +
                "    FROM_PHONE_NO, TO_PHONE_NO " +
                " ) VALUES ( " +
                "    #{reject.fromPhoneNo}, #{reject.toPhoneNo} " +
                " ) ")
        void insertReject(@Param("reject") Reject reject);
    
        @Select("SELECT COUNT(*) FROM REJECT WHERE FROM_PHONE_NO = #{fromPhoneNo} AND TO_PHONE_NO = #{toPhoneNo} ")
        int countCar(@Param("fromPhoneNo") String fromPhoneNo, @Param("toPhoneNo") String toPhoneNo);
    
        @Select(SELECT)
        List<Reject> findAll();
    }
    
  3. 데이터베이스 질의 수행을 위해 CommandLineRunner 추가

    REJECT 테이블이 없을 경우 생성합니다.

    src/main/java/trvoid/bloomfilter/BloomFilterApplication.java

    package trvoid.bloomfilter;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import javax.sql.DataSource;
    
    @SpringBootApplication
    public class BloomFilterApplication implements CommandLineRunner {
        @Autowired
        DataSource dataSource;
    
        @Autowired
        RejectMapper rejectMapper;
    
        public static void main(String[] args) {
            SpringApplication.run(BloomFilterApplication.class, args);
        }
        
        @Override
        public void run(String... args) throws Exception {
            System.out.println("DataSource = " + dataSource);
    
            if (rejectMapper.countTable() == 0) {
                rejectMapper.createTable();
                System.out.println("** Created a table: REJECT");
            }
            
            System.exit(0);
        }
    }
    
  4. 데이터 소스 설정

    src/main/resources/application.properties

    spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
    spring.datasource.username=your_db_username
    spring.datasource.password=your_db_password
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    
  5. 실행

    >gradlew bootRun
    

    출력 결과

    ...
    Create a Bloom Filter instance.
    Add all the REJECT data.
    Test the Bloom Filter.
    0800000000101000000001 -> true
    0800000000102000000001 -> false
    ...
    

블룸필터 적용하기

  1. Guava 라이브러리에 대한 의존성 추가

    build.gradle

    implementation 'com.google.guava:guava:31.0.1-jre'
    
  2. 블룸필터 생성 및 테스트 메쏘드 추가

    src/main/java/trvoid/bloomfilter/BloomFilterApplication.java

    private BloomFilter<String> initBloomFilter() {
    	System.out.println("Create a Bloom Filter instance.");
    	BloomFilter<String> rejectFilter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("UTF-8")),100000);
    
    	System.out.println("Add all the REJECT data.");
    	List<Reject> list = rejectMapper.findAll();
    	list.forEach(x -> rejectFilter.put(x.getFromPhoneNo() + x.getToPhoneNo()));
    
    	return rejectFilter;
    }
    
    private void testBloomFilter(BloomFilter<String> rejectFilter) {
    	System.out.println("Test the Bloom Filter.");
    	String[] values = new String[] {
    		"0800000000101000000001",
    		"0800000000102000000001"
    	};
    
    	for (String s : values) {
    		System.out.println(String.format("%s -> %s", s, rejectFilter.mightContain(s)));
    	}
    }
    
  3. 블룸필터 생성 및 테스트 메쏘드 호출

    src/main/java/trvoid/bloomfilter/BloomFilterApplication.java

    @Override
    public void run(String... args) throws Exception {
    	System.out.println("DataSource = " + dataSource);
    
    	if (rejectMapper.countTable() == 0) {
    		rejectMapper.createTable();
    		System.out.println("** Created a table: REJECT");
    	}
    
    	//insertTestData();
    
    	BloomFilter<String> rejectFilter = initBloomFilter();
    	testBloomFilter(rejectFilter);
    
    	System.exit(0);
    }
    

Written with StackEdit.

댓글

이 블로그의 인기 게시물

Windows에 AMP와 MediaWiki 설치하기

1. 들어가기     AMP는 Apache + MySQL +  Perl/PHP/Python에 대한 줄임말이다. LAMP (Linux + AMP)라고 하여 Linux에 설치하는 것으로 많이 소개하고 있지만 Windows에서도 간편하게 설치하여 사용할 수 있다.       이 글은 Windows 7에 Apache + MySQL + PHP를 설치하고 그 기반에서 MediaWiki를 설치하여 실행하는 과정을 간략히 정리한 것이다. 2. MySQL     * 버전 5.6.12     1) 다운로드         http://dev.mysql.com/downloads/installer/         MySQL Installer 5.6.12         Windows (x86, 32-bit), MSI Installer         (mysql-installer-web-community-5.6.12.0.msi)     2) 다운로드한 MSI 파일을 더블클릭하여 설치를 진행한다.           설치 위치:                   C:\Program Files\MySQL               선택 사항:                       Install MySQL Products             Choosing a Se...

MATLAB Rutime 설치하기

MATLAB Rutime 설치하기 미설치시 에러 MATLAB Runtime 을 설치하지 않은 환경에서 MATLAB 응용프로그램이나 공유 라이브러리를 사용하려고 하면 아래와 같은 에러 메시지가 표시될 것입니다. 처리되지 않은 예외: System.TypeInitializationException: 'MathWorks.MATLAB.NET.Utility.MWMCR'의 형식 이니셜라이저에서 예 외를 Throw했습니다. ---> System.TypeInitializationException: 'MathWorks.MATLAB.NET.Arrays.MWArray'의 형식 이니셜라이저에서 예외를 Throw했습니다. ---> System.DllNotFoundException: DLL 'mclmcrrt9_3.dll'을(를) 로드할 수 없습니다. 지정된 모듈을 찾을 수 없습니다. (예외가 발생한 HRESULT: 0x8007007E) 위치: MathWorks.MATLAB.NET.Arrays.MWArray.mclmcrInitialize2(Int32 primaryMode) 위치: MathWorks.MATLAB.NET.Arrays.MWArray..cctor() --- 내부 예외 스택 추적의 끝 --- 위치: MathWorks.MATLAB.NET.Utility.MWMCR..cctor() --- 내부 예외 스택 추적의 끝 --- 위치: MathWorks.MATLAB.NET.Utility.MWMCR.processExiting(Exception exception) 해결 방법 이 문제를 해결하기 위해서는 MATLAB Runtime 을 설치해야 합니다. 여러 가지 방법으로 MATLAB Runtime 을 설치할 수 있습니다. MATLAB 이 설치되어 있는 경우에는 MATLAB 설치 폴더 아래에 있는 MATLAB Runtime 설치 프로그램을 실행하여 설치합니다. ...

Wi-Fi 카드 2.4GHz로만 동작시키기

Wi-Fi 카드 2.4GHz로만 동작시키기 별도의 Wi-Fi AP 장치를 두지 않고 아래와 같은 기기들로만 Wi-Fi 네트워크를 구성하고자 할 때 주변 기기들이 2.4GHz만 지원하기 때문에 PC에서 실행하는 AP가 항상 2.4GHz를 사용하도록 Wi-Fi 카드를 설정해 주어야 합니다. 기기 Wi-Fi 카드 주파수 대역 Wi-Fi Direct 지원 PC (Windows 10) 2.4GHz, 5GHz O 주변 기기들 2.4GHz X Wi-Fi 카드별 주파수 대역 선택 방법 Windows 시작 메뉴에서 설정 을 클릭합니다. Windows 설정 화면에서 네트워크 및 인터넷 을 클릭합니다. 설정 화면의 왼쪽 메뉴바에서 Wi-Fi 를 클릭합니다. 화면 오른쪽 관련 설정 구역에 있는 어댑터 옵션 변경 을 클릭합니다. 설정을 바꾸고자 하는 Wi-Fi 카드 항목을 선택하고 마우스 오른쪽을 누른 다음 속성 메뉴를 클릭합니다. 대화상자의 네트워킹 탭 화면에 있는 구성 버튼을 클릭합니다. 장치 속성 대화상자의 고급 탭 화면으로 이동합니다. 제시되는 속성 항목들은 제품별로 다르며 자세한 사항은 아래의 제품별 설명을 참고하여 값을 설정하시기 바랍니다. Intel Dual Band Wireless-AC 7265 기술 사양 주파수 대역: 2.4GHz, 5GHz 무선 표준: 802.11ac 주파수 대역 선택 장치 속성 대화상자에서 아래와 같이 선택합니다. Wireless Mode 1. 802.11a => 5GHz 4. 802.11b/g => 2.4GHz (이 항목 선택) 6. 802.11a/b/g => 2.4GHz, 5GHz Intel Dual Band Wireless-AC 8265 기술 사양 주파수 대역: 2.4GHz, 5GHz 무선 표준: 802.11ac 주파수 대역 선택 장치 속성 대화상자에서 아래와 같이 ...