2026/09/08

오늘의 이야기

Oracle OFFSET 성능 최적화와 Keyset 페이징


페이징



 


OFFSET은 데이터가 많아질수록 성능이 급격히 떨어집니다. 대용량 환경에서는 Keyset Pagination(Seek 방식)을 사용하고, 정렬 컬럼에 적절한 인덱스를 추가하는 것이 가장 효과적인 방법입니다.




OFFSET 성능 문제



  • OFFSET-FETCH 방식은 지정된 OFFSET만큼 데이터를 건너뛰기 위해 정렬 후 스캔을 수행합니다.

  • 데이터가 수백만 건 이상이면 TEMP 공간 사용과 CPU 부하가 급격히 증가합니다.




페이징 방식 비교





























방식 장점 단점 성능 특성
ROW_NUMBER 정렬 순서 보장, 임의 페이지 접근 가능 전체 정렬 비용 발생 대량 데이터에서 성능 저하
OFFSET-FETCH SQL 문법 간결, 직관적 OFFSET 커질수록 성능 급격히 저하 수백만 건 이상에서 비효율적
Keyset Pagination 불필요한 데이터 건너뛰지 않음, 일정한 성능 임의 페이지 접근 불가, 마지막 키 값 필요 대량 데이터에서도 안정적



Keyset 페이징 샘플 코드


1페이지 (처음 50개)


SELECT *
FROM orders
ORDER BY created_at, order_id
FETCH FIRST 50 ROWS ONLY;

2페이지 이후 (Seek 방식)


SELECT *
FROM orders
WHERE (created_at, order_id) > (:lastCreatedAt, :lastOrderId)
ORDER BY created_at, order_id
FETCH FIRST 50 ROWS ONLY;

100번째 페이지 접근


SELECT *
FROM orders
WHERE (created_at, order_id) > (:lastCreatedAt_99, :lastOrderId_99)
ORDER BY created_at, order_id
FETCH FIRST 50 ROWS ONLY;



운영 전략



  • 순차 탐색: Keyset 본연의 방식, 성능 최적

  • 중간 키 값 캐싱: 임의 페이지 접근 가능, 애플리케이션에서 관리 필요

  • ROW_NUMBER 혼합: 특정 페이지 점프 가능, 대량 데이터에서는 성능 저하




결론



  • 소규모 데이터(10만 건 이하) → OFFSET-FETCH도 실용적

  • 대규모 데이터(100만 건 이상) → 반드시 Keyset Pagination + 인덱스 최적화

  • 엑셀 다운로드, 로그 조회 등 대량 처리 → Keyset 방식이 안정성과 성능 모두 우수





오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/09/07

[LottoAI] 1241회차 추천 번호

LottoAI 추천 리포트 - 1241회차

지난 회차 결과 (1240회차)
실제 당첨 번호: (11, 13, 19, 20, 31, 44) (보너스 27)
지난 추천 최고 적중: 3개


이번 회차 추천 Top 5

순위 번호 신뢰도 특징
1 5, 11, 13, 31, 32, 38 98.0% odd/even=4/2, sum=130, sum-profile=historical-center, low-high-balance, overlap-minimized, collective-coverage-maximized
2 3, 11, 12, 15, 26, 35 70.2% odd/even=4/2, sum=102, sum-profile=historical-edge, low-high-balance, overlap-minimized, collective-coverage-maximized
3 7, 19, 26, 30, 31, 45 50.0% odd/even=4/2, sum=158, sum-profile=historical-center, low-high-balance, overlap-minimized, collective-coverage-maximized
4 1, 6, 15, 27, 38, 45 49.9% odd/even=4/2, sum=132, sum-profile=historical-center, low-high-balance, overlap-minimized, collective-coverage-maximized
5 12, 13, 19, 20, 27, 41 49.7% odd/even=4/2, sum=132, sum-profile=historical-center, low-high-balance, overlap-minimized, collective-coverage-maximized

본 결과는 통계 기반 참고자료이며 당첨을 보장하지 않습니다.

오늘의 이야기


#스하리1000명프로젝트,
แพ้เกาหลีเหรอ? แม้ว่าคุณจะพูดภาษาเกาหลีไม่ได้ แต่แอปนี้จะช่วยให้คุณเดินทางได้อย่างง่ายดาย
เพียงพูดภาษาของคุณ ระบบจะแปล ค้นหา และแสดงผลลัพธ์เป็นภาษาของคุณ
เหมาะสำหรับนักเดินทาง! รองรับมากกว่า 10 ภาษา รวมถึงภาษาอังกฤษ ญี่ปุ่น จีน เวียดนาม และอื่นๆ อีกมากมาย
ลองตอนนี้!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/09/06

오늘의 이야기

 



JavaScript input 길이 체크 방법


이미지



 


1. 기본적인 길이 체크


JavaScript에서 input의 길이를 확인할 때는 value.length 속성을 사용합니다.


<input type="text" id="username" />
<button onclick="checkLength()">확인</button>

<script>
function checkLength() {
const input = document.getElementById("username").value;
const length = input.length;

if (length < 5) {
alert("입력값은 최소 5글자 이상이어야 합니다.");
} else {
alert("입력값 길이: " + length);
}
}
</script>

2. 주요 방법



  • value.length : 문자열 길이를 직접 확인

  • maxlength 속성 : HTML에서 입력 가능한 최대 길이를 제한


<input type="text" maxlength="10">


  • 이벤트 리스너 활용 : input 이벤트로 실시간 길이 체크


const input = document.getElementById("username");
input.addEventListener("input", () => {
console.log("현재 길이:", input.value.length);
});

3. 활용 팁


보통은 maxlength로 기본 제한을 두고, 추가적인 검증은 value.length로 처리하는 방식이 가장 많이 쓰입니다.




 





오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/09/05

오늘의 이야기


#스하리1000명프로젝트,
Nawala sa Korea? Kahit na hindi ka nagsasalita ng Korean, tinutulungan ka ng app na ito na madaling makalibot.
Sabihin lang ang iyong wika—ito ay nagsasalin, naghahanap, at nagpapakita ng mga resulta pabalik sa iyong wika.
Mahusay para sa mga manlalakbay! Sinusuportahan ang 10+ wika kabilang ang English, Japanese, Chinese, Vietnamese, at higit pa.
Subukan ito ngayon!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/09/04

오늘의 이야기

 


 


DevExtreme dxDataGrid 활용 정리


이미지도 만들기



 


이번 글에서는 DevExtreme dxDataGrid를 사용하면서 자주 쓰이는 기능과 팁들을 정리했습니다. JavaScript와 함께 동적으로 데이터를 제어하거나 UI를 커스터마이징할 때 유용합니다.


1. 특정 셀 숨기기



cellTemplate을 활용하여 조건에 따라 셀을 숨길 수 있습니다.




columns: [
{
dataField: "Phone",
cellTemplate: function(container, options) {
if (options.data.IsHidden) {
container.text(""); // 숨김 처리
} else {
container.text(options.value);
}
}
}
]

2. 특정 컬럼 숨기기/보이기



var grid = $("#gridContainer").dxDataGrid("instance");

// 컬럼 숨기기
grid.columnOption("Phone", "visible", false);

// 다시 보이기
grid.columnOption("Phone", "visible", true);

3. 조건에 맞는 항목 값 추출


JavaScript에서 filtermap을 조합하면 조건에 맞는 데이터를 쉽게 뽑을 수 있습니다.



const namesWithY = dataSource
.filter(item => item.status === "Y")
.map(item => item.name);

4. 조건에 맞는 항목의 Key 추출



const yKeys = Object.keys(row).filter(key => row[key] === "Y");

5. 전체 그리드에서 Y 값이 있는 컬럼 찾기



const yKeysAll = dataSource
.map(row => Object.keys(row).filter(key => row[key] === "Y"))
.flat();

const uniqueYKeys = [...new Set(yKeysAll)];

6. 조건에 맞는 컬럼만 보이게 설정



const grid = $("#gridContainer").dxDataGrid("instance");

// 모든 컬럼 숨기기
grid.getVisibleColumns().forEach(col => {
grid.columnOption(col.dataField, "visible", false);
});

// Y가 나온 컬럼만 보이게
uniqueYKeys.forEach(key => {
grid.columnOption(key, "visible", true);
});

7. 문자열 첫 글자만 추출



const str = "Hello";
console.log(str.charAt(0)); // "H"
console.log(str[0]); // "H"
console.log(str.slice(0,1)); // "H"

8. dxDataGrid에서 배경색 변경


columnOption으로는 스타일 변경이 불가능합니다. 대신 onCellPrepared 또는 onRowPrepared 이벤트를 사용해야 합니다.



onCellPrepared: function(e) {
if (e.rowType === "data" && e.column.dataField === "status") {
if (e.value === "Y") {
e.cellElement.css("background-color", "#d1ffd1");
}
}
}


onRowPrepared: function(e) {
if (e.rowType === "data" && e.data.status === "Y") {
e.rowElement.css("background-color", "#e0f7fa");
}
}

마무리


dxDataGrid는 데이터 표시와 관리에 강력한 기능을 제공하지만, 세부적인 스타일링이나 조건부 제어는 이벤트 기반 접근이 필요합니다. 위의 예시들을 활용하면 다양한 상황에서 유연하게 대응할 수 있습니다.





오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/09/03

오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/09/02

오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




오늘의 이야기

Oracle OFFSET 성능 최적화와 Keyset 페이징 페이징   OFFSET 은 데이터가 많아질수록 성능이 급격히 떨어집니다. 대용량 환경에서는 Keyset Pagination(Seek 방식) 을 사...