분류 전체보기 174

Failed to validate connection 해결하기

애플리케이션 실행 중에 warning 센트리 알림이 울리기 시작했다..😅오류 메시지의 원인 및 해결 방안을 알아보도록 하겠습니다.이 오류 메시지는 HikariCP에서 MySQL 데이터베이스를 연결을 관리하는 동안 발생한 문제를 나타냅니다.구체적으로 MySQL 연결이 이미 닫힌 상태에서 HikariCP가 해당 연결을 사용하려고 시도했기 때문에 발생한 문제입니다.이 문제는 주로 연결 수명이 다한 후에도 HikariCP가 그 연결을 풀에서 사용하려고 시도하는 경우 발생합니다. 원인연결 수명이 만료됨MySQL 서버에서 연결이 유효 기간이 지나서 닫히면, HikariCP는 해당 연결을 사용하려고 할 때 문제가 발생합니다. MySQL 서버의 wait_timeout 설정이 짧게 설정되어 있는 경우 이 문제가 발생할..

Backend/Spring 2024.08.17

[Java] JPA의 @Lock 동시성 제어

데이터베이스와 관련된 애플리케이션을 개발하다 보면 동시성 문제를 다루어야 할 때가 많습니다.🤔JPA에서 여러 스레드 또는 트랜잭션이 동일한 데이터를 동시에 읽고 쓰려고 할 때 발생할 수 있는 문제를 해결하기 위해 다양한 잠금(Locking) 기법에 대해 살펴보겠습니다. @Lock 어노테이션이란?@Lock 어노테이션은 JPA에서 엔티티에 대한 동시성 제어를 위한 잠금 메커니즘을 정의할 때 사용됩니다.이 어노테이션은 주로 @Query 어노테이션과 함께 사용되어 쿼리 실행 시 특정 잠금 모드를 적용하도록 지시합니다.이를 통해 특정 엔티티에 대한 동시성 제어를 강화할 수 있습니다. 예를 들어, 특정 리포지토리 메서드에서 @Lock 어노테이션을 적용하여 비관적 잠금을 설정할 수 있습니다.public inter..

Backend/Java 2024.08.12

[Java] for 루프와 Stream API

다들 코드 작업을 하다 보면 다양한 이유로 반복 작업을 수행해야 할 때 어떤 방법으로 작업을 진행하시나요??이 글에서는 반복 작업을 수행할 때 적절하게 for 루프와 Stream API를 사용할 수 있도록 알아보겠습니다. 🙌 for 루프기본 사용 방법으로는 아래와 같습니다.정수 기반 반복문 (특정 범위 내의  정수를 반복할 때 사용합니다.)for (int i = 0; i 확장된 for 루프(배열이나 컬렉션의 각 요소를 순회할 때 사용합니다.)List list = Arrays.asList("a", "b", "c");for (String item : list) { System.out.println(item);}장점직관적이고 간단함for 루프는 프로그래머가 직관적으로 이해하기 쉬운 구조입니다.특히, 초..

Backend/Java 2024.08.10

[Java] final 불변 객체를 사용해야하는 이유

불변 객체는 소프트웨어 설계에서 중요한 개념이라고 생각합니다.실수를 예방하고 로직 구현에 집중할 수 있는 장점을 가지고 있는 불변 객체에 대해 알아보겠습니다. 🤓  불변 객체(Immutable Object)란?불변 객체는 생성된 이후에는 상태가 변경되지 않는 객체를 의미합니다.즉, 객체의 상태가 한번 설정되면 수정할 수 없으며, 객체의 필드 값이 불변으로 유지됩니다.불변 객체는 설계와 구현에 있어서 중요한 원칙으로 다양한 장점으로 인해 많이 사용됩니다.불변 객체의 특징 상태 변경 불가능객체가 생성된 이후에는 내부 상태를 변경할 수 없습니다.스레드 안전성여러 스레드에서 동시에 접근해도 안전합니다.복잡성 감소상태를 변경하지 않기 때문에 코드가 단순해지고, 디버깅과 유지보수가 용이합니다.불변 객체를 사용하는..

Backend/Java 2024.08.10

[MySQL] 인덱스 동작 원리 및 최적화

인덱스의 동작원리에 대해 알아보겠습니다 📝 인덱스란 무엇인가?인덱스는 데이터베이스 테이블에서 데이터를 더 빠르게 검색할 수 있도록 도와주는 데이터 구조입니다.인덱스는 책의 색인처럼 동작하여, 특정 데이터를 빠르게 찾을 수 있게 합니다.MySQL에서는 주로 B-Tree와 Hah 인덱스를 사용합니다. 인덱스의 동작 원리B-Tree 인덱스가장 널리 사용되는 인덱스 유형으로, 균형 잡힌 트리 구조를 가지고 있어 검색, 삽입, 삭제 작업이 효율적으로 수행됩니다.구성요소로는 아래와 같습니다.노드(Node): 데이터와 포인터를 포함하는 트리의 요소루트 노드(Root Node): 트리의 최상위 노드리프 노드(Leaf Node): 자식 노드가 없는 최하위 노드가지 노드(Branch Node): 루트 노드와 리프 노드 ..

Data/MySQL 2024.08.04

[MySQL] 쿼리 절 순서

데이터베이스에서 데이터를 조회할 때, SQL 쿼리의 여러 절들이 결합되어 원하는 결과를 얻을 수 있습니다.MySQL 쿼리 절의 실행 순서를 이해하면 더 효율적이고 정확한 쿼리를 작성할 수 있습니다🤗 MySQL 쿼리 절 순서MySQL 쿼리는 다음 순서로 실행됩니다.FROM데이터를 가져올 테이블을 지정합니다.JOIN여러 테이블을 결합합니다.WHERE특정 조건을 만족하는 행만 선택합니다.GROUP BY선택된 행을 그룹화합니다.HAVING그룹화된 데이터에 대한 조건을 지정합니다.SELECT 데이터를 선택합니다.ORDER BY결과를 정렬합니다.LIMIT반환할 행의 수를 제한합니다.예제 쿼리를 통하여 각 절이 어떻게 함께 작동하는지 살펴보겠습니다.SELECT customers.customer_id, ..

Data/MySQL 2024.08.04

쿠버네티스 롤링 업데이트 시 발생한 502 오류 해결

레거시 api 중에 `502 Bad Gateway` 에러가 발생하여 올바르게 동작하지 못하였다...(이럴 수가 502 에러라니👀)502 에러이기 때문에 repo에서 찍은 로그도 찾을 수 없어 nginx 로그를 뒤져보았담.확인해 보니 Connection refused가 난 로그를 확인할 수 있었습니다.그동안 문제가 없었는데 왜 Connection refused 에러가 있었을까요??로그남은 일시를 확인해 보니 버그가 있어 배포를 진행된 시점과 동일했다... 현재 쿠버네티스에서 롤링업데이트로 배포가 진행되고 있었는데 이 과정에서 기존 파드에서 발생된 오류로 판단하였다..쿠버네티스의 롤링 업데이트와 TerminationGracePeriodSeconds 설정으로 해결한 방안을 살펴보겠습니다. 쿠버네티스의 롤링 ..

Docker와 Kubernetes 비교

Docker와 Kubernetes에 대해 정리해 보도록 하겠습니다. Docker란 무엇인가요?Docker는 소프트웨어를 컨테이너라는 작은 독립한 환경에서 실행할 수 있게 해주는 도구입니다.컨테이너는 애플리케이션과 그 실행에 필요한 모든 것을 포함하고 있어서, 어디서나 동일하게 실행될 수 있습니다.이미지실행 가능한 애플리케이션의 청사진. 일종의 템플릿이라고 생각할 수 있습니다.컨테이너이미지를 실행한 것. 하나의 애플리케이션이나 서비스가 실행되는 환경입니다.Dockerfile이미지를 만들기 위한 설정 파일.여기에는 어떤 애플리케이션을 설치할지, 어떤 명령어를 실행할지가 적혀 있습니다. Kubernetes란 무엇인가요?kubernetes는 많은 컨테이너를 효율적으로 관리하고 오케스트레이션 하는 도구입니다.단일..

[Java] 일급 컬렉션(First-Class Collection)이란?

코드의 품질을 높이기 위해 고민하던 도중 일급 컬렉션을 활용해 보기로 결정하였습니다.🙌일급 컬렉션에 대해 알아보도록 하겠습니다.  일급 컬렉션이란?일급 컬렉션(First-Class Collection)은 하나의 컬렉션(List, Set, Map 등)을 캡슐화한 크래스를 의미합니다.즉, 컬렉션 자체를 클래스로 래핑(wrapping)하여 컬렉션과 관련된 로직을 해당 클래스 내부에 숨기는 것입니다.이러한 일급 컬렉션은 단일 책임 원칙(Single Responsibility Principle)을 지키며, 컬렉션을 직접 다루는 것보다 더 많은 장점을 제공합니다. 왜 일급 컬렉션을 사용해야 하는가?캡슐화의 응집도일급 컬렉션은 컬렉션과 관련된 로직을 한 곳에 모아두기 때문에 응집도가 높아지고 캡슐화가 잘 유지됩니다..

Backend/Java 2024.07.31

Header Referer를 아시나요?

시스템에서 알 수 없는 오류가 발생했을 때, 어떻게 문제를 파악할지 고민되었습니다...😵‍💫이러한 오류는 정확히 파악하기 위해서는 문제가 발생한 경로를 확인하는 것이 중요할 것 같다고 판단하였습니다.이를 위해 Header의 Referer값을 로그로 남겨보기로 결정했습니다! 이번 글에서는 HTTP 헤더의 Referer에 대해 알아보고, 이를 활용하여 문제를 파악하는 방법에 대해 설명하겠습니다. Header Referrer란?HTTP Referer 헤더는 웹 브라우저가 서버로 요청을 보낼 때 이전 웹 페이지의 URL을 포함하는 HTTP 헤더입니다.이 헤더는 현재 요청의 어떤 경로를 통해 왔는지를 서버가 알 수 있게 해 줍니다.웹 브라우저가 페이지 A에서 페이지 B로 이동할 때, 페이지 B의 서버는 Re..

Web/HTTP 2024.07.30