PDF 파일의 내부 데이터를 핸들링할 일이 생겼다. 처음에 든 생각은 PDF 파일을 XML 형태로 바꾸면 되지 않을까?라고 생각을 했는데, XML 형태든 JSON 형태든 파일 형식을 바꿔버리면, 표나 이미지 글자 크기 등이 제대로 반영이 되지 않을 것 같았다. 물론할 수는 있겠지만 아마 솔루션 개발급 공수가 들어가지 않을까? 란 견적이 서서 다른 방법이 없나 찾아봤다. 찾다보니 가장 그럴듯한게 HTML로 변환 하는 것이었다. PDF box와 css box를 이용하는 방법인데 라이브러리를 쓰면 되다보니 그렇게 어렵지 않다. 하나씩 해보자. 코드 gradle # commons-io를 낮은 버전을 쓰고 있으면 버전업해야함, 안쓰고 있으면 필요 x implementation 'commons-io:commons-..
핸드폰 SMS 인증을 개발하면서 해외의 SMS 서비스를 사용하면서 핸드폰 번호 포맷 변환 기능이 필요하게 되었다. Twilio에서는 E.164이라는 핸드폰 번호 국제 표준을 사용한다. 해외 서비스를 이용하면서 SMS 인증을 해본 사람들은 한번씩 다 봤을 번호 체계이다. E.164 format 이란? 우리나라의 country code는 +82 이다. 그리고 우리나라의 핸드폰 번호는 대부분 010 - xxxx - xxxx 이다. 이 번호들을 기준으로 E.164 format으로 핸드폰 번호를 변경하면 +8210xxxxxxxx 이 된다. 그런데 문제는 오래된 번호 사용자들은 010이 아닐수도 있고 11자리가 아닐수도 있다. 이걸 하나씩 하드코딩할 수는 없어서 괜찮은 라이브러리가 있어서 소개해보려고 한다. lib..
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..
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...
에디터에서 문서를 작성하고, 서버로 텍스트를 전달한다면 기본적으로 HTML태그들이 포함되서 넘어오게 된다. 하지만 데이터 분석을 위해서는 HTML태그를 제거한 순수 텍스트에 대한 정보가 필요하다. 슬프게도 자바 혹은 스프링에서 자체적으로 HTML태그를 뚝딱 제거하는 기능이 없다 ㅠ 굳이 방법이 있다면, 정규식을 이용하는건데 이 방법은 별로 추천하고 싶지 않은 방법이다. (정규식을 정교하게 짜지 않는다면, 사용자가 실수로 넣은 기호들이 제거될 수도 있다) 당연한 이야지만 정규식을 사용하지 않고 HTML 태그를 제거하는 방법이 있다. JSoup라는 라이브러리인데, 이 라이브러리를 이용해 HTML 태그를 제거하는 방법을 소개하고자한다. JSoup JSoup은 HTML 문서에 저장된 데이터를 구문 분석, 추출 ..
https://medium.com/javarevisited/basic-memory-saving-techniques-for-java-programming-6677a7237a69 위 글을 번역하면서, 조금씩 내용을 추가했다. 1. 프리미티브 타입(primitive type)을 사용하자 Integer x = 42; => int x = 42; Double d = 3.14; => double d = 3.14; Boolean b = true; => boolean b = true; Integer, Double, Boolean과 같은 프리미티프 타입을 Wrapping한 Object들을 사용하면 불필요한 오버헤드를 만들 수 있으니, 사용을 피하는게 좋다. 2. 스트링을 결합할 때 StringBuilder를 사용하자 St..
1. String 자바에서 사용되는 String의 가장 큰 특징은 불변이라는 것이다. String 객체가 한번 생성되면 그 객체는 더 이상 수정할 수 없다. String 객체를 생성하는 방법은 아래와 같다. String str = "ABC"; // or String str = new String("ABC"); 앞서 언급한 것처럼 불변이기 때문에, 멀티쓰레드 환경에서 데이터 불일치에 대한 우려가 없기 때문에 사용하기 적합하다. 다만, 수정이 필요한 새 String을 생성해야 한다는 불편함도 있다. 때문에, 큰 문자열로 작업하거나 많은 수정을 수행할 때 비효율적으로 동작하게 된다. 2. StringBuffer Java 1.4까지는 문자열을 다루기위해서 StringBuffer가 유일한 방법이었다고 한다. St..
DB에서 값을 꺼내왔을 때나, API 로 주고 받았을 때 JSON 형태의 데이터를 String 타입으로 저장하는 경우가 있다. 이 데이터를 화면에 바로 뿌려주면 {"key":"value"} 위와 같이 한 줄 텍스트로 출력이 된다. 화면단에서 파싱해서 써도 되지만 Java 단에서 JsonPretty를 적용할 수 있다. Jackson 패키지의 ObjectMapper의 writerWithDefaultPrettyPrinter 매서드 쓰면 된다. 아래의 테스트코드를 실행시켜보자 String singleLineJson = "{\"key\":\"value\"}"; ObjectMapper objectMapper = new ObjectMapper(); try { Object json = objectMapper.readV..
- Total
- Today
- Yesterday
- 오블완
- OpenAI
- springboot
- lambda
- CloudFront
- EKS
- Kotlin
- terraform
- java
- MySQL
- JWT
- GIT
- 후쿠오카
- 람다
- cache
- 티스토리챌린지
- elasticsearch
- AWS EC2
- Elastic cloud
- openAI API
- 스프링부트
- ChatGPT
- AOP
- serverless
- OpenFeign
- Log
- docker
- S3
- AWS
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |