본문 바로가기

java

(9)
logback 필터 - 쓰레드명 혹은 특정 내용만 필터링하기 (로그백 커스텀 필터 구현) 로그백 커스텀 필터를 만들어주세요 맡고 있는 여러 시스템 중 하나는 jdbc.sqlonly를 INFO 레벨로 설정하고 있다. jdbc.sqlonly를 INFO레벨로 하면 파라미터가 바인딩 된 쿼리 전문이 남아서 로그양이 꽤 되지만, 장애 발생시 문제 파악을 위해 운영에서도 INFO 레벨로 설정하는 경우가 꽤 있다. 그런데 스케줄러에서 실행되는 쿼리가 1분마다 찍히고 있어서 운영하는 측에서 수정 요청이 들어왔다. 스케줄은 스프링 @Scheduled 어노테이션을 사용하여 구현하였고 별도의 커스텀 TaskScheduler를 정의하지 않았으므로 poolScheduler라는 prefix가 들어간다. 이에, Thread 이름으로 필터링을 하고자 시도하였다. 그런데 당연히 기본 기능으로 그런 필터링 기능이 제공될 줄..
Spring 로그백 RollingFileAppender와 AsyncAppender 차이, logback-spring.xml 설정 예시 이번에 마무리 지어가는 시스템에서 로그 설정 관련 요청이 들어와 로그백의 RollingFileAppender와 AsyncAppender에 대해 정리해보았습니다. 로그백이 뭔가요? 로그백(Logback)은 자바 언어로 작성된 로깅 프레임워크입니다. 로그백에서는 RollingFileAppender와 AsyncAppender 두 가지 로그 기능을 제공합니다. RollingFileAppender RollingFileAppender는 로그 파일을 일정 크기나 기간에 따라 자동으로 분리해서 저장할 수 있는 기능을 제공합니다. 예를 들어, 로그 파일의 크기가 10MB를 넘어가면 새로운 파일을 생성하고 이전 파일에 대한 백업을 생성할 수 있습니다. 이러한 방식으로 로그 파일이 계속해서 늘어나는 것을 방지하고, 필요한 ..
데이터베이스에 파일을 blob으로 저장하는 방법 파일을 서버 파일시스템에 저장할 것인지 데이터베이스에 저장할 것인지는 대개는 고려대상이 아닙니다. 데이터베이스는 서버 용량에 비해 매우 비싼 자원입니다. 그럼에도 불구하고 다양한 비즈니스 요구사항에 따라서 데이터베이스에 파일을 저장하는 것을 고려해보아야 하는 경우도 있습니다. 오늘은 다른 회사로 이직한 후배가, 이직한 회사에서는 데이터베이스에 Blob으로 파일을 저장한다며, 이렇게 만드는 경우도 있냐고 해서 관련 내용을 정리해보았습니다. 제가 취준생일 때 이런식으로 설계를 해본 경험이 있는데 여러모로 많은 번거로움에 비해 큰 이점은 느끼지 못했던 방법이었습니다. 제가 아직 그런 경우가 필요한 비즈니스 프로세스를 경험해보지 못했을 수도 있습니다. 데이터베이스에 파일을 Blob 저장할 때 장단점 파일을 데이..
No thread-bound request found No thread-bound request found 오류 RequestContextHolder에서 request를 가져오려는데 다음과 같은 오류가 발생했다. HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the o..
쿠키에 저장한 한글이 깨질 때 keywords: java / web / cookie / spring 오류 회원가입을 구현하면서 Map을 통채로 JSON 문자열로로 바꿔 쿠키에 저장했다. 그런데 꺼내어 보니 한글이 모두 ???로 나온다. 내 마음이 ???다. 처음에는 Jackson ObjectMapper 설정에 문제가 있는 줄 알고 프로젝트에서 쓰는 JSONUtil을 건드리다가, 오후 잠을 깨고 한스텝씩 디버깅을 찍어 보니 JSON은 문제가 없었다. 원인 점심 많이 먹고 오후에 졸린 내가 문제 비영어권에서 태어난 것 한글은 URL Encoding 해서 저장해야 함. 해결 저장할 때는 URLEncoder.encode(...) 꺼낼 때는 URLDecoder.decode(...) 코드 참고. CookieUtils는 임의로 쓴 것이니 프로젝트..
맥/MacOS - CannotGetJdbcConnectionException 로케일을 인식할 수 없습니다 맥OS 업데이트 후 갑자기 ajax 요청에서 오류가 발생해서 보니 로케일을 인식할 수 없다는 오류가 나있다. 오류 CannotGetJdbcConnectionException 어쩌고저쩌고 로케일을 인식할 수 없습니다. 해결 1. VM 옵션 추가 -Duser.language=ko -Duser.country=KR 2. 언어 및 지역 변경 맥 시스템 환경설정 -> 언어 및 지역 들어가서 다른 나라로 바꿨다가 다시 대한민국으로 해주면 된다. 매번 OS 업데이트 할 때마다 이런다. 엄청 오래된 버그다. 애플이 미국놈들이라서 이런건 신경 안쓰는 건지 ㅜㅜ 그럼에도 불구하고 나는 애플을 쓴다. 미제 앞잡이다......
List<?>를 사이즈별 List<List<?>> 로 나누기 (Lists.partition) 문제 List에 PK 값이 담겨 있다. 오라클 WHERE 절에서 IN (...) 값으로 사용하려고 했으나, IN(...)에는 최대 1,000개까지 파라미터가 들어갈 수 있다고 한다. 그래서 1,000개씩 나누어서 여러번 호출했다. 검색을 해보니 DB에 함수를 만들고 어쩌고저쩌고 해서 가능하다고 한다. 하지만 이 데이터베이스에 나는 select 말고는 아무 권한이 없다. 그래서 그냥 여러번 호출했다. 해결 Lists.partition(list, n) Guava 라이브러리를 사용하면 된다고 한다. 하지만 내부망이라서 좌절했다. 그래도 혹시나 싶어서 Lists. 까지 입력하고 자동완성을 켜봤더니 뭔가 나온다! 놀랍게도 이 프로젝트 라이브러리에 guava-21.0이 추가되어 있었다. List lists = Li..
Java try-with-resources FileOutputStream을 쓸 일이 생겼다. 다른 분이 만들어 놓은 유틸 클래스가 있어서 가져다 쓰려고 봤는데, 언뜻 보니 close()가 없었다. 우선 내가 알던 고전적인 코드는 다음과 같이 작성한다. FileOutputStream fos = null; try { fos = new FileOutputStream(file); fos.write(mFile.getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } }자원을 사용했으면 반드시 close()를 호출한다고 배웠다. ..