본문 바로가기

프로그래밍

SK 에이브릴 왓슨 챗봇 엔티티 리턴값이 엉망 그자체 왓슨 본사의 WA 서울 진출로 인해 NLP 사업 철수중인 SK에이브릴. 챗봇 프로젝트를 거듭할수록 관리가 엉망이라는걸 느낄 수 있었다. 2019년 여름, 수시로 왓슨 서비스가 죽어서 개발도 운영도 진행할 수 없는 상태였다. 난 고객에게 챗봇 오류 발생원인과 재발방지 대책을 설명해야하는 입장인데, SK 에이브릴 측에 문의하면 1주일 넘어서 답변이 오고, 재현이 불가해서 답변할 수 없다는 말만 반복이었다. 이런식으로 운영하면 나와 같은 중간 업체는 어떻게 믿고 서비스를 사용할 수 있을까? 이런 나의 상황설명과 함께 책임감을 갖고 답장달라는 식으로 문의를 했더니 이번에는 조금 더 빠르게 윗사람의 답변을 받을 수 있었다. 그러나 우리 회사의 솔루션이 어떻게 동작하는지 상세히 기술하라는 양식의 문서였다. 우리 회.. 더보기
자바스크립트 날짜 Date 객체 사용시 IE 유의하기 (NaN으로 출력됨) 날짜를 선택하는 캘린더 필드가 여러가지 있는 화면을 담당했다.시작일을 선택하면 다른 캘린더 필드에 조건과 값을 동적으로 업데이트하는 과정에 버그가 있었다. 유저가 선택한 날짜를 yyyy.mm.dd 포맷으로 저장해서 Date 객체로 만들었다. 1234function(selectedDate) { //yyyy.mm.dd var anotherDate = new Date(selectedDate) ...}Colored by Color Scriptercs 크롬에서는 anotherDate 값이 정상적으로 출력되는데 IE에서는 NaN.NaN.NaN으로 출력된다. Date 객체에 string을 넣을때에는 반드시 parse 함수를 함께 사용해야 한다.Date.parse(string) 1234function(selectedD.. 더보기
setState() 저장되지 않을때 드로이드나이츠에 참석했을때 react를 알게 되었는데 내가 직접 사용하게 될 줄이야. react를 공부하면서 백오피스 웹을 개발중이다. 선택목록 컴포넌트에서 값을 변경할 때마다 state에 저장하려고 한다.값이 변할때마다 componentWillReceiveProps()가 호출된다.아래 코드처럼 setState()를 하고나서 바로 console에서 state 값을 찍어봤더니 객체가 비어있다.왜 setState()가 안되지? 12345678910111213141516constructor(props) { super(props); this.state = { person: { name: '', sex: '' } }} componentWillReceiveProps(nextProps){ if(nextProps.pe.. 더보기
자바스크립트 연관배열로 특수문자 및 기호가 포함된 property의 이름을 string으로 참조할 수 있다. DB 테이블에 저장된 행 갯수를 구해야 해서 count 쿼리문을 실행했다.1select count(*) from postscs 결과값으로 넘어오는 데이터는 이렇게 생겼다.1[ RowDataPacket { 'count(*)': 5 } ]cs rowDataPacket에 들어있는 count(*) 속성의 값이 필요하다. 하지만 특수문자 및 기호가 포함된 속성이라 undefined가 뜬다.1console.log(result[0].count(*));cs 이럴 때! 자바스크립트의 연관배열을 사용하면 해결할 수 있다.자바스크립트가 인식할 수 없는 속성 이름을 대괄호[ ]로 감싸면 string으로 읽어온다.1console.log(result[0].[count(*)]);cs 더보기
[Eclipse] Maven 프로젝트인지 구별하는 방법 :: pom.xml 웹프로젝트 유지보수가 시작되었다. 소스도 받고 이도 설치했다. 메이븐 프로젝트는 import 방법이 다르다. 우선, 소스에 pom.xml 파일이 있으면 메이븐 프로젝트다. 이클립스에서 메이븐 프로젝트를 import하는 방법은, 이클립스 실행 > 프로젝트 탐색창에서 마우스 우클릭 > import > import Maven > Existing Maven Projects > Next 소스 폴더를 선택하고 pom.xml 파일만 선택하고 OK하면 된다. 더보기
정규표현식 재미있다. 정규표현식을 이용해서 replaceAll과 같은 역할을 하는 함수를 만들었다. fullStr.replace(/NAY/gi, "RAY"); 를 호출하면 fullStr의 문자중에 "NAY"를 모두 "RAY"로 변경한다. 하지만 내가 구현해야 하는 부분은 치환할 종류가 세가지이다. 고객명, 회사명, 사용자명. 역할은 동일하니까 치환자를 파라미터로 받아서 처리하도록 구현했다. 헉 하지만 /NAY/gi 부분의 NAY를 변수에 저장해서 호출하니까 제대로 동작하지 않는다. 검색해봤더니 정규표현식에서 변수를 사용하려면 반드시 RegExp()를 호출해야 한단다. 1234// fullStr에 있는 모든 searchStr을 replaceStr로 치환getReplaced:function(fullStr, searchStr, r.. 더보기
[네트워킹] 그림으로 배우는 Http&Network Basic, 목표기간 3주! 개발하면서 네트워킹 지식이 모자람을 많이 느낀다. 멀티파트, 바이너리 싣는것, Volley 이용, HTTP 통신 처리용 내부 라이브러리 이용 등... 한계점이 느껴진다. 그리하여 개발자 커뮤니티에서 강추한 HTTP 완벽 가이드를 구매했지만, 와아 어려워서 책장이 안넘어간다. HTTP 공부 시작도 못해보고 정체기였는데 회사 상사님께서 보고계시던 책이 눈에 들어왔다!!!!! 그래! 이 책을 먼저 읽고나면 HTTP 완벽 가이드를 읽을 수 있을거야! 흔쾌히 책을 빌려주셨다. 감사합니다 ㅎ.ㅎ! 나는 3주안에 이 책을 읽을것이기에 상세한 목표설정을 했다. 이번주는 1장부터 5장까지 읽어야지! 더보기
POST, MIME-Type, Content-Type, multipart, x-www-urlencoded 안드로이드 앱에서 유저의 프로필 이미지를 서버에 업로드하는 API를 구현중이다. 이 API는 POST 방식이고 Content-Type은 x-www-urlencoded 이다. API를 구현하기에 앞서 꼭 알고 있어야하는 지식들에 대해 정리해보았다. MIME-Type과 Content-Type의 관계는 이렇다. 이제 이 모든것의 퍼즐 조각을 맞추면 아래와 같은 맥락이다. 클라이언트와 서버가 있고, HTTP 프로토콜을 통해 request 또는 response를 한다. 이 때 HTTP 프로토콜의 헤더에는 중요한 정보들이 담겨있다. 헤더의 Content-Type을 확인하고 multipart이면 여러 데이터가 있을것이므로 바디를 확인한다. 이 때 여러 데이터를 구분하는 방법은 헤더에 선언된 boundary이다. 학교.. 더보기