[Java] ConcurrentHashMap의 동작원리 (CAS 기법)
·
JAVA
Java의 ConcurrentHashMap을 이해해 보자📌 서론Java에서 일반적인 HashMap을 사용하면 동시성 문제가 발생할 수 있다. HashMap은 멀티스레드 환경에서 안전하지 않기 때문에, 여러 스레드가 동시에 HashMap을 수정하려고 하면 데이터 불일치, 무한 루프, 또는 예기치 않은 결과가 발생할 수 있다. 이 문제를 해결하기 위한 방법 중 하나로 ConcurrentHashMap을 사용할 수 있다. ConcurrentHashMap은 멀티스레드 환경에서 안전하게 동작하도록 설계된 클래스다. 내부적으로 분할 잠금 메커니즘(lock stripping)과 CAS(Compare-And-Swap) 같은 비동기적인 동시성 제어 기법을 사용하여 여러 스레드가 동시에 데이터를 읽고 쓰는 상황에서도 안전..
[OOP] 단일 책임 원칙, 응집도, 관심사
·
JAVA
단일 책임 원칙, 응집도, 관심사 📌 서론 최근 조영호 선생님의 "객체지향의 사실과 오해"라는 책을 다시 읽었다. 확실히 다시 읽어보니 처음 읽었을 때와는 다른 느낌을 받을 수 있었다. 내 개발 지식이 조금 더 늘어서 그런 건지 해왔던 프로젝트가 책의 내용과 겹쳐서 보였다. 그래서 다시 읽은 후 코드를 바라보는 시야가 더 넓어진 것 같다는 느낌이 든다. 조영호 선생님이 작성해 주신 이 책에서는 "책임", "응집도"에 대한 얘기를 풀어가며 "단일 책임 원칙"을 설명해 주는데 나는 내 방식대로 고민해 본 것을 한번 정리해서 설명을 적어봤다. 또한 책에서는 역할은 인터페이스 책임은 메시지(메서드 명)로 표현한다. 이것을 보고 나는 그럼 관심사는 어떻게 표현할지 많이 고민해 보게 되었고 내부 로직(메서드)의 동..
[Java] HTTP 서버 만들기: 멀티스레딩과 네트워크 최적화하기
·
JAVA
지금까지 열심히 만든 HTTP 서버를 톰캣과 더 가깝게 만들기 위해 네트워크 연결 관련 설정을 추가했다. 📌 서론 지금까지 내가 만든 http 서버는 스레드 풀을 적용시킨 상태다. 이제 톰캣과 비슷한 방식으로 네트워크 연결 관련 세부 설정을 적용하기 위해 ServerSocket 및 Socket에 대한 설정을 추가하고자 한다. 이를 통해 서버의 안정성과 효율성을 향상해 볼 예정이다. 이전 포스트를 확인해 보자👇🏻👇🏻 [Java] HTTP 서버 만들기: 스레드 풀(ThreadPool) 적용 자바로 구현한 HTTP 서버에 스레드 풀을 적용시켜보자 📌 서론 이전 글에서 Java를 사용해 HTTP 요청을 처리하는 서버에 멀티스레딩 기능을 추가했다. 작성한 MultiThreadHttpServer 클래스는 각각의 요..
[JMeter] 멀티스레딩 vs 스레드 풀: Java로 만든 HTTP 서버 성능 테스트
·
JAVA
멀티스레딩 vs 스레드 풀: 실제 성능 테스트와 분석 진행 📌 서론 지금까지 열심히 java로 만든 http 요청 서버(멀티스레딩, 스레드 풀)를 JMeter를 사용하여 성능 비교를 해보려 한다. 이번 글을 통해 저부하부터 극한 부하까지 다양한 부하 상황에서 http 요청 서버(멀티 스레딩과 스레딩 풀)의 성능 측정 결과를 공유할 예정이다. 이 글을 읽은 후에는 tomcat이 왜 스레드 풀을 사용하는지 알 수 있게 될 것이다. 1. 성능 비교의 목적 목적 멀티스레딩 HTTP 서버와 스레드 풀 HTTP 서버의 성능을 비교하는 이번 실험의 주된 목적은 두 구현 방식의 효율성, 처리 능력 및 자원 사용의 효율성을 파악하는 것이다. 평가하고자 하는 내용 효율성 멀티스레딩 방식이 각 요청마다 스레드를 생성하고 소..
[Java] HTTP 서버 만들기: 스레드 풀(ThreadPool) 적용
·
JAVA
자바로 구현한 HTTP 서버에 스레드 풀을 적용시켜보자 📌 서론 이전 글에서 Java를 사용해 HTTP 요청을 처리하는 서버에 멀티스레딩 기능을 추가했다. 작성한 MultiThreadHttpServer 클래스는 각각의 요청에 대해 새로운 스레드를 생성하고 소멸시키는 방식을 채택하고 있다. 이 방법은 작은 규모의 서버에는 충분히 효과적일 수 있지만, 대규모 서버나 높은 트래픽을 처리하는 환경에서는 다수의 문제점을 야기할 수 있다. 예를 들어, 자원 관리의 복잡성 증가, 성능 저하, 그리고 스레드 생성과 소멸에 따른 오버헤드가 있다. 이에, 이번 글에서는 이러한 문제점을 해결하기 위해 '스레드 풀'을 적용하는 방법을 소개하려고 한다. 스레드 풀을 사용하면, 서버의 성능을 크게 향상시키고 자원 사용을 최적화할..
[Java] HTTP 서버 만들기: 멀티스레딩 적용
·
JAVA
[Java] http 요청 멀티스레딩 적용하기 📌 서론 서버가 동시에 여러 클라이언트의 요청을 효율적으로 처리할 수 있게 하기 위해 멀티스레딩을 적용하는 건 매우 중요하다. 저번 포스트에서 Java를 사용하여 HTTP 요청을 처리하는 간단한 서버를 구축했다. 이번 포스트에서는 만들었던 서버에 멀티스레딩 기능을 추가해 보도록 하자 이 글을 쉽게 이해하기 위해서 우리는 먼저 각 클라이언트 요청을 처리하는 핵심 클래스인 ClientHandler를 살펴볼 것이다. 이 클래스를 먼저 보는 것이 서버의 기본 작동 원리와 요청 처리 메커니즘을 이해하는 데 필수적이기 때문이다. 그 후에, ClientHandler 클래스가 어떻게 멀티스레딩 환경에서 동작하는지 보여주는 MultiThreadHttpServer 클래스를 살..
[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..