JPA Native Query sum 함수 반환값은 Nullable 이 될 수 있습니다.
·
Programming/BackEnd
- JPA 네이티브 쿼리에서 sum 으로 값을 더하여 가져올 때, sum 결과물이 null 이 될 수 있습니다.검색 데이터가 아예 없는 경우와,그리고 nullable 타입의 컬럼에 sum 을 할 때, 검색된 결과가 모두 null 일 경우가 그러합니다. (하나라도 검색이 되었다면, null 부분은 0 으로 취급하여 더해집니다.)  요약하자면, sum 결과값은 Long? 으로 받으세요.
JPA Native Query Boolean 매핑 주의점
·
Programming/BackEnd
- JPA 네이티브 쿼리에서 TRUE, 혹은 FALSE 로 반환되는 변수는 매핑 객체에서 Boolean 그대로 받을 수 없고, Long 타입으로 받습니다. (1L == True, 0L == False) IF( join_info.uid IS NOT NULL AND ( select count(*) FROM coverage_request where join_info_uid = join_info.uid and row_delete_date_str='/' and r..
Springboot JPA Timezone 설명 (데이터베이스와 Springboot 간의 타임존 처리 방식)
·
Programming/BackEnd
- JPA 에서 DATETIME 변수를 다룰 때는 자동으로 TimeZone 을 맞춰줍니다.    예를들어 JPA 가 돌아가는 Springboot 의 타임존 설정이 UTC,    데이터베이스가 KST 시간을 사용중이라고 했을 때,    JPA 에서 UTC 시간인 2024-05-02 03:38:46.026 를 데이터베이스에 입력하면,     데이터베이스에는 실제로는 KST 시간인 2024-05-02 12:38:46.026 가 저장이 되며,    데이터베이스에서 KST 시간인 2024-05-02 12:38:46.026 를 조회하면,     UTC 시간을 사용중인 스프링부트 시스템에 맞춰서 JPA 는,     2024-05-02 03:38:46.026 라고 데이터를 변환해줄 것입니다. - Springboot 에..
[Kotlin] List 타입 종류
·
Programming/ETC
- 리스트 타입의 종류 List : 변경이 불가능한 리스트입니다. MutableList : MutableList 는 Kotlin 의 인터페이스로, 변경 가능한 리스트를 나타냅니다. 반대되는 개념으로는, 변경이 불가능한 그냥 List 타입이 있습니다. 이는 인터페이스이므로 특정한 구현체에 의존하지 않으며, 여러 구현체가 존재할 수 있습니다. 대표적인 구현체로는 ArrayList 와 LinkedList 등이 있습니다. 만약 mutableListOf() 함수로 객체를 초기화 한다면 ArrayList 가 생성될 것입니다. ArrayList : MutableList 의 일종입니다. 내부적으로 배열을 사용하여 요소를 저장하는 리스트 구현체로, ..
Redis Cluster DockerCompose 로 구현
·
Programming/ETC
- 본 게시글은 Redis 로 Cluster 구조를 적용하여 Docker 로 구현하는 방법을 정리하였습니다.2024-09-29 기준 정상 동작 테스트(커맨드 창 접근 및 Springboot 기능 테스트)가 완료되었습니다. - 구조 설명아래 방식으로 실행한다면,로컬 컴퓨터 안에 도커 컨테이너가,값을 입력 가능한 redis-master-1 에서 3 까지 3개가 돌아가게 되고,값을 조회만 가능한 redis-slave-1 에서 3 까지 3개가 돌아가며,redis master 노드에 각각의 slave 노드가 붙어서 각 master 노드의 값을 복제해 가지고 있게 됩니다.각각의 컨테이너는 서로의 위치를 127.0.0.1 로 접근해가며 서로간 레플리카 통신을 하며 로컬에 127.0.0.1 로 서비스를 제공합니다. -..
MongoDB ReplicaSet DockerCompose 로 구현
·
Programming/ETC
- 본 게시글은 MongoDB 를 ReplicaSet 을 적용하여 Docker 로 구현하는 방법을 정리하였습니다.2024-09-29 기준 정상 동작 테스트(커맨드 창 접근 및 Springboot 기능 테스트)가 완료되었습니다. - 구조 설명아래 방식으로 실행한다면,로컬 컴퓨터 안에 도커 컨테이너가,mongodb1, mongodb2, mongodb3 로 3개가 돌아가게 되고,각각의 컨테이너는 서로의 위치를 host.docker.internal 로 접근(로컬로 치자면 127.0.0.1 과 동일)하는 것과 동일하게 접근해가며 서로간 레플리카 통신을 하며 로컬에 127.0.0.1 로 서비스를 제공합니다. - 폴더 구조는 아래와 같습니다.- mongodb-compose.ymlservices: mongodb1: ..
Docker 컨테이너 내에서 127.0.0.1(localhost) 접근하기
·
Programming/ETC
Docker 컨테이너 내에서 실행한 OS에서 127.0.0.1 을 하면 로컬 환경의 127.0.0.1 이 아닌 본인 컨테이너 내의 주소로 접근하게 됩니다.예를들어 Docker 컨테이너 내에서 로컬에서 실행되는 127.0.0.1:3306 이라는 데이터베이스에 연동하는 프로그램을 만들려고 할 때엔 이런 경우 에러가 발생하게 되죠. 이 글에서와 같이Docker 컨테이너의 네트워크 설정을 network_mode: "host"로 잡거나, 혹은 접근하려는 서비스의 컨테이너와 동일 네트워크를 사용하게 하는 방법도 있는데, 간편하게는host.docker.internal이것을 주소 대용으로 사용하면 됩니다. 예를들어 도커 컨테이너 내에서 host.docker.internal:3306 이렇게 접근을 한다면,이는 로컬 환..
데이터베이스에서 Nullable 컬럼 Unique 제약
·
Programming/DBMS
- 데이터베이스 테이블에서 Nullable 컬럼에 Unique 제약을 걸면 어떻게 될까요? 예를들어 test 테이블의 a 라는 컬럼을 Nullable Int 로 두고, 이에 Unique 제약을 걸어보겠습니다.  위와 같은 테이블로 실험해보았습니다. 만약 unique 값인 a 가 1 로 존재하는 상황에서 동일한 1 값으로 insert 를 하려하면 아래와 같이 에러가 나고,   a 를 null 로 입력하면 중복 입력이 됩니다.RDB 에서 null 은 값으로 취급되지 않기에 중복 방지 제약에 걸리지 않습니다.
JVM 메모리 누수 방지를 위한 체크사항
·
Programming/ETC
- Java, Kotlin 언어를 사용하면 C/C++ 과 다르게 Garbage Collector 가 자동으로 메모리 힙 영역을 정리해주므로, 메모리 관리에 엄격하지 않아도 됩니다.하지만 백엔드 서버 개발을 맡게된다면 이에 접근하는 클라이언트와 서버가 N 대 1 관계가 형성되기 때문에 실제 서비스에서 메모리 관련 누수에 주의해야만 할 것입니다.아래는 Java 계열 언어를 사용시 메모리 누수 방지를 위해 체크해야할 사항들을 모아둔 것입니다. 1. Static 메모리 사용을 주의하세요. Static 영역에 작성한 변수와 데이터는 프로그램의 처음과 끝까지 사라지지 않습니다. 이 영역의 사용을 지양하도록 합시다. 2. 해제를 전제로 만들어진 라이브러리를 사용할 때에는 꼭 사용 후 해제하도록 합시다...
백엔드 개발 Rest API 설계 팁 (백엔드 로직을 프론트로 전가하지 말기)
·
Programming/ETC
- 아래에 소개드릴 내용은 제가 경험한 회사 실무 프로세스를 기반으로 작성하였습니다.차이가 있을 수 있으므로, 이용 가능한 부분만을 취하시길 바랍니다. [Rest API 설계 방침 팁]- Rest API 설계는 추상적입니다.기본적으로는, url 작성시 언더바("_") 가 들어가면 안되며, 소문자만을 사용하기,HTTP 메소드는 데이터를 가져오는 API 의 경우엔 GET, 데이터를 입력하는 경우는 POST, 데이터 삭제의 경우는 DELETE, 데이터 수정의 경우, 전체 수정은 PUT, 일부 수정은 PATCH 를 사용하라는 명확한 기준이 있습니다. 다만, 그 외에는 백엔드 개발자의 자유이므로, 회사별 이에대한 규칙이 있다면 이를 따르고, 아니라면 최대한 "프론트 앤드 개발자" 가 알아보기 쉽도록 API 를 설..