profile
엔지니어가 되는 그 날 까지!
post-thumbnail

[Java] Json을 Java 객체로 변환하는 방법(Gson, Jackson, JSON-SIMPLE)

정리하게 된 배경 TMI~ API를 사용하게 되면 많이 다루게 되는 데이터 형식 중 하나가 바로 json이다. 개발중인 서비스에서도 연계된 타 서비스의 데이터를 API로 받아오게 되는데, 대용량일 시 json 문자열을 Entity 객체로 파싱하며 성능 이슈가 있는 듯하여 현재 사용중인 라이브러리와 그 외에 대중적으로 사용되는 라이브러리의 성능 차이를 검토하게 되었다. JSON 라이브러리 종류 > JAVA - GSON , JSON-Simple, Jackson 무엇을 사용해야 할까? GSON Jackson JSON-SIMPLE 고코더님이 작성한 포스트에서 대용량에서는 Jackson이 저용량에서는 GSON이 가장 성능이 좋았다는 평이 있다. 현 프로젝트에서는 GSON을 사용하고 있는데, 우리는 큰 파일과 작은 파일을 모두 다루고 있어서 라이브러리 선택이 잘못됐다는 것을 깨달았다. 그냥 JSO

2023년 5월 27일
·
0개의 댓글
·

[Java] 문자열이 숫자인지 확인하는 방법

정리하게 된 배경 TMI~ 항공권 예약 시, 항공사에서 준 PNR(숫자+알파벳)이라는 정보를 받는데 GDS에 따라 항공사PNR 외에 8자리 숫자로 된 PNR예약번호가 들어오는 경우가 존재한다. 실제 운영팀에서는 항공사PNR을 기준으로 데이터를 보는 경우가 많은데, 백오피스에선 두 PNR 정보가 분리되지 않고 PNR1, PNR2로 순서가 뒤섞여서 적재가 되고 있었다. 요런 배경에서 정산 시스템에선 해당 PNR을 분리하려고 했는데 아무 생각 없이 Double.parse()로 숫자인지 판단하도록 했다. 근데 웬걸... 항공사PNR이 숫자로 인식되어서 잘못 들어가 있네... 해서 이 김에 문자열이 숫자인지 검증하는 방법을 정리해봤다. Double.parseDouble() 메소드 try-catch 하지만, D나 E 문자가 들어갈 경우 Double로 형변환이 되어 버그 발생할 수 있음 String.matches() 메서드 활용

2023년 5월 12일
·
0개의 댓글
·

JAVA 11 NEW FEATURE 정리

새로운 String 메서드 추가 strip() 문자열 앞, 뒤의 공백 제거 stripLeading() 문자열 앞의 공백 제거 stripTrailing() 문자열 뒤의 공백 제거 isBlank() 문자열이 비어있거나 공백만 포함되어있을 경우 true를 반환. 즉, String.trim().isEmpty() 호출과 같음 lines() 문자열을 라인 단위로 쪼개는 스트림을 반환 repeat(n) 지정된 수 만큼 문자열을 반복하여 붙여 반환 예제 변수 Type 추론 Lamda 지원 Java10에서 추가된 지역변수 Type 추론 기능은 람다에서 사용 불가 Java10부터 람다 표현식에서도 var를 사용해서 변수를 선언할 수 있도록 지원 Collection API에 toArray 메서드 추가 collection 을 통해

2023년 4월 1일
·
0개의 댓글
·

JAVA 10 NEW FEATURE 정리

지역변수의 Type 추론 지원 지역변수의 타입을 명시하지 않아도 됨 (이전에는 타입을 명시했어야 함) 컴파일러는 대입되는 객체를 통해 지역변수의 타입을 추론 지역변수 초기화 시에만 사용가능 초기화하지 않은 지역변수나 null로 초기화한 지역변수, 전역변수, 메서드의 매개변수, 반환형, 람다 식 내부 등에는 사용할 수 없음 예제 before after Collection API 메서드 추가 copyOf() 대상을 복사하여 수정할 수 없는 Collection을 반환 toUnmodifiable*() Stream 내부에서 collect() 시, 수정할 수 없는 Collection으로 반환하도록 함 Optional*.orElseThrow() 메서드 추가 새로 추가된 orElseThrow()메서드는 인자값을 따로 받지 않고 값이 없으면 NoSuc

2023년 4월 1일
·
0개의 댓글
·

JAVA 9 NEW FEATURE 정리

Java Platform Module System 도입 JPMS 배경 Java 플랫폼은 이전까지 모놀리식 아키텍처로 구성 (주1. 모놀리식 아키텍처: 단일 코드 베이스의 애플리케이션) Java 플랫폼의 규모가 커지며 모놀리식 아키텍처의 단점 부각 유지보수의 어려움 유연하지 않은 확장성 대규모 팀 작업에서의 불편함 기술 변경에 대한 제한 ➡ 모듈화 필요성 증대, Jigsaw Project 진행 JPMS 이점 모듈 지정 및 모듈별 버전 관리 가능 필요한 모듈만 구동하여 크기와 성능 최적화 가능 임베디드와 같은 환경에서 필요한 모듈만 탑재하여 적은 메모리로 로딩 가능 Module 패키지(package)의 상위 집합체 고유한 이름으로 선언됨 서로 관련있는 패키지, 리소스(image, XML..), module descriptor로 구성 모듈간 의존성을 가질 수 있으며, 각 모듈은

2023년 3월 26일
·
0개의 댓글
·

JAVA 8 NEW FEATURE 정리

람다 표현식(Lambda Expression) 람다식: 메서드로 전달 가능한 익명 함수를 단순화한 것 반복문 적용 예시 before after stream API 배열이나 컬렉션의 데이터를 추상화하여, 공통된 방식으로 데이터를 읽고 쓸 수 있는 방법을 제공 컬렉션은 데이터를 어떻게 저장/관리하고 접근하는지를 목표로 함 → 데이터 저장/관리 시 사용 스트림은 데이터를 어떻게 계산할지에 대한 목포를 가짐 → 계산 시 사용 구성요소 연속된 요소 중간연산 파이프라인으로 구성 stream을 반환 최종 연산에서 한번에 처리됨(지연 계산) ex. map, filter, flatMap 최종연산 stream이 아닌 최종 결과를 반환 ex. count, foreach, collect 예제

2023년 2월 18일
·
0개의 댓글
·
post-thumbnail

[Gson] Gson.fromJson(Object) Empty String / TypeCasting 처리하기

코딩하게 된 배경과 삽질 스토리 TMI~ 업무를 하다가 API에서 받아온 데이터를 그대로 DB 테이블에 Merge해야하는 케이스가 생겼다. 처음에는 적재해야 하는 Entity의 모든 필드를 String 타입으로 선언하고, Gson을 이용해 json 문자열을 바로 List로 변환해주는 것 까지 완료했다. 이때까지 단위테스트 결과는 전혀 문제가 없어서 순조롭게 진행되는 구나 했는데, 아뿔싸. mybatis로 쿼리를 실행하니 빈 문자열("")로 들어온 필드의 DB 자료형이 decimal이거나 double일 때 형식이 맞지 않아 에러가 발생했다. 그래서 Entity에서 DB의 자료형에 맞게 선언을 바꿔줬더니 이번엔 Gson에서 List로 변환하면서 NumberFormatException이 발생한다. 열심히 AttributeConverter를 구현하여 JPA @Converter 를 지정해줬는데도 제대로 작동하지 않았다. 회사

2023년 1월 19일
·
0개의 댓글
·

[Java] 정렬된 리스트에서 근사값 구하기

코딩하게된 배경 TMI ~ 회사에서 마우스 좌표를 기준으로 X값을 받아와 차트 그려진 그래프의 Y값을 도출하는 기능을 구현해야 하는 경우가 생겼다. 문제는 받아오는 X의 값은 연속적인 값인데, 도출해야하는 Y좌표를 담고 있는 데이터는 형식이라 마우스 좌표의 X값에 근사한 X좌표를 구해 해당 값을 Key로 Y좌표 값을 구해야 했다. 따라서 정렬된 X좌표의 리스트에서 입력된 값의 근사값을 가져오는 알고리즘을 구현하게 됐다. 이진 탐색을 이용한 근사값 구하기 레거시 사전 조건 탐색 대상은 Double.toString() 값을 담은 문자열 List 입력되는 값은 double 형식 문자열 List는 순차적으로 이미 정렬된 상태 로직 흐름 정렬된 리스트에서 inputValue의 Index 탐색 (IndexOf() 호출) 존재하지 않는다면 BinarySearch 알고리즘으로 `inputValue

2022년 11월 27일
·
0개의 댓글
·