데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [Swift] 한글 검색 라이브러리 만들어보기

      Coin 24.07.18
      2,372 8 0
      DEVOTEE 요약
      토스의 es-hangul을 보고 Swift로 한글 검색 라이브러리인 HangulSearch를 만들었습니다. 이 라이브러리는 초성 검색, 자동 완성, 전체 문자열 검색 등을 지원하며, 한글 음절을 초성, 중성, 종성으로 분리해 보다 정확한 검색 결과를 제공합니다. iOS에서 기본적으로 지원하지 않는 한글 초성 검색을 보완하여 사용자들에게 쾌적한 검색 경험을 제공하는 것이 목표입니다.
      DEVOTEE 추천 블로그

      그동안 다양한 오픈소스 라이브러리를 사용해 오면서 그동안 직접 라이브러리를 만들어보고 싶다는 생각을 하고 있었는데,

      이번 토스에서 만든 es-hangul(https://github.com/toss/es-hangul) 을 보고 여러 한글 관련 프로젝트를 진행해왔던 경험을 살려

      Swift를 활용한 한글 검색 라이브러리를 만들게 되었습니다.


      HangulSearch

      제공하는 기능

      1. 검색

      • 초성 검색: 사용자가 입력한 초성에 맞는 데이터를 검색합니다.

      • 자동 완성: 사용자의 입력에 기반한 자동 완성 결과를 제공합니다.

      • 전체 문자열 검색: 입력된 전체 문자열을 포함하는 데이터를 검색합니다.

      • 종합 검색 모드: 초성 검색과 자동 완성을 결합하여 더 넓은 범위의 검색을 지원합니다.

      2. 정렬

      • 기본: 정렬을 수행하지 않음. 데이터 순서대로 반환

      • 자모 순서: 항목들을 한글 자모 순서대로 정렬

      • 자모 역순: 항목들을 한글 자모 역순으로 정렬

      • 편집 거리: Levenshtein (편집) distance 기준으로 가장 유사한 순서대로 정렬


      초성 검색과 자동 완성 검색의 원리

      1.초성 검색

      한글의 초성 검색은 한글 음절을 초성, 중성, 종성으로 분리하여 초성만을 추출하고 이를 이용해 검색하는 방식입니다. 한

      글 음절은 유니코드 표준을 활용하여 분리됩니다. 초성 검색의 기본 원리는 다음과 같습니다:

      • 한글 음절의 유니코드 범위

        한글 음절은 유니코드 범위 0xAC00에서 0xD7A3까지의 값을 가집니다. 이 범위 내에서 각 음절의 유니코드 값을 이용하여 초성, 중성, 종성을 분리할 수 있습니다.

      • 초성, 중성, 종성의 인덱스 계산

        한글 음절의 유니코드 값에서 '가'의 유니코드 값을 뺀 후 초성, 중성, 종성의 인덱스를 계산합니다.


      초성: ((unicodeValue - 0xAC00) / 28) / 21중성: ((unicodeValue - 0xAC00) / 28) % 21종성: (unicodeValue - 0xAC00) % 28

      초성 테이블
      let 초성: [String] = ["ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"]
      초성 추출 함수
      func extractChosung(_ character: Character) -> String {
          let unicodeValue = character.unicodeScalars.first!.value
          if unicodeValue >= 0xAC00 && unicodeValue <= 0xD7A3 {
              let index = ((unicodeValue - 0xAC00) / 28) / 21
              return CHO_SUNG[Int(index)]
          }
          return String(character)
      }


      2.자동 완성 검색

      • 한글 문자열 분해

        한글 문자열의 경우, 입력된 문자열을 분해하여 접두사 비교를 보다 정확하게 수행할 수 있습니다. 이를 위해 한글 음절을 초성, 중성, 종성으로 분해합니다.

      func decomposeKorean(_ char: Character) -> [Character] {
          let unicodeValue = char.unicodeScalars.first!.value
          if unicodeValue >= 0xAC00 && unicodeValue <= 0xD7A3 {
              let base = unicodeValue - 0xAC00
              let chosungIndex = Int(base / 28 / 21)
              let jungsungIndex = Int((base % (21 * 28)) / 28)
              let jongsungIndex = Int(base % 28)
              
              var result = [CHO_SUNG[chosungIndex], JUNG_SUNG[jungsungIndex]]
              if jongsungIndex > 0 {
                  result.append(JONG_SUNG[jongsungIndex]!)
              }
              return result
          }
          return [char]
      }


      • 분해된 문자열 기반 자동 완성 검색

        입력된 문자열을 분해하여 접두사 비교를 수행합니다.

      func searchItemsAutocompleteDecomposed(input: String) -> [T] {
          let decomposedInput = input.flatMap { decomposeKorean($0) }.map { String($0) }.joined()
          return items.filter {
              let decomposedItem = $0.name.flatMap { decomposeKorean($0) }.map { String($0) }.joined()
              return decomposedItem.hasPrefix(decomposedInput)
          }
      }


      마치며

      iOS에서 초성 검색의 필요성

      iOS의 기본 문자열 검색 기능은 한글의 초성을 인식하지 못하는 경우가 많아, 로컬에서 검색을 수행하는 앱들의 경우 초성 검색 및 자동 완성 검색을 지원하지 못하는 경우가 많았습니다.

      이를 통해 사용자들이 iOS 환경에서 쾌적한 한글 검색 경험을 할 수 있으면 좋겠습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      Coin 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기