보통은 검색엔진 elastic search로 검색기능을 개발합니다.

다만, 백오피스 or 사용자가 적음 or 검색엔진 도입하기에는 ROI가 맞지 않는 경우가 생각보다 많습니다.

이런 경우 개인적으로는 mysql n-gram으로 검색 기능을 많이 만듭니다.(일반적으로 RDB는 서비스에서 거의 필수로 사용)

 

관련하여 간단히 내용을 정리해둡니다.

  • 개인 메모 목적으로 작성하는 글이라서 생략되는 부분이 많습니다. 구글을 검색해보면 저보다 더 자세히 정리해둔 분들도 많으니 누락된 부분은 해당글을 확인하거나 mysql 공식 문서를 확인해보세요.

 

  1. N-gram이란?
    1. 전문 검색에서 보통 많이 쓰며 문자열에서 n개의 연속적인 단어 나열
    2. 예) abcd라는 문자
      1. N이 2라면 ab, bc, cd라는 인덱스
      2. N이 3이라면 abc, bcd라는 인덱스
  2. 테이블 생성
    -- 테이블 생성
    CREATE TABLE `articles` (
      `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
      `title` VARCHAR(200) NOT NULL COMMENT '제목',
      `body` TEXT COMMENT '본문',
      PRIMARY KEY (`id`,`title`),
      FULLTEXT KEY `title` (`title`,`body`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='글'​
  3. 사용 예
    -- 테스트 데이터 insert
    INSERT INTO articles(
    	title,
    	body
    ) 
    VALUES(
    	'국민연금 기금 적립금 900조원 돌파',
    	'25일 국민연금에 따르면 올 2분기 기금 적립금은 908조 3000억 원으로 집계됐다. 연금보험료(655조 4000억 원)와 운용 수익금(502조 3000억 원)을 합산한 금액에 연금급여(239조 6000억 원)와 관리 운영비(9조 8000억 원)를 제외한 게 적립금이다'
    )
    ;
    
    
    -- 쿼리 플랜 확인
    EXPLAIN
    SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('연금' IN NATURAL LANGUAGE MODE);​

쿼리 결과 확인

 

  1. n-gram token size
    1. InnoDB에서 n-gram의 최소 토큰 사이즈는 2
      mysql n-gram 토큰 사이즈 확인
    2. 중국어와 같이 1글자도 처리하고 싶으면 1로 변경
      1. 단, DB에 부하가 올라가겠죠.
  2. STOPWORD에 대해서
    1. 영어를 ngram으로 적용하였을 경우, a,for, to와 같은 검색결과 퀄리티를 떨어트리는 단어는 제외됨. 이를 stopword라고 함(참고 링크)
    2. 비 활성화 하고자 하면 innodb_ft_enable_stopword OFF
  3. 추가 팁
    1. AWS 오로라 DB는 ngram_token_size 수정 불가 -> 그냥 mysql rds사용
      1. 개인적으로는 오로라 DB가 좋아서 여러 서비스에서 사용 중
      2. 오라라 DB의 엔진이 업데이트되어서 현재는 수정 가능해졌을 수도 있음

메모. 개인적으로 사용하는 logback file appender 설정

 

  • 서비스를 운영시 파일로 log를 남길때는 아래 사항을 꼭 고려해야함
    • 로그 파일 용량이 너무 커서 vi로 오픈이 힘든걸 막아야함
    • 로그파일을 삭제 없이 계속 저장하면 disk full로 서비스 장애가 발생하니 주의
    • 적당한 보관기간으로 압축해서 롤링

logback.properties 설정

#로그파일 저장 디렉토리(유저/logs 디렉토리 하위에 서비스코드별로 디렉토리 구분)
log.file.dir=/home/svc_user/logs/svc_cd

#로그 파일 명(prefix에 환경코드 추가, 1개 서버에 blue/green 배포하는 경우를 위해서 was port별로 파일명 구분)
log.file.name=real_svc_cd_${server.port}.log

log.file.full=${log.file.dir}/${log.file.name}

#백업
log.file.backup.fileNamePattern=${log.file.dir}/backup/${log.file.name}_%d{yyyy-MM-dd}_%i.zip

#로그 패턴
log.pattern=%d{yyyy-MM-dd HH:mm:ss} [${HOSTNAME}] [%-5level] %logger{35}:%L - %msg%n

 

logback-spring.xml 설정(참고 링크)

 

  • 로그파일 1개는 20M로 유지
  • 최대 50의 로그파일을 유지
  • 최대 1000MB
  • 압축해서 롤링
 <!-- 외부 설정파일을 사용 -->
    <property resource="properties/logback.properties"/>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.file.full}</File>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.file.backup.fileNamePattern}</fileNamePattern>
            <maxFileSize>20MB</maxFileSize>
            <maxHistory>50</maxHistory>
            <totalSizeCap>1000MB</totalSizeCap>
        </rollingPolicy>
    </appender>

 

https://dzone.com/articles/top-35-git-commands-with-examples-and-bonus

'개발툴' 카테고리의 다른 글

postman 툴의 HTTP/2 지원과 관련  (0) 2020.04.21
putty세션 색깔 변경  (0) 2020.01.21

MIT라이센스의 JavaScript 이미지 압축 라이브러리

 

https://github.com/fengyuanchen/compressorjs

SW개발자로서 적성에 맞는지? 혹은 괜찮은 개발자인지 판단에 도움이 될만한 내용을 생각날때마다 정리하는 글입니다.

 - 주의: 해당 내용은 업계 선배분들이 얘기한 것도 있지만, 제 주관적인 생각도 있기 때문에 다른 분들과 생각이 다를 수 있습니다.

 

  1. 평생 학습할 수 있어야 합니다.
    1. 기술 발전이 빠른 업종이고, 새로운 기술로 어려운 문제를 쉽게 풀 수 있기 때문입니다.
      1. 처음 HDFS(하둡)를 봤을때 놀랐죠. 그전에는 1대의 머신에서만 어떻게든 문제 해결해야한다는 생각이 강했는데 여러 컴퓨팅파워를 이용해서 big data처리라니.. 어떻게든 오라클 SP 최적화하고 있었는데.. 요즘 elastic search의 클러스터도 그렇고요
  2. 팀플레이를 할 수 있어야합니다.
    1. 요즘에는 혼자 개발해서 서비스하기에는 SW규모가 너무 커졌습니다. 팀으로 서비스를 만들어야하는데 팀플레이가 안되면 곤란하죠.
  3. 끊기 있게 엔지니어링 문제를 열심히 풀 수 있어야합니다.
  1. MIT라이센스(수정, 배포가 자유로움)의 bootstrap admin 템플릿
    1. toy프로젝트 등을 개발할때 사용
    2. https://github.com/ColorlibHQ/AdminLTE
  2. 업무용으로는 돈주고 구매한 inspinia를 보통 사용
    1. Extended 버전이 100불정도였던것 같은데 현재 1400불(엄청 올랐네요. 개인적으로도 하나 구매해두려다가 안했는데 후회가..)
    2. https://wrapbootstrap.com/theme/inspinia-responsive-admin-template-WB0R5L90S

 

참고

 - 이메일을 주 커뮤니케이션 방법으로 사용하는 회사에서 근무시, 새로 입사하는 직원들에게 조언해주는 내용입니다.

 

1. 이메일은 두괄식으로 작성
2. 수신자가 많을시 To(받는사람)를 정확하게 명시
3. 이메일로 요청받은 업무가 시간이 걸린다면, 우선 선 회신을 진행(언제까지 확인 후 추가 회신한다는 형태로)
 - 발송자는 수신자가 업무를 F/U 한다는 내용을 인지시킴
4. 이메일 자동분류, 강조처리 기능 등을 사용해서 중요 이메일을 놓치지 않도록 함
 - 모바일 앱의 알림 설정도 진행
5. 읽지 않은 메일 숫자가 과하게 존재하면 안됨(모든 이메일은 확인 및 처리가 필요, 특히 본인이 수신자인 경우) 

 

기타 참고 : https://pathmaker.tistory.com/182

 

간단한 Testcase로 확인용 작성

	@Test
	void 두글자국가코드_및_국가명_리스트조회() {

		String[] countries = Locale.getISOCountries();
		//Arrays.stream(countries).forEach(System.out::println); //2글자 국가코드 리스트 확인

		for (String country : countries) {

			Locale l = new Locale("en", country);
			System.out.println(String.format("2글자 국가코드(ISO 3166-1 alpha-2): %s | 영문 국가명: %s | 한글 국가명: %s ", country, l.getDisplayCountry(new Locale("en")),
				l.getDisplayCountry(new Locale("ko"))));

		}

		System.out.println("countries 갯수: " + countries.length);

		Assertions.assertNotNull(countries);
		Assertions.assertTrue(countries.length >= 200); //2021년기준 249개국이 존재.(200개 국가 이상을 assert 체크 기준으로 함)
	}

+ Recent posts