전체보기 106

Hibernate - Oracle Dialect 정확히 사용하기

서론 (Introduction) JPA를 사용하면 대표적인 구현체인 HIbernate를 사용하게 됩니다. HIbernate는 SQL 쿼리를 생성하주는 기능을 가지고 있는데, MySQL, Oracle 등 데이터베이스 마다 문법이 조금씩 다르기 때문에 Dialect(방언)을 설정해 주어야합니다. 이번 글에서는 Oracle 데이터베이스를 위한 Dialect 설정에 대해서 다루어보도록 하겠습니다. 본문 (Body) a. org.hibernate.dialect Hibernate에서는 데이터베이스 방언들을 org.hibernate.dialect 패키지에 정리하고 있습니다. 이 패키지의 내용은 hibernate 버전이 변경되면서 조금씩 바뀌어왔습니다. 여기에서는 이전 버전과 현재 버전의 dialect 적용에 대해서 ..

카테고리 없음 2023.10.13

JPA - Value '0000-00-00' can not be represented as java.sql.Date

서론 (Introduction) JPA를 사용한 스프링 프로젝트를 기존에 존재하던 오라클 데이터베이스에 접속하자 JPA - Value '0000-00-00' can not be represented as java.sql.Date 에러가 발생했습니다. 이 에러가 발생한 원인과 해결과정에 대해서 다루어보겠습니다. 원인 파악 (Diagnosis) 먼저 상황을 재현해보도록 하겠습니다. 아래와 같이 LocalDate 타입을 가진 필드를 선언한 엔티티를 이용해 데이터베이스에서 데이터를 가져오는 과정에서 에러가 발생했습니다. 날짜가 포함된 컬럼에 '0000-00-00' 데이터를 가진 튜플이 있었는데, 이 튜블을 데이터베이스에서 조회해 클래스로 변환하는 과정에서 에러가 발생했습니다. @Entity(name = "per..

카테고리 없음 2023.10.13

Spring MessageSource 사용시 한글 깨짐 해결법

상황 Spring MessageSource를 사용해 messages.properties 에서 메시지를 읽는 과정에서 한글이 아래와 같이 깨지는 상황이 생겼다. 분석 문자를 인코딩하는 과정에서 발생한 에러라고 생각되어 message.properties 파일의 인코딩을 확인한 결과 ISO-8859-1 이었지만, MessageSource는 UTF-8으로 읽어 문자열 형식이 일치하지 않는 것을 확인했다. 해결 IntelliJ에서 파일 인코딩할 때, UTF-8을 사용하도록 설정하니 한글 깨짐이 해결되었다.

카테고리 없음 2023.09.04

Spring Data MongoDB에서 Union 연산을 수행하는법

목차 소개 $UnionWith의 지원 버전 확인 네이티브 쿼리를 이용한 Union 연산 네이티브 쿼리 실행 방법 MongoCollection.aggregate를 사용한 네이티브 쿼리 실행 코드 예시 MongoClient 설정 MongoCollection 가져오기 매치 쿼리 생성 매치 쿼리를 List로 변환 $unionWith로 쿼리 감싸기 집계 연산 쿼리 추가 최종 쿼리 실행 1. 소개 MongoDB 4.4부터 SQL의 Union all과 유사한 연산인 $UnionWith를 지원합니다. 이 기능은 데이터베이스의 여러 컬렉션을 합치는 데 사용됩니다. 그러나 Spring Data MongoDB의 최신 버전인 spring-boot-start-data-mongodb:3.0.7은 spring-data-mongod..

Computer Science 2023.07.19

Gitlab에 러너를 등록하기

목차 소개 러너 등록하기 러너 구성하기 러너 테스트하기 문제 해결 소개 이 글은 Gitlab에 러너를 등록하고 설정하는 방법에 대해 안내합니다. Gitlab의 CI/CD를 활용하기 위해서는 러너를 등록해야 하며, 이를 통해 자동화된 빌드, 테스트, 배포 등의 작업을 실행할 수 있습니다. 러너 등록하기 Gitlab 러너 설치 문서를 참고하여 해당 환경에 맞게 러너를 설치합니다. Gitlab 레포지토리로 이동하여 “Settings” 메뉴에서 “CI/CD” 탭으로 이동합니다. “Runner” 항목에서 등록할 레포지토리 URL 및 등록 토큰을 확인합니다. 터미널에서 gitlab-runner register 명령을 실행합니다. URL과 토큰을 입력하고, executor는 원하는 설정으로 선택합니다. Docker를..

Computer Science 2023.07.13

앤서블로 카프카 클러스터 구축하기

1. 서버 구조 사설 인터넷망에 3개의 클러스터용 노드가 있습니다. 사설 인터넷망에 1개의 프로젝트 배포용 노드가 있습니다. 2. 앤서블 설정하기 2.1 배포 서버 DNS 설정하기 배포 서버를 정의하기 위해 /etc/hosts 파일에 호스트를 설정해야 합니다. 호스트 설정은 각 운영 체제마다 다를 수 있습니다. 리눅스 기반 시스템에서는 다음과 같이 /etc/hosts 파일을 수정합니다: //... 10.12.204.13 peter-zk01.foo.bar 10.12.204.13 peter-kafka01.foo.bar 10.12.204.14 peter-zk02.foo.bar 10.12.204.14 peter-kafka02.foo.bar 10.12.204.17 peter-zk03.foo.bar 10.12.20..

Computer Science 2023.07.13

[실전! 스프링 5를 이용한 리액티브 프로그래밍] - 01. 왜 리액티브 프로그래밍인가?

들어가며 리액티브 프로그래밍은 현대의 수요 증가와 불확실성에 대응하기 위한 새로운 소프트웨어 아키텍처와 프로그래밍 기법입니다. 이 글에서는 리액티브 프로그래밍의 필요성에 대해 다루고, 리액티브 시스템의 기본 원리, 적합한 비즈니스 사례, 적합한 프로그래밍 기술, 그리고 스프링이 리액티브로 전환되는 이유에 대해 알아보겠습니다. 책의 내용을 바탕으로 알아보는 과정에서 부족하거나 이해가 안되는 설명의 경우에는 직접 찾은 내용을 추가했습니다. 1. 왜 리액티브인가? 우리는 과거에는 톰캣과 같은 서버를 사용하여 웹 요청을 처리했습니다. 하지만 이러한 전통적인 방식은 한계가 있습니다. 예를 들어, 스레드 풀을 구성하고 초당 일정 수의 요청을 처리하는 등의 방식으로 서버를 구성합니다. 그러나 이러한 방식은 대량의 요..

카테고리 없음 2023.06.12

Kubernetes에서 Nginx Ingress Controller 413 에러 해결법

증상 Kubernetes 클러스터에서 Nginx Ingress Controller를 사용하여 서비스를 구성하였습니다. 그런데, 큰 파일을 업로드하려고 할 때마다 다음과 같은 에러가 발생합니다. 413 Request Entity Too Large 이 오류는 클라이언트가 보내는 요청이 서버가 처리할 수 있는 최대 크기를 초과했음을 나타냅니다. 기본적으로 Nginx는 1MB보다 큰 요청을 허용하지 않습니다. 해결 방법 이 문제를 해결하기 위해서는 Nginx Ingress Controller의 설정을 변경하여 최대 요청 크기를 늘려야 합니다. 이는 ingress 스펙을 작성한 yaml 파일에서 쉽게 설정할 수 있습니다. apiVersion: networking.k8s.io/v1 kind: Ingress meta..

카테고리 없음 2023.04.18

ChatGPT를 이용해 검증된 정보를 기반으로 응답 생성 시도

1. 시도 이유 기존 챗봇은 아래와 같은 문제를 가지고 있습니다. 정적인 대답, 이는 구글이나 네이버와 같은 검색 엔진과 차별점이 존재하지 않는다. 문맥 파악 불가, “내가 기저질환이 ~~ 한 편인데, 유방암이 발병할 가능성이 높을까?”와 같은 문맥을 파악한 응답이 불가능하다. GPT의 경우, 문맥을 파악한 동적인 대답이 가능하지만 아래와 같은 문제가 있습니다. 2021년 이전의 데이터셋을 바탕으로 개발되었기 때문에 최신 정보에 접근이 불가능하다. 인터넷에 있는 정보를 사용하였기 때문에 신뢰성이 떨어진다. 존재하지도 않는 정보를 생성하는 Hallucination 이 발생한다. 즉, 위 두 챗봇은 “검증된 정보로 사용자를 고려해 적절한 답변을 제시한다.”라는 목표에 도달하기 어렵습니다. 이를 해결하기 위해..

카테고리 없음 2023.03.27

Github Action으로 Spring 프로젝트를 Kubernetes에 배포하기

최근 서버 환경을 쿠버네틱스로 변경했기 때문에 지속적 배포 방법을 변경해야 합니다. 오늘은 Github Action으로 구현해 볼 것입니다. 쿠버네틱스에 배포하는 방법은 간단합니다. 원하는 배포사항을 YAML 파일로 작성해 kubectl로 등록해주면 됩니다. 이후에 Github Action에서 SSH로 접속해 YAML 파일을 전달하고 kubectl을 실행해줄 것입니다. 도커 빌드 및 레지스트리 저장 레포지토리명과 브랜치 이름을 바탕으로 이미지 이름을 정할 것입니다. Github Secret 에는 도커 허브 로그인에 사용할 DOCKER_USERNAME와 DOCKER_PASSWORD를 등록하면 됩니다. 스크립트는 다음과 같습니다. # This workflow uses actions that are not c..

Computer Science 2023.03.06