Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
ⓒ NAVER Corp.
당신도 할 수 있는레거시 프로젝트 개선 이야기
작성자: 이경일([email protected], [email protected])소속팀/ 상위부서: 쇼핑데이터개발/ 쇼핑플랫폼, 비즈OCR개발/ Glace개발
ⓒ NAVER Corp.
레거시 코드란 무엇일까요?
이미지 출처 : https://village.oyaore.com
어디부터봐야할지막막한코드?
ⓒ NAVER Corp.
레거시 코드란 무엇일까요?
복잡한코드? (?)
ⓒ NAVER Corp.
레거시 코드란 무엇일까요?
남이(주로퇴사자) 짠코드? (니똥을왜내가...)
ⓒ NAVER Corp.
레거시 코드란
테스트코드로커버되지않으며
유지보수가되고있지않은코드 (유지보수가어려운코드)
ⓒ NAVER Corp.
개발자들이 레거시 코드를 외면하는 이유?
다른사람이짠코드는수정하기싫다.
신규프로젝트가훨씬재미있다.
조직에서인정받기어렵다??
ⓒ NAVER Corp.
레거시 코드를 다시 한번 보자!
오랜시간자신의역할을실행한안정적인코드
조직의축적된비즈니스로직의구현체
ⓒ NAVER Corp.
레거시 코드를 다시 한번 보자!
누군가말했다. ”The developers speak by the code.”
앞서운영했던개발자들의오랜Know-How 가있다.
ⓒ NAVER Corp.
결국 핵심은...
코드를개선하고내것으로만들어야한다는것!
날개선해줘난니꺼니까
그리고..등짝!등짝을보자!
레거시코드
ⓒ NAVER Corp.
레거시 코드 개선...
레거시코드를어떻게개선해야할까요?
DDD로바꾸세요. -> DomainDriven Development
MSA하세요.(후훗전저자싸인받았...)
ⓒ NAVER Corp.
레거시 코드 개선...
오늘이야기는이론적인내용이아닙니다. (사실저도몰...)
그냥제가책임감을가지고 (먹고살기위해) 서비스의
운영방식, 코드를개선한이야기를하고자합니다.
ⓒ NAVER Corp.
내편으로만들기
급한불부터끄기
한걸음씩가기
아픈곳고치기
조금더다듬기
오늘 할 이야기...
ⓒ NAVER Corp.
그전에...
BizOCRProject 를소개합니다.
ⓒ NAVER Corp.
BizOCR 프로젝트는요...
영수증이나, 사업자등록증인식 (이미지)
OCR을이용한이미지안의문자를추출하여정제함
Json Document 로출력함 (HTTP REST API 제공)
ⓒ NAVER Corp.
Naver: Myplace방문인증 (영수증이용)
Line, Naver: CONOMI (일본맛집, 영수증이용)
NaverBusiness Platform : 사업자등록증
NaverSmart Place : 사업자등록증
BizOCR 프로젝트는요...
ⓒ NAVER Corp.
If you are not with me, then you are my enemy.(잘리기싫으면나를빨리개선해라)
내 편으로 만들기...
ⓒ NAVER Corp.
첫만남
XX대의운영서버와1대의개발서버 (엄청난사양의)
내 편으로 만들기...
ⓒ NAVER Corp.
당시BizOCR을사용하는운영중인서비스는2가지
일본맛집서비스코노미, 한국사업자등록증
내 편으로 만들기...
ⓒ NAVER Corp.
내 편으로 만들기...
ⓒ NAVER Corp.
Spring 3.x
Tomcat 7
JDK 1.8
ETC...
내 편으로 만들기...
Tensorflow
OpenCV
Regular Expression
Google Vision API
ⓒ NAVER Corp.
그리고소스는정규식지옥...
내 편으로 만들기...
ⓒ NAVER Corp.
Transaction script 방식의Service Class.
모든로직이한Class 안에있는구조
내 편으로 만들기...
ⓒ NAVER Corp.
어떻게내편으로만들어야하나?
로직을파악하는것이최우선 (뭘알아야하던가말던가)
직접돌려보는것이역시가장좋음
내 편으로 만들기...
ⓒ NAVER Corp.
로직을파악하기위해서는역시TestCase를보는것!
하지만테스트케이스가없었음...
내 편으로 만들기...
ⓒ NAVER Corp.
성장(self landing)을위한기회... (라고정말로생각했음)
내 편으로 만들기...
ⓒ NAVER Corp.
테스트코드를짜기시작했습니다.
JUnit이아닌Spock Framework을사용했습니다.
내 편으로 만들기...
ⓒ NAVER Corp.
자연스럽게레가시코드를파악할수있음
Refactoring을할만한부분이보이기시작함
처음으로PR을날렸음
내 편으로 만들기...
ⓒ NAVER Corp.
베프까진아니더라도사친정도까진친해짐별로친해지고싶진않았지만(먹고살아야하니) 어쩔수없었음
내 편으로 만들기...
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
같이 타
죽즈아~!
당장해결해야할우선순위를정해야합니다.
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
같이일하는사람은총3명 (저포함)
감독이미지처리 잡부
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
이들에게급한불은총2가지
정규식을유지보수하기힘들다.
Application 구동시간이 너무오래걸린다.
팀장님
박사님
잡부
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
정규식을유지보수하기힘든이유...
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
하나를수정하고다시빌드해서검증... (무한반복)
이런식으로치환& 추출하는케이스는5개이상
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
OCR 작업중약50%는정규식작업소스코드의수정이필요없이정규식만수정을해야할상황이
생각보다많다는소리 (새로운패턴을추가한다든지)
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
OCR 작업중약50%는정규식작업
게다가순서가중요함2018年5月23日(水) 20時24分000101\n重さ(g특수문자, 의미없는숫자, 특수문자( ) $#% 등등제거
필요없는水같은요일TEXT 제거
날짜패턴(20\d{2}\s?[\-\/年\s]\s?(?:0[1-9]|1[1-2… 사용해서값추출
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
코드안에있는모든정규식을추출함
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
정규식을YML로 (즉설정으로서)분리함
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
YML -> MAP 변환후Loop 문으로처리함
소스코드량대폭적인감소& 유지보수가수월해짐대신그코드가설정으로갔다는....
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
다음급한문제는구동시간이너무오래걸린다는것
약1분이상...
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
왜이렇게오래걸리는지살펴보니...
Oracle, ElasticSearch, 각종캐싱, 각종Bean...초기화
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
쓰지도않는불필요한초기화가너무많음
원인은Common library
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
Common library 소스분석후필요한부분을찾음
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
크게3가지를사용하고있음
API 통신관련설정들 (주소, 호출파라미터정의)
상황별Exception, Json 관련로직, 각종DTO객체들
XML로 Inject 되고있던Bean 객체들
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
과감하게Dependency 삭제
Common Library에서꼭필요한부분만복사함
Custom 된Class 대신Spring의Feature를사용함주로RestTemplate같은...
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
XML 설정부분을properties + Java config로수정
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
오류나는부분전부찾아서수정후...
미리짜둔테스트케이스로검증함
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
내친김에Spring 3.x를버리고Spring Boot로...
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
새로운Repository 생성후
기본적인Spring Boot MVC 프로젝트세팅함
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
새로운Repository 생성후
기본적인Spring Boot MVC 프로젝트세팅함
여기에기존소스를복사함
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
팀장님께코드리뷰를(라고쓰고허락이라고읽는다)받고
일부서버에배포를해서검증을했음
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
문제가없어서전부배포함
다같이소고기먹었음 (삼합... 또먹고싶...)
ⓒ NAVER Corp.
급한 불부터 끄기... (운영 중이기 때문에)
구동시간감축으로인한Local 작업효율향상
약1분~ 2분걸리던시간을3~5초로감소
Spring 3.x에서Spring Boot로Framework 버전업
Common Library제거로인한프로젝트독립
ⓒ NAVER Corp.
한 걸음씩 가기
A journey of a thousand miles begins with a single step.
ⓒ NAVER Corp.
코드패키지분리
한 걸음씩 가기
ⓒ NAVER Corp.
프로세스의흐름을정리하면...
Base64 encoded
Regular Expression
한 걸음씩 가기
ⓒ NAVER Corp.
이미지가들어오면구분, Validation
Base64 encoded
Regular Expression
한 걸음씩 가기
ⓒ NAVER Corp.
이미지데이터를메모리에올림
Base64 encoded
Regular Expression
한 걸음씩 가기
ⓒ NAVER Corp.
이미지를편집함
Base64 encoded
Regular Expression
한 걸음씩 가기
ⓒ NAVER Corp.
OpenCV와, Tensorflow사용
Base64 encoded
Regular Expression
한 걸음씩 가기
ⓒ NAVER Corp.
편집한이미지를Vision API 호출, 결과정제
Base64 encoded
Regular Expression
Base64 encoded
한 걸음씩 가기
ⓒ NAVER Corp.
이미지를Base64 encoding 하면용량이약25%UP
Base64 encoded
Regular Expression
Base64 encoded
한 걸음씩 가기
ⓒ NAVER Corp.
좌표와데이터를이용해서라인보정
Base64 encoded
Regular Expression
Base64 encoded
한 걸음씩 가기
ⓒ NAVER Corp.
기본정규식을이용한TEXT 제거, 치환
Base64 encoded
Regular Expression
Base64 encoded
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을이용한정보추출 (상호, 날짜, 전화번호, 주소, 메뉴, 금액)
Base64 encoded
Regular Expression
Base64 encoded
한 걸음씩 가기
ⓒ NAVER Corp.
요구사항에따른Json Document 생성
Base64 encoded
Regular Expression
Base64 encoded
한 걸음씩 가기
ⓒ NAVER Corp.
어떻게분리를할지고민
Base64 encoded
Regular Expression
한 걸음씩 가기
ⓒ NAVER Corp.
Base64 encoded
Regular Expression
이미지 분류, 검증
한 걸음씩 가기
ⓒ NAVER Corp.
Base64 encoded
Regular Expression
이미지 처리 부분
한 걸음씩 가기
ⓒ NAVER Corp.
Base64 encoded
Regular Expression
API 통신 부분
한 걸음씩 가기
ⓒ NAVER Corp.
Base64 encoded
Regular Expression라인 보정 부분
한 걸음씩 가기
ⓒ NAVER Corp.
Base64 encoded
Regular Expression
정규식 처리
한 걸음씩 가기
ⓒ NAVER Corp.
그리고모든곳에서사용되는Static Util부분
Base64 encoded
Regular Expression
Static Util
한 걸음씩 가기
ⓒ NAVER Corp.
Package 구조를결정함
Reader 부분은언제든분리가가능하도록설계함
한 걸음씩 가기
ⓒ NAVER Corp.
Package 구조를결정함
모든부분을언제나쉽게분리를하기위해신경을씀
한 걸음씩 가기
ⓒ NAVER Corp.
OCR의핵심기능...
이미지전처리
정규식후처리
이미지 출처 : https://economiology.com/핵심감사제도-
한 걸음씩 가기
ⓒ NAVER Corp.
image : 이미지전처리모듈
다양한상태의영수증이들어옴
한 걸음씩 가기
ⓒ NAVER Corp.
image : 이미지전처리모듈
OpenCV를이용한영수증영역검출, 이미지편집
Tensorflow학습데이터를이용한각도보정
학습데이터수집을위한이미지로깅
한 걸음씩 가기
박사님
ⓒ NAVER Corp.
image : 이미지전처리모듈이왜필요할까요?
OCR 엔진이이미지를더잘읽을수있게하기위해
반복적인노가다를통해Magic Number를찾아야함
한 걸음씩 가기
ⓒ NAVER Corp.
OCR의핵심기능...
이미지전처리
정규식후처리
이미지 출처 : https://economiology.com/핵심감사제도-
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을사용한후처리부분
텍스트보정-replacer
텍스트검출-matcher
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을사용한후처리부분-Replace
매우심플한케이스인데요...
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을사용한후처리부분-Replace
대부분이렇게복잡해요.
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을사용한후처리부분-Replace
이미지전처리과정-OCR 엔진으로호출
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을사용한후처리부분-Replace
원본텍스트검출
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을사용한후처리부분-Replace
라인보정
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을사용한후처리부분-Replace
필요없는텍스트제거
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을사용한검출부분-Matcher
숍이름, 일시, 주소, 전화번호, 메뉴, 가격등을추출
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을분야별로구분하여관리함
한 걸음씩 가기
ⓒ NAVER Corp.
편한유지보수와개발을위해디버깅툴을만듬
한 걸음씩 가기
ⓒ NAVER Corp.
정규식Loop 문으로돌려체크하는방식어떤정규식에걸려서텍스트가변경되었는지추적이어려움
한 걸음씩 가기
ⓒ NAVER Corp.
Local에서복잡한정규식디버깅을위해로그를만듬
한 걸음씩 가기
ⓒ NAVER Corp.
정규식을수정했을때종종있는상황
전에는잘나왔는데지금은안나와요~ !
한 걸음씩 가기
ⓒ NAVER Corp.
Local, Stage 동일요청결과비교하는툴개발
한 걸음씩 가기
ⓒ NAVER Corp.
Local, Stage 동일요청결과비교하는툴개발
한 걸음씩 가기
ⓒ NAVER Corp.
공통으로사용하는부분
전화번호, 일자, 시간
한 걸음씩 가기
ⓒ NAVER Corp.
전화번호는전세계가비슷한포맷을사용함
하나의클래스를같이쓰려고만들었지만...
생각보다클래스크기가너무커졌음
그래서동일한부분은같이쓰고다른부분은주입으로해결
한 걸음씩 가기
ⓒ NAVER Corp.
전화번호중다른부분은국번 (지역번호)
한 걸음씩 가기
ⓒ NAVER Corp.
한국은생각보다심플함
지역번호가몇개없음
한 걸음씩 가기
ⓒ NAVER Corp.
헐...그런데일본은?
A4로16페이지...
중복제거하니388개
한 걸음씩 가기
ⓒ NAVER Corp.
YML 파일로독립후사용
한 걸음씩 가기
ⓒ NAVER Corp.
전화번호Class의역할을분리함
MainClass-전화번호의패턴만확인후추출함
한 걸음씩 가기
ⓒ NAVER Corp.
Interface를하나만들고...
한 걸음씩 가기
ⓒ NAVER Corp.
구현 Class를만들어줌
국가별로다른부분을구현하여주입
한 걸음씩 가기
ⓒ NAVER Corp.
전화번호Class의역할을분리함
MainClass-전화번호의패턴만확인후추출함
CodinatorClass-추출된전화번호를국가에맞춰검증& 보정
한 걸음씩 가기
Testcase 작성후검증
ⓒ NAVER Corp.
전화번호가잘인식되었는지 (기획자가)검증방법은?
전화번호의앞자리 (지역번호)가잘인식되었는지
전화번호포맷에맞는지
정답셋과비교 (알바군단이작성한...)
한 걸음씩 가기
ⓒ NAVER Corp.
또다같이소고기먹었음 (삼합... 또먹었...)
전화번호인식률
98%이상
한 걸음씩 가기
ⓒ NAVER Corp.
CPU 절약하기
아픈 곳 고치기
ⓒ NAVER Corp.
CPU 사용량이높은성격의로직
아픈 곳 고치기
ⓒ NAVER Corp.
CPU 사용량이높은성격의로직 (왜이렇게CPU를많이쓰지?)
Thread 중CPU를가장많이쓰는순으로추출
아픈 곳 고치기
ⓒ NAVER Corp.
CPU 사용량이높은성격의로직 (왜이렇게CPU를많이쓰지?)
Thread 중CPU를가장많이쓰는순으로추출
http://bit.ly/2Uvvyhz<-추출방법정리해보았습니다.
아픈 곳 고치기
ⓒ NAVER Corp.
CPU 사용량이높은성격의로직 (왜이렇게CPU를많이쓰지?)
ThreadDump받아서확인
아픈 곳 고치기
ⓒ NAVER Corp.
CPU 사용량이높은성격의로직 (왜이렇게CPU를많이쓰지?)
OpenCV + Tensorflow의이미지편집
아픈 곳 고치기
ⓒ NAVER Corp.
CPU 사용량이높은성격의로직 (왜이렇게CPU를많이쓰지?)
보다정확하게Profiling을해봅니다.
아픈 곳 고치기
ⓒ NAVER Corp.
CPU 사용량이높은성격의로직 (왜이렇게CPU를많이쓰지?)
당장할수있는게없어... (매우안타까웠습니다. )
아픈 곳 고치기
ⓒ NAVER Corp.
제가짠코드를다시살펴보기시작했죠.
팀장님에게CPU 떨어트리겠다고호언장담을...
아픈 곳 고치기
ⓒ NAVER Corp.
정규식을순회하는부분에서Pattern 객체생성부분
순회를할때마다객체를새로만드는문제
아픈 곳 고치기
ⓒ NAVER Corp.
Local Cache Map을만들어서해결함
정규식패턴은변경되지않기때문에...
CPU 사용량그다지차이는크지않음 (티끌모아태산이라고주장함)
아픈 곳 고치기
ⓒ NAVER Corp.
Memory 절약하기
아픈 곳 고치기
ⓒ NAVER Corp.
서버의램은128GB를장착한고사양의서버
JVM memory는32G를사용...
이미지 출처 : https://m.post.naver.com/viewer/postView.nhn?volumeNo=6647722&memberNo=36047368
아픈 곳 고치기
ⓒ NAVER Corp.
아니왜이렇게램을많이쓰지?
HeapDump를받아분석
Memory Leak이발견됨
아픈 곳 고치기
ⓒ NAVER Corp.
좀더디테일한분석을위해서Profiling을시작함
OpenCV의객체가많은메모리점유
Java 환경에서처음사용해봐서발생한문제
아픈곳고치기
ⓒ NAVER Corp.
OpenCV를사용해서생성한객체는 (Mat 객체)
명시적인 Release가필요함... (아니이게무슨…)
아픈 곳 고치기
ⓒ NAVER Corp.
동일한조건에서테스트한결과
많이좋아짐...
아픈 곳 고치기
ⓒ NAVER Corp.
여기까지작업해서32G -> 24G까지낮춤...
그래도너무Memory를많이쓰고있음...
HeapMemory그래프를보면... (엄청쓰고있음덜덜덜)
아픈 곳 고치기
ⓒ NAVER Corp.
다시Profiling으로해봄...
char, byte Array 용량이... (이건뭐지?)
아픈 곳 고치기
ⓒ NAVER Corp.
문제가있는코드를보면... (별문제없어보이는간단한메서드)
Request 당약아래의코드가2xxx 번정도실행됨
String Size가작지않음
Return 할때마다새로운문자열이메모리에만들어짐
아픈 곳 고치기
ⓒ NAVER Corp.
제가생각하는개선포인트
메모리공간을재사용했으면좋겠다. -> StringBuilder사용
그리고빠르게GC 되었으면좋겠다.
Google,Github에서쓸만한라이브러리가있나검색...
아픈 곳 고치기
ⓒ NAVER Corp.
benelog님에게코드리뷰를부탁드림 (NaverPaaS)
아픈 곳 고치기
ⓒ NAVER Corp.
benelog님에게코드리뷰를부탁드림 (NaverPaaS)
해결책이나옴!!! -> 등잔밑이어둡다.. 라고하셨음..
Java의기본API 중Matcher의AppendReplacement
아픈 곳 고치기
ⓒ NAVER Corp.
Matcher_AppendReplacement
그런데문제가있음...
StringBuffer
아픈 곳 고치기
ⓒ NAVER Corp.
Matcher_AppendReplacement
그런데문제가있음...
StringBuffer->Jdk9부터는StringBuilder
아픈 곳 고치기
ⓒ NAVER Corp.
내친김에OpenJDK 11로업글...(남자라면최신)
아픈 곳 고치기
ⓒ NAVER Corp.
아픈 곳 고치기
최종코드
Loop 문의시작전에만들StringBuilder를buffer로재사용
아래의코드는예시코드입니다.
ⓒ NAVER Corp.
아픈 곳 고치기
결과는?
메모리사용량대폭감소!!
ⓒ NAVER Corp.
아픈 곳 고치기
결과는?
메모리사용량대폭감소!!
또다같이소고기먹었음 (삼합... 또먹었...)
ⓒ NAVER Corp.
아픈 곳 고치기
결과는?
메모리사용량대폭감소!!
HeapMemory24G -> 8G까지조절
ⓒ NAVER Corp.
아픈 곳 고치기
어? 그런데뭔가이상함...
n-gringer를이용한부하테스트1시간진행
FullGC가나기시작하다가... 사망...
그런데특별한오류로그가없음
ⓒ NAVER Corp.
아픈 곳 고치기
눈물을흘리며다시JVM Memory 조정
HeapMemory 8G -> 24G
n-gringer를이용한부하테스트1시간진행-> 문제없음
HeapMemory 24G -> 16G
n-gringer를이용한부하테스트1시간진행->문제없음
n-gringer를이용한부하테스트2시간진행->사망
ⓒ NAVER Corp.
아픈 곳 고치기
단서를찾기시작함
Profiling, ThreadDump, HeapDump-> 별이슈없음...
ⓒ NAVER Corp.
아픈 곳 고치기
그래서Linux system 로그를확인함
OOM Killer 로그확인!
ⓒ NAVER Corp.
아픈 곳 고치기
JVM 때문에사망한것이아니라고판단함
범인은OpenCV 일것으로예상 (Native Memory Release)
OpenCV를사용하기위해사용한JavaCPP라이브러리에서
문제가발생했다고생각했음
ⓒ NAVER Corp.
아픈 곳 고치기
이번에는이명현님과의논함 (Naver PaaS)
ⓒ NAVER Corp.
아픈 곳 고치기
이번에는이명현님과의논함 (Naver PaaS)
당시사용한OpenJDK Version -> 11.0.1
OpenJDK Version -> 10.0.2
3시간이상TEST 문제없음
ⓒ NAVER Corp.
아픈 곳 고치기
기쁨의눈물을흘리며다시JVM Memory 조정
HeapMemory 16G -> 8G
n-gringer를이용한부하테스트3시간이상진행->문제없음
ⓒ NAVER Corp.
아픈 곳 고치기
다시Profiling으로해봄...
char[] 232MB -> 9MB
byte[] 199MB -> 68MB
ⓒ NAVER Corp.
아픈 곳 고치기
OpenJDK 11.0.2가나옴... (바로테스트함)
ⓒ NAVER Corp.
아픈 곳 고치기
OpenJDK 11.0.2가나옴...
OpenJDK 11.0.1과동일하게사망...
ⓒ NAVER Corp.
아픈 곳 고치기
JDK 12에서이이슈인것으로예상되는내용이 패치가됨
물론(아직) 테스트는해보지못했음...
조만간해볼예정...
https://www.oracle.com/technetwork/java/javase/12-relnote-issues-5211422.html
ⓒ NAVER Corp.
아픈 곳 고치기
Heap Memory 32G -> 8G
Oracle Java8 -> OpenJDK 10
Boot Instance 1개-> 2개
ⓒ NAVER Corp.
조금 더 다듬기
OCR 엔진바꾸기
ⓒ NAVER Corp.
Google Vision 개발되어있는프로젝트 (호출할때마다돈이..)
ClovaOCR 엔진이개발될예정 (사내프로젝트)
처음이야기했던일정보다엄청빨리나올상황...
조금 더 다듬기
ⓒ NAVER Corp.
Clova가나왔을때바로갈아껴야하는상황
API 요청 interface를만들고
API 호출한결과셋을표준결과셋으로만듬
조금 더 다듬기
ⓒ NAVER Corp.
조금 더 다듬기
준비를끝내고마침내Clova API 가나왔습니다.
코드작성, 테스트검증, 배포까지딱30분걸림
ⓒ NAVER Corp.
조금 더 다듬기
Google Vision에비해넘사벽으로좋은인식성능
오인식보정을위한정규식의10% 정도가필요없어짐
김진중,안종필님감사합니다.
ⓒ NAVER Corp.
조금 더 다듬기
I / O 줄이기
ⓒ NAVER Corp.
조금 더 다듬기
Base64 encoded
Regular Expression
I / O 가많이발생하는부분
편집이된이미지저장-> DISK에저장OCR 엔진결과저장-> DISK에저장
ⓒ NAVER Corp.
조금 더 다듬기
서버에RAM이넘쳐흐르는상황
당연히RAM Drive 사용
Linux /dev/shm파티션사용 (소스코드수정최소화)
/dev/shm에저장된 image, text 파일을주기적으로network disk에이동하는스크립트작성
ⓒ NAVER Corp.
조금 더 다듬기
결과는약20TPS이상향상!
코드수정거의없이...
ⓒ NAVER Corp.
조금 더 다듬기
Spring Cloud Config 적용
ⓒ NAVER Corp.
조금 더 다듬기
OCR의운영업무중정규식작업이큰비중을차지함
정규식하나수정하고배포를하기에는비효율적
정규식은미리YML로분리된상태
ⓒ NAVER Corp.
조금 더 다듬기
Spring Cloud Config 서버적용!
갱신은기존에있는Jenkins를사용한curl 호출!
배포없이빠른정규식적용가능
다른사람일시켜먹기도좋다!
꼭필요한것만사용하는것도방법
ⓒ NAVER Corp.
조금 더 다듬기
Spring Cloud Config 운영할때이슈발생!
갑자기YML 설정파일을찾을수없다고...
ⓒ NAVER Corp.
조금 더 다듬기
Spring Cloud Config는YML, Properties를File로저장
Linux의/tmp에저장하는데...
Linux는특정기간access가없으면지워버림... (덜덜덜)
당연히파일이없으면새로받아오긴하는데...
저장소가느리다면? 저장소가장애라면? (기본timeout 5초)
ⓒ NAVER Corp.
조금 더 다듬기
Spring Cloud Config 설정을바꾸는것이좋음
ⓒ NAVER Corp.
조금 더 다듬기
Spring Cloud Config 관련궁금하신분들은
http://bit.ly/2vlbhRu <-여기를참고하세요.
ⓒ NAVER Corp.
복잡한정규식코드-> YML로분리, 정규식수련
Spring3.X, Common lib -> SpringBoot, 프로젝트독립
Application Start Time 1분이상-> 3~5초
Memory 사용량32G -> 8G
CPU,Memory사용량절약-> 인스턴스1개더추가
시간관계상이야기하지못한경험들...
도메인지식습득, 내서비스가됨
결과를 정리해보면...
ⓒ NAVER Corp.
정리하며...
더하고싶은이야기가많지만시간관계상생략…
Apache, Tomcat -> Nginx + Spring Boot
Nginx Traffic Throttling
Graceful Shutdown
ELK stack 적용
GC튜닝
기타등등...
또기타등등...
ⓒ NAVER Corp.
다이루었다... IT에서는잘못된말이다...
아직저의개선은끝나지않았습니다.
저랑같이하실분?
정리하며...
ⓒ NAVER Corp.
계속적인관심과업그레이드, 리팩토링이필요함
정리하며...
ⓒ NAVER Corp.
개밥먹기를하세요.
정리하며...
ⓒ NAVER Corp.
일본에서직접테스트해본영수증의흔적들...
정리하며...
ⓒ NAVER Corp.
한국에서도열심히구석구석다니며테스트
정리하며...
ⓒ NAVER Corp.
개밥먹기를하세요.
TestCase는TestCase일뿐필드에서일어나는일을
전부커버할순없다.
정리하며...
ⓒ NAVER Corp.
피할수없다면즐기자
코드에서도메인지식을습득해내것으로만들자
정리하며...
ⓒ NAVER Corp.
Naver 쇼핑데이터플랫폼, 플레이스는 개발자를
모집하고 있습니다. (특히 BizOCR같이 하실분?!!)
네이버에지원한다
네이버에지원한다네이버에지원한다.
[email protected] 으로문의주셔도됩니다.
ⓒ NAVER Corp.
Thank You.