전체 글 98

Oracle SQLRecoverableException: 소켓에서 읽을 데이터가 없습니다 원인과 해결 방법

Spring과 MyBatis를 사용하는 운영 환경에서 다음과 같은 오류가 발생할 수 있다.java.sql.SQLRecoverableException: 소켓에서 읽을 데이터가 없습니다영문 Oracle 환경에서는 비슷하게 다음 메시지가 나타난다.java.sql.SQLRecoverableException: No more data to read from socket오류 로그에는 MyBatis Mapper 파일과 실행한 SQL이 함께 표시되기 때문에 처음에는 SQL 문법이나 파라미터 문제라고 생각하기 쉽다.하지만 이 오류는 대부분 SQL 자체의 문제가 아니라 애플리케이션과 Oracle DB 사이의 연결이 끊어진 상태에서 쿼리를 실행했기 때문에 발생하는 연결 오류다.이번 글에서는 실제 로그 흐름을 기준으로 오류의 ..

ERRORHiSTORY 2026.08.04

JSP에서 리스트를 최신순으로 정렬하고 최근 데이터 5개만 출력하기

웹 화면을 개발하다 보면 Controller에서 전달받은 전체 데이터 중에서 등록일 기준으로 가장 최근 데이터 몇 개만 보여줘야 하는 경우가 있다. 쿼리에서 날짜 기준으로 내림차순을 하는게 맞지만 운영에서는 재기동을 해야 하는경우가 있어 그렇게 간단하지만은 않다. 이번에는 재기동 없이 Controller에서 받은 데이터를 화면에서 정렬순을 정리하여 다시 출력해주는 방식을 해보았다.1. 구현하려는 기능Controller에서 JSP로 다음과 같은 리스트가 전달됐다고 가정한다.List> eventParticipants각 데이터에는 다음과 같은 값이 들어 있다.USER_NAME : 사용자 이름ANSWER2 : 응원 메시지REG_DT : 등록일구현 목표는 다음과 같다.1. eventParticipants..

ETC 2026.08.04

JavaScript 팝업창과 부모창 제어 방법

웹사이트에서 이벤트 페이지나 신청 페이지를 팝업으로 띄우는 경우가 있다.이때 사용자가 로그인하지 않은 상태라면 팝업 안에서 로그인 페이지로 이동시키는 것보다, 기존 메인 페이지를 로그인 페이지로 이동시키고 팝업은 닫는 방식이 더 자연스럽다.이번 글에서는 JavaScript의 window.opener를 사용해서 팝업창에서 부모창을 제어하는 방법을 정리한다.1. 기존 코드의 문제점기존 코드는 다음과 같다.if (logYn == 'N') { alert('로그인 후 참여 가능합니다.\n본 이벤트는 재외동포 경제인 대상 이벤트로,\n참가등록을 완료한 분에 한해 참여 가능합니다.'); location.href = "http://localhost:8080/new_okf/login/login.do"; ..

HTML/JQUERY 2026.07.07

DB : INSERT 중복 피하는 방법

웹 서비스를 운영하다 보면 짧은 시간 내에 수백 개의 데이터가 인위적으로 밀려 들어오는 매크로(Bot) 공격을 만날 때가 있습니다. 특히 경품이 걸린 설문조사나 이벤트 페이지가 주요 타겟이죠.오늘은 DB 레벨에서 동일 IP의 중복 제출을 초 단위로 정밀하게 차단하는 방법을 알아보겠습니다.1. 왜 DB에서 막아야 할까요?보통 자바스크립트로 "제출 버튼 비활성화" 처리를 하지만, 매크로는 브라우저를 거치지 않고 서버 URL로 직접 데이터를 쏩니다. 서버 로직에서 체크할 수도 있지만, DB 쿼리 한 번으로 체크와 저장(Insert)을 동시에 처리하는 것이 가장 확실하고 빠릅니다.2. 핵심 로직: "먼저 조회하고, 없으면 넣어라"우리가 구현할 로직은 다음과 같습니다.사용자의 IP 주소를 식별한다.해당 IP로 최..

AJAX 통신 시 한글 깨짐

웹 개발을 하다 보면 서버 콘솔(System.out.println)에는 한글이 예쁘게 잘 찍히는데, 브라우저로 넘어온 데이터나 팝업창에서는 ???나 알 수 없는 외계어로 깨져서 나오는 경우가 있습니다.오늘은 이 문제가 발생하는 원인과 확실한 해결 방법을 정리해 보겠습니다.1. 현상 (Problem)서버 로그: dcList = {FILE_REAL_NAME=만족도 배너.png...} (정상)브라우저/AJAX 결과: {"FILE_REAL_NAME":"??? ??.png"} (깨짐)2. 원인 (Cause)서버에서 데이터를 보낼 때, 브라우저에게 "이 데이터는 UTF-8 형식의 한글을 포함하고 있어"라고 명시적으로 알려주지 않았기 때문입니다.특히 자바의 HttpServletResponse에서 getWriter()..

HTML/JQUERY 2026.03.23

[JavaScript] 지저분한 if-else 쳐내기: Object(Map)를 활용한 조건문 리팩토링

프론트엔드 개발을 하다 보면 특정 조건에 따라 데이터를 필터링해야 하는 경우가 참 많습니다. 특히 연도별로 다른 코드나 데이터를 보여줘야 하는 상황이라면 어떨까요?처음에는 간단한 if문으로 시작하지만, 연도가 쌓일수록 코드는 걷잡을 수 없이 길어집니다. 오늘은 이렇게 길어지는 if-else 조건문을 객체(Object) 매핑을 통해 우아하게 리팩토링하는 방법을 알아보겠습니다.🚨 문제 상황: 끝없이 늘어나는 if-else예를 들어, 특정 사업 신청 페이지에서 선택한 연도(Year)에 따라 허용되는 사업 코드(Code) 목록이 다르다고 가정해 보겠습니다.가장 직관적으로 작성하면 아래와 같은 코드가 나옵니다.// 서버에서 받아온 전체 코드 리스트var dcCodeList = data.dcCmncddtlCode..

HTML/JQUERY 2026.03.16

🛠 JSP에서 Swiper가 안 먹히는 문제 해결 (DOM 렌더링 타이밍 + 다중 Swiper 초기화 이슈)

📌 문제 상황JSP에서 로 이미지 리스트를 그린 후Swiper를 초기화했는데 다음과 같은 문제가 발생했다.슬라이드가 한 개만 보임버튼이 동작하지 않음썸네일과 메인 이미지가 연결되지 않음Swiper가 아예 적용되지 않음📌 원인 분석1️⃣ Swiper를 1번만 초기화한 문제HTML에는 .swiper-container가 2개 존재했다.메인 이미지 영역썸네일 영역그런데 JS에서는 이렇게 초기화하고 있었다.new Swiper('.swiper-container', { slidesPerView: 4});이 방식은 첫 번째 요소만 제대로 잡거나 서로 충돌을 일으킨다.2️⃣ DOM 렌더링 타이밍 문제JSP 는 서버에서 렌더링되지만JS 실행 시점이 DOM 생성보다 빠르면Swiper는 .swiper-slide를 인..

HTML/JQUERY 2026.03.03

IndexOutOfBoundsException: No group

— MyBatis SQL 로그 인터셉터 정규식 함정 정리1. 사건의 시작국가 기본 정보 수정 기능에서 아래와 같은 문자열을 저장하려다 오류가 발생했다.Ghanaian Cedi ※ US $1 = 14.16 GH₵ ('24, EIU )증상은 단순했다.UPDATE 실행 시 예외 발생DB에는 아무 데이터도 반영되지 않음$ 문자가 포함된 경우에만 실패처음에는 자연스럽게 아래를 의심했다.DB 컬럼 타입 문제?MyBatis 파라미터 바인딩 문제?특수문자 인코딩 문제?하지만 전부 아니었다.2. 에러 로그 분석핵심 에러는 다음과 같았다.java.lang.IndexOutOfBoundsException: No group 1그리고 스택 트레이스를 끝까지 따라가면 진짜 범인이 보인다.at com.sangs.common.filt..

ERRORHiSTORY 2026.01.27

TypeError: Cannot read properties of null (reading 'includes') 삽질기

개발하다 보면 하루에 한 번쯤은 마주치는 에러가 있다.바로 TypeError.오늘은 그중에서도 includes()를 사용하다가 만난Cannot read properties of null (reading 'includes') 에러를 정리해본다.1. 문제 상황리스트 데이터를 순회하면서 특정 상태값에 따라 HTML을 동적으로 생성하는 로직을 작성했다.// 문제가 발생한 코드if (viewList[i].applyStepStr.includes('중도포기')) { innerHtml += '' + viewList[i].applyStepStr + '';} else { innerHtml += '' + viewList[i].userStatus + '';}로직 자..

ERRORHiSTORY 2026.01.09

meta vs robots.txt — 검색엔진 제어의 모든 것

검색엔진 최적화(SEO)를 하다 보면 와 robots.txt 두 가지가 자주 등장한다.둘 다 검색엔진 크롤링을 제어하는 도구지만,역할과 적용 방식, 우선순위, 동작 원리가 완전히 다르다.이 글에서는 두 코드가 어떤 기능을 가지며검색엔진이 실제로 어떻게 해석하고 동작하는지예시까지 포함해 아주 자세히 정리해본다.1. robots.txt란 무엇인가?robots.txt는 사이트 전체에 대한 크롤러 접근 규칙을 지정하는 파일이다.웹사이트의 최상단(root)에 위치하며, 외부 봇(googlebot, naverbot 등)이사이트에 접근할 때 가장 먼저 읽는 문서다.✔ 예시User-agent: *Disallow: /mypage/Allow: /✔ 의미 해석User-agent:* → 모든 크롤러에게/mypage/ 아래는 ..

ETC 2025.11.20