본문 바로가기

언어32

Key없이 UPSERT PK가 존재한다면, 해당 PK를 기반으로 UPSERT 쿼리를 짤 수 있다. 예를 들어 아래와 같은 테이블이 있다고 해보자.CREATE TABLE IF NOT EXISTS TMP_TABLE ( PK_SEQ SERIAL PRIMARY KEY, USER_ID VARCHAR(100) UNIQUE NOT NULL, USER_NAME VARCHAR(100));  만약 해당 테이블에 대한 UPSERT 쿼리를 짜야한다면 아래와 같이 짤 수 있을 것이다. (MariaDB 기준)INSERT INTO TMP_TABLE(PK_SEQ, USER_ID, USER_NAME)VALUES(1, '123okk2', 'ㅇㅁㅇ')-- 아래가 UPSERT 부분ON DUPLICATE KEY UPDATE USER_ID='123okk2', .. 2024. 4. 29.
[PostgreSQL] VARCHAR 칼럼 내 일부 단어만 변경 한 테이블의 VARCHAR 칼럼 내 일부 단어를 다른 단어로 변경해야 하는 상황이 발생했다. 방법은 생각 외로 간단했다. 그냥 단순하게 REGEXP_REPLACE 함수를 사용하면 된다. 이제 테스트를 한 번 해보자. 단순한 단어 변경 테스트용 데이터를 아래와 같이 생성해보았다. CREATE TABLE IF NOT EXISTS replace_test ( -- SERIAL 사용 시 postgresql은 AUTO_INCREMENT가 자동 적용됨. serial_no SERIAL PRIMARY KEY, simple_str VARCHAR(100), detail_str VARCHAR(1000) ); INSERT INTO replace_test (simple_str, detail_str) VALUES ('this', .. 2024. 2. 5.
View와 Materialized View 갑자기 궁금한 게 생겼다. 바로 "View에도 인덱스를 걸 수 있나?" 였다. 그리고 궁금점에 대한 답을 찾아보던 중 몰랐던 개념을 알아냈다. 바로 MATERIALIZED VIEW였다. 얼추 어떤 것인지는 알아냈지만, "알았다!" 하고 아무것도 안하면 분명 까먹을 것이 분명하기에 적어놓으려고 한다. VIEW 우선 VIEW는 데이터베이스의 테이블에서 가져온 결과 세트에 대한 저장된 쿼리이다. 실제 데이터를 저장하지 않고, 특정 쿼리에 대한 결과를 제공하는 "가상 테이블"로 생각하면 된다. 예를 들어서 다음과 같은 DB가 있다고 가정하자. 우선 위 세 개의 테이블에 대한 CREATE와 테스트용으로 사용할 더미 데이터를 입력한다. 참고로 MariaDB는 Materialized View를 지원하지 않아 Post.. 2023. 7. 24.
Batch Insert/Delete 사용자에게 적게는 수 개에서 많게는 수만 개의 데이터를 받아 일괄적으로 처리하는 CRUD API를 개발한 경험이 있다. 처음으로 다량의 데이터를 받아 처리해야 하는 기능을 맡게 되었었다. 그래서 경험이 없어 고민을 했던 게 있다. 그건 바로 "어떻게 하면 보다 빠르게 CRUD가 완료될까"에 대한 고민이었다. 우선 로직은 아래와 같았다. 사용자에게 데이터 리스트를 입력받는다. 데이터를 하나하나 검증해보며 양식에 맞지 않거나 잘못 들어온 데이터를 식별한다. 검증된 정상적인 데이터만 골라내 DB에 Upsert한다. 검증 실패 데이터와, 검증 성공 및 db 정상 입력 데이터를 각각의 리스트에 담아 return한다. JAVA 내부에서는 어쨌든 전달받은 데이터를 개별적으로 검증하는 작업을 해야 하므로 속도를 극대화.. 2023. 7. 22.
[JAVA] 코테용 함수들 코딩테스트를 하다보면 List, Set, Map 등의 자료구조를 가져와서 써야할 때가 많다. 대부분은 평소 개발을 하거나 코딩테스트 연습 문제를 풀때는 딱히 인식을 하지 않아도 그냥 손가락이 알아서 쳐주는 함수들인데, 이상할 정도로 코딩 테스트만 가면 기억이 안나는 경우가 허다하다. 그래서 "언젠가는 정리해놓아야지..." 하다가 이제서야 정리를 한 번 해볼까 한다. List 형변환 일단 가장 먼져 형변환 코드이다. array list // array if(true) { // array > list String[] arr = new String[] {"a", "b", "c"}; List list = Arrays.asList(arr); System.out.println(list); // list > arra.. 2023. 7. 8.
[PostgreSQL] 시간 쿼리 가장 최근 프로젝트에서 RDB는 PostgreSQL만 사용했다. 그러다보니 몰랐던 사실을 몇 가지 알게 되었는데, 시간 관련 쿼리가 대표적인 예시였다. 요즘들어 PostgreSQL을 사용하는 프로젝트들이 많은데, 적어놓지 않으면 까먹을 것이 분명해서 조금이라도 오래 기억하고, 추후 필요해질 경우 곧바로 활용할 수 있도록 저장을 해놓고자 한다. 우선 다음 구조의 간단한 테이블이 있다고 가정한다. 간단하게 name, reg_date로 이루어진 테이블이다. 해당 테이블에는 아래와 같은 데이터가 입력되어있다. (참고로 오늘 날짜는 2023-05-29이다.) SELECT에서 월, 연, 일, 요일 등 특정 시간 정보만 뽑아내기 가장 먼저 저장할 쿼리는 reg_date (timestamp)에서 연, 월, 일, 요일,.. 2023. 5. 29.
1970년 01월 01일 00시 00분 00초 개발을 하던 중 쿼리파라미터를 입력받아 해당 쿼리에 맞는 데이터를 HBase에서 추출하는 요구사항을 만났다. 쿼리파라미터에는 시작일~종료일 사이의 데이터만을 뽑아내는 옵션도 존재했는데, 이 변수가 참 애매하게 잡혀있었다. 설명하자면 너무 복잡해지고 보안상 좋지 않을 수 있으므로 일단 설명은 패스하겠다. 어찌됐든 DB에 쿼리를 날릴 때 startDate와 endDate는 무조건 있어야 겠다는 생각이 들었다. 그래서 코드를 짤 때 막연하게 이렇게 생각했다. "쿼리에 startDate와 endDate가 입력되지 않은 상태면... 그냥 대충 startDate는 1900년 01월 01일로 하고 endDate는 오늘날짜로 하면 되겠다!" 그래서 얼추 아래와 비슷하게 코드를 구현해놓았다. Calendar startC.. 2023. 3. 17.
[JS] setInterval, setTimeout 자바스크립트에서는 setInterval, setTimeout 함수를 통해 스케줄러를 지원한다. 두 함수의 차이는 아래와 같다. setInterval : 지정된 주기로 특정 코드를 실행한다. setTimeout : 지정된 초가 지난 후 특정 코드를 1회 실행한다. 즉 setInterval은 주기적으로 지정된 코드를 계속 실행하고, setTimeout은 한 번 실행 후 멈추게 된다. F12를 누른 후 아래 코드를 복사하여 실행해보면 차이를 명확하게 알 수 있다. setTimeout(function() { console.log('timeout'); }, 1000); setInterval(function() { console.log("interval"); }, 1000); 위 코드 실행 시 timeout이라는 .. 2022. 7. 26.
JDBC 사용법 DB내 특정 테이블을 다른 DB내 테이블과 동기화시켜야 하는 요구사항이 발생했다. 해당 기능의 구현을 위해서는 Spring의 DataSource를 두 개로 설정해서 개발해도 되지만, "고작 테이블 하나를 퍼오는 작업에 굳이 그 정도의 노력을 감수해야 할까?" 하는 생각이 들었다. 결과적으로 그 정도의 노력을 감수하고 싶지 않았고, 해당 기능은 일반 JDBC로 사용하기로 결심했다. 그러나 JPA에 너무 익숙해진 탓에 일반 JDBC를 사용하는 방법을 잊어먹어버렸고, 똑같은 상황이 발생할 경우 언제든 다시 사용할 수 있도록 코드를 저장해놓고자 한다. import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStateme.. 2022. 7. 25.
리눅스 OS에 명령어 보내기 Java 프로그램이 OS내 자원을 주기적으로 관리해야 하는 요구사항이 생겼다. 이에 해당 요구사항 구현을 위해 구글링을 해본 결과 ProcessBuilder를 사용하는 것이 간편해보여 이를 통해 구현을 완료했고, 언제든 사용할 수 있도록 해당 내용을 저장하고자 한다. import java.io.BufferedReader; import java.io.InputStreamReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; = @Service public class SomeService { Logger logger = LoggerFactory.getLogger(S.. 2022. 7. 21.
[JAVA] 온점 단위 Split 기존 프로그램을 수정하는 과정에서 원래의 기능을 새로운 기능에 접목시키기 위해, 몇 개의 변수를 온점 (.) 단위로 스플릿을 할 일이 생겼다. 예를 들어 123.456.789 라는 String이 있으면, 당연히 {Variable}.split("."); 와 같이 split을 하면 돌아갈 줄 았았다. 하지만 위 함수의 결과값인 배열은 length가 0이 나온다. 즉 빈 배열이 반환된다. 이유라면 split은 원래 정규식을 파라미터로 받는 함수이고, 정규식에서 온점(.) 은 하나의 임의의 문자로 인식을 하기 때문이었다. 그래서 위의 경우에는 정규식을 사용하여 다음과 같이 사용하면 온점 단위 Split이 가능함을 확인하였다. {Variable}.split("[.]"); 2022. 3. 10.
[PostgreSQL] 캐릭터형 AUTOINCREMENT AutoIncrement를 사용하면 1, 2, 3, 4 와 같은 시퀀스 ID가 자동으로 만들어지게된다. 하지만 때로는 위와 같은 방식이 아니라, 숫자형의 자리수를 정해서 0001, 0002 와 같은 ID를 만들어야 할 때가 있다. PostgreSql에서는 다음의 방법으로 위의 ID를 만들 수 있다. 쿼리는 다음과 같다. CREATE SEQUENCE IF NOT EXISTS START WITH 1 INCREMENT BY 1 NO MINVALUE || MINVALUE 1 NO MAXVALUE || MAXVALUE 99999 CACHE 1; CREATE TABLE IF NOT EXISTS ( column1VARCHAR(N)DEFAULT to_char(nextval('SEQUENCE_NAME'), 'FM0000.. 2021. 10. 25.