[개발 일기] 2025.01.28 - 이분탐색 (Lower Bound, Upper Bound)
·
개발 일기
개요 코딩테스트를 볼 때 이분탐색을 사용하는 문제는 심심치 않게 나온다.  그리고 이러한 이분 탐색의 세부 알고리즘으로 하한선(Lower Bound)과 상한선(Upper Bound)으로 나뉜다.  오늘은 이 두 알고리즘에 대해 정리해보자.   Lower Bound 하한선은 목푯 값 이상인 첫 번째 위치를 찾는 탐색이다.  배열에서 목표 값 이상이 시작되는 가장 작은 인덱스를 반환한다.  쉽게 말하면 목표 값의 시작 위치를 찾는 알고리즘이다.   Lower Bound 동작 방식 1. 첫 번째로 left는 찾고자 하는 값이 들어있는 배열의 왼쪽 끝, right는 오른쪽 끝에서 시작한다. 2. left와 right의 중간 인덱스를 나타내는 mid((left + right) / 2)를 계산한다. 만약 arr [..
[개발 일기] 2025.01.27 - Nginx (Feat : Apache Web Server)
·
개발 일기
개요 오늘 ‘HTTP 완벽 가이드’의 웹 서버 파트를 읽다가 해당 책이 출판되었을 당시의 웹 서버 1등은 Apache Web Server라는 것을 보고 이번 일기를 쓰게 되었다. 왜냐하면 현재는 Nginx가 1등이기 때문이다.  그 사이 어떤 일이 발생했는지, 뭐 때문에 Apache Web Server가 밀려났는지 정리해 보자.  2014년 웹 서버 서베이 결과   2025년 웹 서버 서베이 결과    Nginx Nginx는 웹 애플리케이션 서버(WAS)를 보조하는 비동기 이벤트 기반의 웹 서버(WS)이다.  주요 역할은 다음과 같다.정적 리소스 제공이미지, 동영상, JavaScript 등의 정적 파일을 클라이언트에 전달동적 리소스(변동 데이터)는 WAS를 통해 처리HTTP 로드 밸런서여러 서버에 트래픽..
[개발 일기] 2025.01.26 - 논리적 동치성 (Feat : equals())
·
개발 일기
개요 이펙티브 자바 책을 읽다가 equals() 메서드에 대해 보고 있었는데, 논리적 동치성이라는 단어가 나왔다.  == 연산자와 equals() 메서드의 차이점에 대해서는 알고 있었다.  하지만 논리적 동치성이라는 단어는 익숙하지 않아서 오늘 정리해 보겠다.   논리적 동치성 논리적 동치성은 참조 타입 두 객체가 내용(상태)이 같음을 의미한다.  이를 풀어서 설명하면 두 객체가 가지고 있는 특정 변수의 값이 동등하다면 ‘논리적으로 같다’라고 한다.  다음은 논리적 동치성을 비교하는 예시 코드이다. public class LogicalEquivalence { public static void main(String[] args) { String s1 = "test"; Stri..
[개발 일기] 2025.01.25 - volatile
·
개발 일기
개요 volatile은 멀티 스레드를 공부할 때 많이 봤던 키워드이다.  오늘은 volatile에 대해 정리해보자.   volatile 자바의 volatile 키워드는 변수의 가시성 문제를 해결하기 위해 사용된다.  쉽게 말해서 volatile가 달린 변수를 메인 메모리에 저장할 때 사용된다.  가시성 문제가시성 문제란 쓰레드가 변경한 변수의 값이 CPU의 캐시에만 저장되었고, 메인 메모리엔 반영되지 않는 문제를 말한다. 이러한 문제 때문에 해당 변수를 조회하려는 다른 쓰레드는 이 값을 알지 못한다.  non-volatile 로 선언된 변수에서 가시성 문제가 발생하는 과정은 다음과 같다. 스레드가 변수 값을 읽으려고 할 때, CPU는 먼저 변수의 값을 CPU 캐시에서 가져온다.만약 CPU 캐시에 해당 변..
[개발 일기] 2025.01.24 - 낙관적 락 vs 비관적 락
·
개발 일기
개요 데이터베이스에 대한 공부를 할 때 락에 대한 학습은 필수적이다.  그런데 이 락이라는 기술도 여러 가지 특징을 가진 기술로 세분화되어 있다.  오늘은 그 중에서 낙관적 락과 비관적 락에 대해 정리해 보겠다.   낙관적 락 낙관적 락이란 데이터의 충돌이 드물 것이라고 가정하고 따로 자원의 동시 접근은 허용하되, 데이터의 충돌(같은 자원 수정)이 발생할 경우 이를 감지하고 실패처리하는 것이다.  데이터의 충돌을 감지하는 방법은 테이블 내에 별도의 칼럼을 추가하는 방법이 있다.  아래의 코드는 Board라는 엔티티에 @Version 어노테이션을 사용해 충돌 감지용 칼럼을 추가한 것이다. @Entitypublic class Board { @Id private Long id; @Version..
[개발 일기] 2025.01.23 - 직렬화
·
개발 일기
개요 오늘은 자바에서 밥 먹듯이 사용되는 직렬화에 대해 정리해 보자.   자바 직렬화 자바에서 직렬화란 자바 환경 내부에서 사용되던 객체나 데이터를 외부의 자바 시스템에서도 사용 가능하도록 바이트 형태로 변환하는 과정을 의미한다.  조금 더 전공자처럼 얘기하면 JVM의 런타임 데이터 영역에 위치하고 있는 객체를 바이트 형태로 변환하는 과정이다.  역직렬화는 이것과 반대로 바이트 형태로 변환된 데이터를 다시 자바에서 사용할 수 있는 객체 형태로 변환한 후, JVM의 런타임 데이터 영역에 저장하는 것을 의미한다.   Serializable Serializable의 사전적 의미는 직렬화이다.  직렬화를 자바에서 구현하기 위해선 일단 Serializable 인터페이스를 상속받은 후 구현해야 한다. class M..