[Java] HashTable이 뭘까?
·
JAVA
1. Hashtable 클래스를 왜 살펴보는데?우리가 개발을 하다 보면 Map, Set을 자주 사용하게 된다. 근데 생각해 보면 그냥 Map, Set을 쓰기보단 HashMap, HashSet을 주로 사용한다. 그래서 나는 왜 그런지 궁금해서 자세히 알아보려고 java.util 패키지에 들어가 봤는데 내 눈에는 목적과는 다르게 다른 녀석이 눈에 띄었다. 바로 Hashtable이라는 클래스다. 이걸 보자마자 궁금증이 들었다. Hashtable은 대체 뭘 하는 녀석인가? 사실 이 녀석은 "면접 질문"으로 자주 나온다는 것을 들어서 유명하다는 것은 알고 있었지만 솔직히 그래서 이걸로 뭘 하는지를 모르겠고 사용해 본 적도 없었다. 그래서인지 나는 이 클래스를 조금이라도 이해하고 싶어졌다. 그래서 내부가 어떻게 생..
[Java] Stream의 mutable, immutable 리스트 변환 (toList)
·
JAVA
자바 Stream을 사용할 때 toList를 잘 사용해야 한다. (불변, 가변 리스트 반환 때문)📌 서론Java 16 이후로 스트림 API에는 새로운 메서드인 Stream.toList()가 추가되었다. 이 메서드는 단순히 보면 Stream.collect(Collectors.toList())와 비슷해 보이지만, 중요한 차이점이 있다. 바로 Stream.toList() 불변 리스트를 반환하고 Stream.collect(Collectors.toList())는 가변 리스트를 반환한다는 것이다.  (이 차이점 때문에 개발 중이던 비즈니스 로직에서 문제가 발생하기도 했다.) 이 글에서는 두 메서드의 차이점을 이해하고, 각각의 설계 의도를 살펴보자. 1. Stream.toList() 메서드의 내부 구현 이해하기:..
[Java] 동시성 제어가 가능한 CopyOnWriteArrayList와 일반 ArrayList의 차이점
·
JAVA
동시성 제어가 가능한 List인 CopyOnWriteArrayList를 알아보자📌 서론동시성 제어가 가능한 HashMap인 ConcurrentHashMap에 대해 공부하고 사용하다 보니 List에도 동시성 제어가 가능한 클래스가 존재할 것이라는 생각이 들었고 열심히 찾아본 결과 java.util.concurrent 패키지 내부에 CopyOnWriteArrayList라는 동시성 제어가 가능한 List가 존재한다는 것을 알아냈다. 이번 포스트를 위해 우리가 개발할 때 일반적으로 사용하는 ArrayList와 동시성 제어를 해준다는 CopyOnWriteArrayList를 스프링에서 사용해 보면서 동시성 제어가 어떻게 되는 것이고 성능은 어떨지 알아보자. SpringBootTest와 locust를 사용한 동시성..
[Java] ConcurrentHashMap의 동작원리 (CAS 기법)
·
JAVA
Java의 ConcurrentHashMap을 이해해 보자📌 서론Java에서 일반적인 HashMap을 사용하면 동시성 문제가 발생할 수 있다. HashMap은 멀티스레드 환경에서 안전하지 않기 때문에, 여러 스레드가 동시에 HashMap을 수정하려고 하면 데이터 불일치, 무한 루프, 또는 예기치 않은 결과가 발생할 수 있다. 이 문제를 해결하기 위한 방법 중 하나로 ConcurrentHashMap을 사용할 수 있다. ConcurrentHashMap은 멀티스레드 환경에서 안전하게 동작하도록 설계된 클래스다. 내부적으로 분할 잠금 메커니즘(lock stripping)과 CAS(Compare-And-Swap) 같은 비동기적인 동시성 제어 기법을 사용하여 여러 스레드가 동시에 데이터를 읽고 쓰는 상황에서도 안전..
[JMeter] 멀티스레딩 vs 스레드 풀: Java로 만든 HTTP 서버 성능 테스트
·
JAVA
멀티스레딩 vs 스레드 풀: 실제 성능 테스트와 분석 진행 📌 서론 지금까지 열심히 java로 만든 http 요청 서버(멀티스레딩, 스레드 풀)를 JMeter를 사용하여 성능 비교를 해보려 한다. 이번 글을 통해 저부하부터 극한 부하까지 다양한 부하 상황에서 http 요청 서버(멀티 스레딩과 스레딩 풀)의 성능 측정 결과를 공유할 예정이다. 이 글을 읽은 후에는 tomcat이 왜 스레드 풀을 사용하는지 알 수 있게 될 것이다. 1. 성능 비교의 목적 목적 멀티스레딩 HTTP 서버와 스레드 풀 HTTP 서버의 성능을 비교하는 이번 실험의 주된 목적은 두 구현 방식의 효율성, 처리 능력 및 자원 사용의 효율성을 파악하는 것이다. 평가하고자 하는 내용 효율성 멀티스레딩 방식이 각 요청마다 스레드를 생성하고 소..
[JMeter] MacOS(M1)에서 JMeter를 이용한 부하 테스트
·
JAVA
MacOS(M1)에서 JMeter를 세팅하고 실제 테스트를 진행하는 방법을 알아보자 📌 서론 JMeter는 오픈 소스 부하 테스트 도구로, 웹 애플리케이션의 성능을 측정하고 분석하는 데 유용하다. 이번 포스트에서는 MacOS(Apple Silicon)에서 JMeter를 설치하고 테스트를 진행하는 방법을 알아보자 1. JMeter 홈페이지에서 다운로드 진행 JMeter 홈페이지에서 Binaries 섹션을 찾은 다음 tgz 파일을 다운로드 받고 압축을 풀어준다. Mac에서 다운로드를 하면 기본적으로 다운로드 폴더에 저장된다. 압축을 풀어주고 apache-jmeter 폴더를 원하는 경로(예: study 폴더)로 옮겨주면 된다. 2. JMeter 실행하기 터미널 실행 JMeter를 실행하기 위해 터미널(iter..
[Java] HTTP 서버 만들기: GET, POST, PUT 요청별 처리
·
JAVA
자바로 GET, POST, PUT 요청에 대해 각각 처리가 가능한 HTTP 서버를 만들어 보자 📌 서론 저번 포스트에서 Java만을 사용하여 간단하게 HTTP 서버를 구축해 봤는데 이번에는 그 서버 코드를 고도화시켜서 GET, POST, PUT 요청에 따라 유형별로 각각 처리하도록 만들어 봤다. 이전에 작성한 HTTP 서버를 확인하려면 아래의 포스트를 보고 오는 것을 추천한다.👇🏻👇🏻 [Java] HTTP 서버 구현: postman과 자바 HttpClient를 사용한 요청 스프링을 사용하지 않고 순수 자바로 HTTP 서버를 구현해 보자 📌 서론 개발을 하다 보면 필수적으로 http 프로토콜을 사용하게 된다. 만약 스프링을 통해 백엔드 개발을 한다면 @Controller와 @Request curiousj..
[Java] HTTP 서버 구현: postman과 자바 HttpClient를 사용한 요청
·
JAVA
스프링을 사용하지 않고 순수 자바로 HTTP 서버를 구현해 보자 📌 서론 개발을 하다 보면 필수적으로 http 프로토콜을 사용하게 된다. 스프링 부트를 사용해서 백엔드 개발을 한다면 @Controller와 @RequestMapping 조합을 통해 http 요청을 간편하게 처리할 수 있다. 이것은 스프링이 http 요청 처리를 추상화해서 지원하기 때문인데 스프링은 이 기능을 dispatcherServlet를 사용해서 지원한다. (고수준 처리) dispatcherServlet은 http요청을 직접적으로 받는 것이 아니라 tomcat으로부터 HttpServletRequest객체를 받은 다음 HandlerMapping을 통해 요청에 적절한 컨트롤러를 찾아서 매핑하고 처리하도록 구성되어 있다. 내가 궁금했던 것은..