![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b73Rsz/btsy35sEVLx/kI8AZ0Cnvsdqkqkq5XRcE0/img.png)
현재 개발 중인 서비스에서 본인 인증 기능이 필요해졌다. 한번쯤 써봤을 PASS 본인인증 같은 기능이다. 내가 인증 대상이 될 때는 몰랐는데, 본인 인증 기능을 개발하려니 업체 선정에서부터 어려운 점이 생겼다. 결국은 요금이 가장 큰 걸림돌되었고,(현재 서비스는 사용량이 썩 많지 않다.) 우선 대표적인 국내 업체 두 곳을 비교했다. 구글링을 하면 가장 먼저 나오는 곳은 PASS와 드림시큐리티였다. 하지만 두 업체는 가장 먼저 후보군에서 제외 됐다. 두 곳 모두, 기본료가 청구된다는 것이다. 서비스 이용자가 많지 않아서 기본료가 청구되는 상황은 배보다 배꼽이 크다 판단했다. 또 SDK에 대한 정보가 하나도 없어서 구현 난이도나 주고 받는 정보가 우리 서비스에 맞을지 가늠이 잘 안됐다. (인증 UI까지 제공..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bKTYMV/btsy4kwSlHl/c8SPQjLEhcacPMPgCRf5VK/img.png)
핸드폰 SMS 인증을 개발하면서 해외의 SMS 서비스를 사용하면서 핸드폰 번호 포맷 변환 기능이 필요하게 되었다. Twilio에서는 E.164이라는 핸드폰 번호 국제 표준을 사용한다. 해외 서비스를 이용하면서 SMS 인증을 해본 사람들은 한번씩 다 봤을 번호 체계이다. E.164 format 이란? 우리나라의 country code는 +82 이다. 그리고 우리나라의 핸드폰 번호는 대부분 010 - xxxx - xxxx 이다. 이 번호들을 기준으로 E.164 format으로 핸드폰 번호를 변경하면 +8210xxxxxxxx 이 된다. 그런데 문제는 오래된 번호 사용자들은 010이 아닐수도 있고 11자리가 아닐수도 있다. 이걸 하나씩 하드코딩할 수는 없어서 괜찮은 라이브러리가 있어서 소개해보려고 한다. lib..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cvOq31/btssf0TFU6V/MeyQkgiy3t1H2b1pvqrFck/img.png)
이전 글에서는 QueryDSL을 왜 도입하려했는지, 왜 선택했는지 다른 툴과 비교 분석을 해봤다. 이번 글은 스프링부트에 어떻게 설치하고 사용할지 작성해보려 한다. build.gradle plugins { id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' ... } dependencies { implementation "com.querydsl:querydsl-jpa:5.0.0" implementation "com.querydsl:querydsl-apt:5.0.0" ... } def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDi..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bWmEKB/btsr4W4VkEE/hGgBaWkWKMraCxZt5LDM0K/img.png)
java의 poi를 이용해 엑셀파일을 핸들링할 일이 생겼다. poi는 엑셀 파일을 핸들링하기 위해 workbook이라는 객체를 생성한다. 별 생각없이 객체를 생성해서 사용하는데 IntelliJ에서 아래와 같은 알림을 던져줬다. try-with-resources으로 덮으라는데 이게 뭘까? 일단 클릭해본다. 그러면 try 구문으로 해당 라인이 변경된다. try (Workbook workbook = new XSSFWorkbook()) { Sheet sheet = workbook.createSheet(sheetName); ... catch (IOException e) { e.printStackTrace(); } try-with-resources 구문을 왜 쓸까? try-with-resources 구문은 Java..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ps3vd/btsrEr5pgBJ/d6xKKLeKWcKfgnAMKfcmhk/img.png)
List의 element를 삭제하는데 위와 같은 에러가 발생했다. 코드를 보면 별 내용은 없다. 리스트의 첫 번째 요소를 삭제하는 코드이다. List lines = Arrays.asList(str.split("\n")); lines.remove(1); 에러가 발생하는 이유는 Arrays.asList()로 생성된 리스트는 고정 크기 리스트이기 때문이다. 고정 크기 리스트이기 때문에, remove도 안되지만 add도 안된다. 해결법은 간단하다. 가변 크기의 리스트로 변환하면 된다. ArrayList는 가변크기의 리스트니까 아래와 같이 ArrayList로 재선언해주면 정상적으로 사용가능하다. List lines = new ArrayList(Arrays.asList(str.split("\n"))); lines...
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/eaVo3r/btspH0OtZFl/YPczhP9W65RbobOuM3dSb0/img.png)
이전에 썼던 글에서 언젠가 Redis로 넘어갈 거라고 했었는데, 결국은 안정성 문제로 Redis를 쓰게 됐다. Redis가 고성능 인메모리 캐시라는 것 정도만 알고 있는데, 사용하기 전에 한번 짚고 들어가자. Redis 란? Redis는 데이터베이스, 캐시, 메시지 브로커 및 스트리밍 엔진으로 사용되는 오픈 소스(BSD 라이센스), 메모리 내 데이터 구조 저장소 입니다. Redis는 문자열, 해시, 목록, 세트, 범위 쿼리가 있는 정렬된 세트 , 비트맵 , 하이퍼로그로그 , 지리공간 인덱스 및 스트림과 같은 데이터 구조를 제공합니다. Redis에는 복제 , Lua 스크립팅 , LRU 제거 , 트랜잭션 및 다양한 수준의 디스크 지속성이 내장되어 있습니다. Redis Sentinel을 통한 고가용성과 Red..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cK3nAx/btsmIiEUSZ2/82KxyTAkc4zWlZ5Vj7UnwK/img.png)
6월 16일에 OpenAI가 업데이트 되었다. 몇 가지 모델이 업데이트 되었고, 토큰 수 증가와 함께 Function calling이란 기능도 함께 추가되었다. 이전 포스팅에서 토큰 수 증가로 대화 유지를 원활하게 할 수 있다는 것에 대해 다뤘으니, 이번에는 Function calling에 대해 알아보자. Function calling이란? Open AI reference에서 Function calling의 일부를 발췌했다. API 호출에서, 사용자가 gpt-3.5-turbo-0613, gpt-4-0613 모델에 함수를 설명할 수 있습니다. 모델이 이러한 함수를 호출하기 위한 인수가 포함된 JSON 개체를 출력하도록 지능적으로 선택하도록 할 수 있습니다. Chat Completions API는 함수를 호..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bYMdDF/btsGBsAZgXF/Y3WG7IAsPkurIecChKeK3k/img.png)
에디터에서 문서를 작성하고, 서버로 텍스트를 전달한다면 기본적으로 HTML태그들이 포함되서 넘어오게 된다. 하지만 데이터 분석을 위해서는 HTML태그를 제거한 순수 텍스트에 대한 정보가 필요하다. 슬프게도 자바 혹은 스프링에서 자체적으로 HTML태그를 뚝딱 제거하는 기능이 없다 ㅠ 굳이 방법이 있다면, 정규식을 이용하는건데 이 방법은 별로 추천하고 싶지 않은 방법이다. (정규식을 정교하게 짜지 않는다면, 사용자가 실수로 넣은 기호들이 제거될 수도 있다) 당연한 이야지만 정규식을 사용하지 않고 HTML 태그를 제거하는 방법이 있다. JSoup라는 라이브러리인데, 이 라이브러리를 이용해 HTML 태그를 제거하는 방법을 소개하고자한다. JSoup JSoup은 HTML 문서에 저장된 데이터를 구문 분석, 추출 ..
- Total
- Today
- Yesterday
- AWS EC2
- Log
- springboot
- EKS
- MySQL
- 스프링부트
- GIT
- awskrug
- elasticsearch
- JWT
- openAI API
- Spring
- terraform
- jenkins
- CloudFront
- chat GPT
- Kotlin
- S3
- AOP
- AWS
- serverless
- ChatGPT
- lambda
- 람다
- Elastic cloud
- java
- 코딩테스트
- cache
- docker
- OpenAI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |