본문 바로가기

프로그래밍

(91)
오라클 PLS-00183 Too many bind variables 해결방법 오라클 PL/SQL 에러 - PLS-00183 발생 운영 중인 배치 프로그램에 다른 데이터베이스에서 데이터를 가져와 업데이트하는 이런 쿼리가 있었습니다. 일배치로 실행되며 등록/수정/삭제된 데이터를 PL/SQL BEGIN ~ END 사이에서 insert, update, delete문으로 만드는 동적 쿼리가 MyBatis로 작성되어 있었습니다. BEGIN UPDATE MY_TABLE SET COL1 = #{item.col1} , COL2 = #{item.col2} , COL3 = #{item.col3} , COL4 = #{item.col4} , COL5 = #{item.col5} -- .... 이런식으로 13개 WHERE COND1 = #{item.cond1} AND COND2 = #{item.cond2}..
logback 필터 - 쓰레드명 혹은 특정 내용만 필터링하기 (로그백 커스텀 필터 구현) 로그백 커스텀 필터를 만들어주세요 맡고 있는 여러 시스템 중 하나는 jdbc.sqlonly를 INFO 레벨로 설정하고 있다. jdbc.sqlonly를 INFO레벨로 하면 파라미터가 바인딩 된 쿼리 전문이 남아서 로그양이 꽤 되지만, 장애 발생시 문제 파악을 위해 운영에서도 INFO 레벨로 설정하는 경우가 꽤 있다. 그런데 스케줄러에서 실행되는 쿼리가 1분마다 찍히고 있어서 운영하는 측에서 수정 요청이 들어왔다. 스케줄은 스프링 @Scheduled 어노테이션을 사용하여 구현하였고 별도의 커스텀 TaskScheduler를 정의하지 않았으므로 poolScheduler라는 prefix가 들어간다. 이에, Thread 이름으로 필터링을 하고자 시도하였다. 그런데 당연히 기본 기능으로 그런 필터링 기능이 제공될 줄..
IntelliJ에서 빈 줄이 들어가면 쿼리 인식이 안되는 경우(Feat. 오라클 dialect) IntelliJ를 4년째 사용해오고 있습니다. 그런데 언제부터인가 데이터베이스 콘솔에서 개행문자가 2번 이상 있는 경우에 쿼리 실행이 안되는 현상이 생겼습니다. -- 잘된다 select sysdate from dual; -- 빈 줄이 들어가면 쿼리 인식이 안된다 select sysdate from dual; 그래서 설정을 찾아보고 온갖 검색을 해봐도 못 찾아내다가, 우연히 해결방법을 발견하게 되어 기록해둡니다. 오류 증상 IntelliJ Database Console에서 빈 줄이 들어간 쿼리가 실행 안됨. 참고로 오라클 해결 방법 경고가 발생하는 곳에 마우스를 올리면 다음과 같은 dialog가 나타나는데요, "Change SQL dialect"를 선택합니다. Oracle을 선택합니다. Change Dia..
아이폰 사파리에서 이미지 새로고침 안될 때(Feat. 캡챠, Webkit 엔진) 로그인 페이지에 캡챠가 적용되어 있다. '새로고침'을 누르면 당연히 캡챠가 새로고침 되어야 한다. 물론 내가 할 땐 잘됐다. 그런데 테스트를 해보시더니 캡챠 문자열 새로고침이 안된다고 한다. "아이폰에서 안되요." 처리 프로세스 서버로 캡챠 새로고침을 요청한다. 이미지 element의 src attribute에 캡챠 이미지를 세팅한다. '/capcha/image' API 에서는 세션에 저장된 캡챠값을 이미지로 생성하여 반환한다. $.ajax('/captcha/refresh').done(function () { imgElement.attr('src', '/captcha/image'); }); 그런데 아이폰(=사파리=웹킷 엔진)에서는 이..
IntelliJ IDEA에서 gradle 2.2(혹은 2.x) 버전이 안될때 버전 주의사항 (The project uses Gradle 2.12 which is incompatible with IDEA running on Java 10 or newer.) Jetbrains의 IntelliJ IDEA(이하 IntelliJ) 2020부터는 gradle 3.0 이상을 요구합니다. 그래서 IntelliJ 2019.1 혹은 2019.3 등을 설치하여 해당 프로젝트를 열면 대부분 해결됩니다. 하지만 이 때에도 동작하지 않는 경우가 있습니다. 제 경우에는 이런 오류가 발생했습니다. The project uses Gradle 2.12 which is incompatible with IDEA running on Java 10 or newer. "프로젝트는 java 1.8로 세팅했는데 뭔소리야?" 그랬는데 사실 알고보니 이건 IntelliJ를 구동하는 자바 버전이 10 이상이라는 말이었습니다. 해결 방법 유일한 해결 방법은 Intellij를 실행하는 자바 버전을 낮추는 것..
프로그램 버그, 고치는 것만큼 중요한 버그 리포트 작성과 공유 오늘 특정 날짜에서만 발생하는 오라클 오류를 발견하게 되었는데요, 그 원인은 'NUMTOYMINTERVAL' 함수를 사용하여 날짜를 계산하던 중에 발생한 문제였습니다. 이 함수는 일반적으로 날짜와 시간 간격을 계산할 때 사용되는데, 이번에 발생한 문제는 sysdate에서 특정 년월을 더하거나 빼면서 문제가 있었습니다. 예를 들면 2월은 2월28일이 마지막 날인데, 1월31일에 sysdate + NUMTOYMINTERVAL(1, 'MONTH')를 실행하면 2월31일이라는 날짜가 존재하지 않으니 ORA-01839 오류가 발생하는 식이죠. 다행히 오래 걸리지 않아 원인은 바로 발견하였습니다. 어떤 데이터에서만 이 문제가 발생하는지 확인한 후, 'NUMTOYMINTERVAL&..
Spring 로그백 RollingFileAppender와 AsyncAppender 차이, logback-spring.xml 설정 예시 이번에 마무리 지어가는 시스템에서 로그 설정 관련 요청이 들어와 로그백의 RollingFileAppender와 AsyncAppender에 대해 정리해보았습니다. 로그백이 뭔가요? 로그백(Logback)은 자바 언어로 작성된 로깅 프레임워크입니다. 로그백에서는 RollingFileAppender와 AsyncAppender 두 가지 로그 기능을 제공합니다. RollingFileAppender RollingFileAppender는 로그 파일을 일정 크기나 기간에 따라 자동으로 분리해서 저장할 수 있는 기능을 제공합니다. 예를 들어, 로그 파일의 크기가 10MB를 넘어가면 새로운 파일을 생성하고 이전 파일에 대한 백업을 생성할 수 있습니다. 이러한 방식으로 로그 파일이 계속해서 늘어나는 것을 방지하고, 필요한 ..
@Param 어노테이션, MyBatis와 Spring Data 헷갈리지 말자 org.springframework.data.repository.query.Param와 org.apache.ibatis.annotations.Param 어노테이션은 서로 다른 패키지에 있으며 다른 용도로 사용됩니다. org.springframework.data.repository.query.Param 어노테이션은 스프링 프레임워크에서 제공하는 Spring Data JPA와 같은 ORM(Object Relational Mapping) 프레임워크에서 사용됩니다. 이 어노테이션은 메소드의 파라미터 이름과 쿼리 매개 변수 이름을 매핑하기 위해 사용됩니다. 예를 들어, 다음과 같은 메소드가 있다고 가정해보겠습니다. @Repository public interface UserRepository extends Jpa..