Development/Java 6

[기술면접준비] 멀티스레드 상황에서 어떤 Map 구현체를 사용해야할까?

들어가며 기술면접에서 면접관이 SynchronizedMap과 ConcurrentHashMap의 차이를 물어봤다. 근데 ConcurrentHashMap를 몰라서 대답을 못했다. 면접을 복기할 겸, Map에 대해 부족한 부분을 공부할 겸 포스팅을 쓴다. Q. HashMap과 HashTable의 차이는 무엇인가요? A. 가장 큰 차이는 HashTable은 동기화를 지원하는 반면, HashMap은 동기화를 지원하지 않습니다. 다만 HashTable은 모든 메서드에 동기화를 지원하는 만큼 상대적으로 느립니다. 또한 Iterator를 사용하는 중에 데이터 변경이 일어나면 Exception이 발생하게 됩니다. 또 key나 value에 null을 허용하지 않는 특징도 있습니다. HashMap은 반대로 동기화를 지원하지..

Development/Java 2023.04.05

JDK8에서 SHA512 암호화/해시화 구현하기

들어가며 외부 API 통신 중 검증 데이터를 해시화하여 비교하는 유효성 로직이 있었다. 대부분 SHA방식은 단방향 암호화 방식이기에 민감정보를 DB에 저장할 때 사용하거나, API 간 데이터 검증에서 사용된다. 본인은 후자의 방법으로 사용하였다. 예를 들면 A사의 이름, 연락처, 이메일 정보를 B사에 전달하여 해당 데이터에 맞는 고객정보가 있는지 조회하는 API가 있다고 하자. 별도의 VPN을 통해 데이터를 주고받을 수도 있지만 비용과 시간의 제약 안에서 현실적인 해결 방법은 데이터의 암호화 및 유효한 통신 주체인지 확인할 수 있는 검증 데이터를 사용하는 선택을 한다. 그래서 API 필드 중 "이름+연락처+이메일” 정보를 묶어 SHA로 해시화하고 비밀키로 AES 방식으로 한번 더 암호화하였다. 이를 ch..

Development/Java 2022.04.22

JDK8에서 AES 암/복호화 구현하기

들어가며 이번 프로젝트에서 A사이트의 암호화된 사용자 정보를 바탕으로 로그인을 연동시키는 기능을 구현했다. 이때 AES, SHA 방식 모두 사용하게 되었고 이참에 자세히 기록하기 위해 글을 적는다. AES 암호화란? 암호화 방식은 아래와 같이 구분할 수 있다. 먼저 복호화가 가능한지에 따라 양방향 / 단방향으로 구분되고, 복호화할 때 사용하는 비밀키가 암호화할 때 그대로 사용되면 대칭키, 서로 다른 키를 사용하면 비대칭키가 된다. AES 알고리즘은 복호화가 가능하며, 동일한 비밀키로 암/복호화를 하기 때문에 대칭키 알고리즘이 된다. 코드로 만들어보기 JDK8을 이용해서 개발했고 별도의 라이브러리는 없이 내장된 클래스만 사용하였다. 이렇게 자바 버전을 강조하는 이유는 JDK 11 버전부터는 Datatype..

Development/Java 2022.03.30

Collection살펴보기 - Set

컬랙션의 구현체로는 크게 4가지가 있다. 이 중 용도가 다른 EnumSet을 논외로 하고 HashSet과 LinkedHashSet, TreeSet을 중심으로 성능을 비교해보자. 성능 측정을 위한 클래스 시간 단위는 밀리세컨드를 기준으로 삼고 더 정밀한 측정이 필요할 수 있으니 나노 세컨드로 반환하는 메서드도 구현했다. 구현 코드를 보자. public class Timer { public static long checkNanoTime(CodeBlock codeBlock) { long startTime = System.nanoTime(); codeBlock.doSomething(); long endTime = System.nanoTime(); return (endTime - startTime); } publ..

Development/Java 2021.01.14

Java 8의 주요 변경 사항과 실무 적용 포인트

들어가며 Java는 끊임없이 진화하고 있다. 1996년 JDK 1.0으로 발표된 이후 25년이 지난 오늘날까지 대한민국에서 널리 사용되는 이유는 여기에 있다. 그중 'Modern java'라는 별칭이 붙은 Java 8의 변경사항을 정리하며 '이런 기능을 어떻게 실무에 녹여낼 수 있을까' 예제를 통해 설명하는 것이 이번 포스팅의 목표이다. ◇ 이번 포스팅에서 Java 8의 변경사항이 등장한 배경이나 역사적인 기술에 대해서는 다루지 않을 것이다. 모두 알지 못하는 필자의 무지도 있지만 글이 방대해지면서 독자의 집중력이 흐려지는 것을 막기 위함이다. 그래도 흥미롭거나 참고하기 좋은 키워드를 문단 하단에 '더 알아보기'로 추가하여 관심이 있는 독자가 더 읽어볼 수 있도록 제공한다. 주요 변경사항 Java 8의 ..

Development/Java 2020.12.30

왜 String은 new 키워드를 사용하지 않을까?

들어가며 String literalString = "ABC"; String objectString = new String("ABC"); 이번 포스팅은 위 코드의 차이를 설명하기 위해 작성되었다. Java의 메모리 구조를 이해하기 위한 좋은 예제이므로 이미 알고 계신 분들은 가볍게 보시고, 모르는 분들도 쭉 글을 읽고 나면 금방 이해할 수 있다. String은 무엇인가? String은 한글로 '문자열'이라고 부른다. 문자열은 '문자 배열'을 줄여 부르는 말이다. 그래서 String == char[] 로 이해하고 char[]를 쉽게 사용하기 위해 만든 객체를 String이라고 생각해도 좋다. 사용방법은 크게 두 가지가 있다. 첫 번째는 리터럴방식으로 쌍따옴표(")사이에 원하는 문자열을 선언한다. 두 번째는 ..

Development/Java 2020.11.25