전체 글 94

인덱스(Index)의 원리와 성능 최적화 방법

데이터베이스를 사용하다 보면 쿼리의 성능을 높이기 위해 인덱스를 추가하는 경우가 있다. 많은 주니어 개발자들이 경험하듯, 인덱스를 추가하면 데이터 조회 속도가 빨라지는 것을 자주 경험하게 된다. 하지만 그 원리를 정확히 이해하지 못하면 잘못된 인덱스를 생성해 오히려 성능을 저하시키기도 한다. 이번 글에서는 인덱스의 원리와 성능에 미치는 영향을 그림을 통해 쉽게 설명해보고자 한다.  인덱스의 기본 개념인덱스는 책의 목차와 유사한 개념이다. 책에서 원하는 내용을 찾을 때 처음부터 끝까지 한 페이지씩 넘겨보는 것보다 목차를 통해 원하는 챕터나 페이지를 바로 찾는 것이 훨씬 빠르듯이, 데이터베이스에서도 인덱스는 특정 열(column)에 대한 참조 테이블을 만들어서 데이터 조회를 빠르게 도와준다. 인덱스의 작동 ..

DB 2024.09.26

리스트 값을 교체할까, 추가할까? 자바 리스트 처리 방식의 이해

이번 글에서는 코드 리뷰에서 자주 발생할 수 있는 문제 중 하나인 리스트 값 처리 방식에 대해 다뤄보겠습니다. 특히, 리스트를 교체할지 추가할지에 대한 결정을 어떻게 해야 하는지, 간단한 예시를 통해 설명하겠습니다. 자바 리스트 초기화 문제자바에서 리스트를 사용할 때, 가장 기본적인 실수 중 하나는 리스트를 초기화하지 않고 값을 추가하거나 대체하려고 시도하는 것이다.리스트를 선언만 하고 초기화하지 않으면, 해당 변수는 null 상태로 남게 된다. 이후 리스트에 값을 설정하거나 추가하려고 하면 NullPointerException이 발생할 수 있다.  초기화하지 않은 리스트의 문제import java.util.List;public class ProductManager { private List pro..

Java 2024.09.25

Map의 EntrySet(), 그거 어떻게 쓰는건데 ! map 을 순회하는 방법

의미entrySet은 Map 인터페이스에서 제공하는 메서드 중 하나로, Map에 저장된 key-value 쌍을 Set 형태로 반환하는 메서드이다. 이 메서드는 Map.Entry 객체를 반환하는데, 이 객체는 Map의 각 엔트리를 나타낸다. 이를 통해 Map에 저장된 모든 항목을 하나의 Set으로 다룰 수 있게 된다. 동작 원리entrySet() 메서드는 Map에 저장된 key-value 쌍을 Set> 형태로 반환한다. Set이므로 중복된 엔트리는 없으며, 순서는 Map의 구현에 따라 달라진다. 예를 들어, HashMap은 순서를 보장하지 않지만, LinkedHashMap은 입력 순서를, TreeMap은 정렬된 순서를 보장한다. 사용법Map map = new HashMap();map.put("apple",..

Java 2024.09.24

@Nullable 어노테이션, warning: unknown enum constant When.MAYBE !

의미 @Nullable은 해당 필드, 메서드 인자, 또는 메서드의 반환 값이 null일 수 있음을 명시하는 어노테이션이다.이를 통해 코드에서 해당 요소가 null일 수 있음을 명확하게 표현하고, 개발자가 null 처리를 적절히 할 수 있도록 돕는다.이 어노테이션은 IntelliJ IDEA, Eclipse와 같은 IDE가 제공하는 정적 코드 분석에서 유용하게 사용되며, IDE가 자동으로 null 가능성을 경고해준다.  @Nullable 사용하는 상황메서드 파라미터해당 파라미터가 null일 수 있음을 명시하고, 호출 시 null을 허용하는 경우에 사용된다.메서드 반환 값메서드가 null을 반환할 수 있음을 표시하여, 반환 값을 받을 때 null 체크를 해야 함을 알린다.필드필드가 null 값을 가질 수 있음..

Java 2024.09.23

Java 문자열 비교, String의 "equals" 함수 알고 사용하자

운영 환경을 비교해 다른 로직을 구현하기 위한 코드를 작성하고 리뷰를 받던 중 받은 코멘트  º º º  문자열 비교를 할 때 순서가 중요하다고 생각하지 못했기 때문에이 코멘트는 equals 의 사용법에 대한 궁금증을 자극했다 - !     equals의미 equals 메서드는 Java에서 두 객체의 "논리적 동등성"을 비교하기 위해 사용된다. 즉, 두 객체의 내용이 같은지 비교하는 기능을 제공한다. == 연산자는 객체의 "참조"를 비교하는 반면, equals는 객체 내부의 값이 같은지를 비교한다. 기능 Java의 equals 메서드는 Object 클래스에서 상속받은 메서드로, 객체의 논리적 동일성을 확인할 때 활용된다. equals 메서드를 오버라이드하여 객체의 특정 필드나 상태를 비교할 수 있도록 ..

Java 2024.09.23

Redis, 초면입니다. - 정의, 구조, 장단점, 활용 사례

Redis의 정의 Redis는 Remote Dictionary Server의 약자로, 오픈 소스 인메모리 데이터 구조 스토어이다. 주로 키-값 형태의 데이터 저장소로 사용되며, 고속의 읽기 및 쓰기 성능을 자랑한다. Redis는 다양한 데이터 구조를 지원하는데, 문자열, 해시, 리스트, 세트, 정렬된 세트, 비트맵, 하이퍼로그로그, 지리공간 인덱스 등이 포함된다.  Redis의 원리 Redis는 메모리 내에서 모든 데이터를 저장하며, 필요 시 디스크에 지속적으로 데이터를 저장하여 데이터를 보호한다. 데이터는 메모리에서 직접 읽고 쓰기 때문에 매우 빠른 성능을 제공한다. Redis는 싱글 스레드로 동작하여 동시성 문제가 발생하지 않으며, 이는 데이터 일관성을 유지하는 데 도움이 된다.  Redis의 구조 ..

DB/Redis 2024.06.16

Transaction 과 예외 처리의 관계

지난번에 이어 exception 처리와 transaction 의 관계에 대해서 한번 더 꼬집어 보고자 글을 나누어 작성하게 되었다.    예외 처리와 트랜잭션 롤백 트랜잭션 관리에서도 예외 처리는 매우 중요하다.트랜잭션은 데이터베이스 작업의 논리적 단위로, 모든 작업이 성공적으로 완료되거나 모두 롤백되어야 한다.예외가 발생하면 트랜잭션을 롤백하여 데이터의 일관성을 유지해야 합니다.정상 트랜잭션: 모든 작업이 성공적으로 완료되면 commit을 수행한다.예외 발생 트랜잭션: 작업 도중 예외가 발생하면 rollback을 수행하여 이전 상태로 되돌린다. public void processTransaction() { Connection conn = null; try { conn = data..

Java 2024.06.11

checked exception vs unchecked exception

최근 사수에게 PR 리뷰를 받던 중 exception 처리에 대해서 지적을 받았다.  사실 이제까지의 exception 처리는"내가 짠 코드가 에러가 발생했을 경우"를 고려한 것이 아닌다른 분들의 exception 처리와 동일하게 진행을 했었다.  그러나 사수와의 대화를 통해 예외 처리가 얼마나 중요한지, 그리고 이를 통해 코드의 안정성과 유지보수성이 어떻게 향상되는지 깨닫게 되었습니다.  오늘은 그 경험을 바탕으로 Java에서의 checked exception과 unchecked exception에 대해 이야기해 보려고 한다. 예외 처리의 중요성코드를 작성하다 보면 다양한 오류 상황에 직면하게 된다. 사용자가 잘못된 입력을 하거나, 파일이 존재하지 않거나, 네트워크 연결이 끊기는 등의 상황은언제든지 발..

Java 2024.05.26

docker-compose 로 mysql 설치하기

Docker 로 mysql 설치하기 프로젝트에서 mysql 을 설치하고 관리하고 있는데, 문제가 생겨서 다시 설치하고 삭제하고 반복되다 보니 docker을 이용해서 해보자는 생각이 들었다. 우선 docker에 mysql 을 설치하기 위해 docker-compose.yml 파일을 작성했다. 이전 포스트에서 미리 docker compose 에 대해 작성을 했다. 2023.12.24 - [Docker] - Docker compose 사용법 Docker compose 사용법 Docker compose Docker Compose는 여러 컨테이너화된 애플리케이션을 정의하고 실행하기 위한 도구이다. 간단히 말해, Docker Compose를 사용하면 여러 Docker 컨테이너로 구성된 애플리케이션을 쉽게 관리하 hg..

Docker 2023.12.27

Docker compose 사용법

Docker compose Docker Compose는 여러 컨테이너화된 애플리케이션을 정의하고 실행하기 위한 도구이다. 간단히 말해, Docker Compose를 사용하면 여러 Docker 컨테이너로 구성된 애플리케이션을 쉽게 관리하고 조정할 수 있다. docker-compose.yml Docker Compose는 docker-compose.yml이라는 YAML 형식의 파일을 사용한다. 이 파일에서는 애플리케이션을 구성하는 서비스, 네트워크, 볼륨 등을 정의할 수 있다. version: '3.8' services: web: image: my-web-app:latest ports: - "5000:5000" depends_on: - db environment: DATABASE_URL: "db:3306" n..

Docker 2023.12.24