본문 바로가기

언어35

[JS] 로컬 스토리지와 세션 스토리지 쇼핑몰에 들어가 로그인을 하지 않은 상태로 장바구니에 담아보자. 그리고 다른 페이지를 전전하다, 다시 장바구니에 들어가보자. 그러면 장바구니는 텅 비어있는가? 아니다. 장바구니에는 아까 담아놓은 상품이 그대로 들어가있다. 서버에서 로그인하지 않은 사용자의 데이터도 관리하는 걸까? 물론 하려면 할 수는 있다. 하지만 굳이 그래야 할까? 로그인하지 않은 사용자의 데이터마저도 저장하면 그만큼 서버 자원과 네트워크 트래픽이 추가로 발생할 것이기에, 시스템에 부담을 줄 수 있다. 그러면 어떻게 해야할까? 방법은 서버가 아니라 클라이언트 측 저장소를 활용하는 것이다. 이를 통해 서버와의 통신을 최소화 하면서도, 사용자가 웹 사이트를 탐색하는 동안 장바구니에 담긴 상품을 유지할 수 있다. 이처럼 클라이언트 측 저장소.. 2025. 2. 6.
[JAVA] Record란 무엇인가? 학교나 학원에서 Java를 배울 때 멤버변수는 private으로 선언하며 getter, setter 등으로 접근 가능하게 하라고 배운다. 이는 객체의 캡슐화를 위해 당연히 해야할 일이다.캡슐화 (encapsulation)객체의 속성과 메서드를 하나로 묶고, 외부에서 직접 접근하지 못하도록 제한한다. setter 함수를 통해서만 데이터를 수정하도록 해서 유효성 방지를 통해 잘못된 데이터 수정을 방지하고,내부 필드가 바뀌어도 getter/setter만 유지하면 외부 코드에는 영향이 없기에 유지보수와 확장성이 좋으며, 객체의 독립성이 유지된다. 또한 getter만 제공함으로써 읽기 전용으로 활용도 가능하다. 객체를 만들 때 getter, setter는 당연히 기재하고, 상황과 필요에 toString, equa.. 2025. 2. 4.
Checked Exception과 Unchecked Exception 진짜진짜진짜진짜 간단한건데.. 까먹고 살았다가 오늘 이를 다시금 알게 된 계기가 있어 까먹지 않고자 다시 한 번 공부를 하고, 이를 블로그에 기재해볼까 한다. 프로그래밍을 하다보면 예외처리는 선택이 아닌 필수이다. 그래야만 사용자의 요청에 대한 예외가 발생했을 경우 어떠한 상황으로 인해 예외가 발생했는 지 사용자에게 return할 수 있다.그런 거 없이 500 Internal Exception만 Return하는 코드를 본 적이 있는데, 내가 사용자였다면 두 번 다시 사용하지 않을 것 같다. 그리고 예외인 Exception은 크게 두 가지로 구분된다.Checked ExceptionUnchecked Exception두 Exception의 차이점은 간단하다. 바로 try, catch로 감싸는 예외처리문이 강제.. 2024. 5. 8.
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.