[DEV] 기록 170

[PostgreSQL] 월별로 DB 파티셔닝 예제

개요 제가 담당하고 있는 파트에서 매일 몇 만 건씩 데이터가 쌓이는 DB가 있었습니다. DB에 너무 많은 데이터들이 쌓일 경우 조회 성능이 떨어질 수 있으므로 월별 DB 파티셔닝을 진행했고 진행할 때 관련 내용이 별로 없어 삽질을 많이 했었습니다. 따라서 저는 여러분들이 저같이 삽질을 하는 일이 없도록 이번 게시글에서 DB 파티셔닝 샘플 예제를 공유해보겠습니다. * DB 파티셔닝을 진행하더라도 기존에 작성한 CRUD 쿼리를 수정할 필요가 없습니다! 전체척인 프로세스 이미 존재하는 DB를 파티셔닝 하기 위해서는 아래의 프로세스를 거쳐야 합니다. 기존 DB명 변경 기존 DB 내 primary key, foreign key와 같은 제약조건 해제 기존 DB와 동일한 조건의 새로운 DB를 기존 DB명과 동일하게 ..

[DEV] 기록 2021.09.10

[WEB] LocalStorage, SessionStorage

개요 현재 이력을 테이블 형태로 제공하고 있는데 칼럼을 추가하되 디폴트로는 숨김 처리하고 원할 때만 노출시키는 기능을 구현해달라는 요청사항이 들어왔습니다. 그래서 저는 model로 뿌려줄 때 숨김 칼럼 내용까지 다 뿌려주고 아래 그림처럼 팝업을 만들어 클라이언트가 노출시킬 칼럼과 숨김 처리할 칼럼을 지정하도록 설계를 했습니다. 클라이언트마다 노출시키고 싶은 칼럼이 다를 것이므로 처음에는 쿠키를 사용하여 각 클라이언트마다 노출시키고 싶은 칼럼들, 숨기고 싶은 칼럼들을 JsonArray 형태로 저장하려고 했습니다. 하지만, 생각해보니 굳이 이 내용을 HTTP Header에 넣어 서버까지 보낼 필요가 없을 것 같아 브라우저 내에서만 저장하는 값을 찾는 도중 LocalStorage와 SessionStorage에..

[DEV] 기록 2021.08.19

[Git] git repository들을 하나의 repository로 합치는 방법

개요 최근 공부 차원에서 생성한 프로젝트들이 많아 github 내 레포지토리들이 너무 많아지는 문제점이 생겼습니다. 그래서 정리를 하고자 비슷한 성격을 띠는 프로젝트들을 합쳐 하나의 레포지토리로 만들어봤습니다. 합치는 방법 1. 여러 프로젝트들을 subtree로 가질 새 레포지토리를 생성해줍니다. 2. 빈 프로젝트인 상태에서 subtree를 할 경우 에러가 발생할 수 있으므로 README.md 파일 정도는 생성해줍니다. 3. 이제 기존 프로젝트를 아래의 subtree 명령어를 통해 해당 레포지토리의 하위 폴더로 옮겨줍니다. git subtree add --prefix=[하위로 둘 폴더명] [기존 프로젝트 git 주소] [현재 레포지토리의 git branch] 4. 합칠 레포지토리들에 대해 3번의 과정을 ..

[DEV] 기록 2021.08.18

[H2] Database not found, either pre-create it or allow remote database creation

개요 JPA 실습을 하려고 하는데 H2 버전이 꼬이면서 아래와 같은 오류 메시지가 떴습니다. Database not found, either pre-create it or allow remote database creation (not recommended in secure environments) * 정상적인 경우라면 DB가 생성되지 않았더라도 Generic H2 (Embedded) 설정에서 연결 버튼을 누르면 JDBC URL 경로 내 새 DB가 생성되어야 합니다. * Generic H2 (Server) 설정에서 없는 DB를 연결하려고 하면 위와 같은 오류가 나는 것이 당연합니다! 해결 방법 아래와 같은 절차를 거치면 해결이 됩니다. 데이터베이스 파일이 망가진 것이므로 JDBC URL 파일 경로로 가서..

[DEV] 기록 2021.08.16

[SpringBoot] 대용량 엑셀 다운로드를 위한 SXSSFWorkbook

개요 기존에 Excel 생성 및 다운로드 기능을 구현하는 코드를 공유했었습니다. https://jaimemin.tistory.com/1768 [SpringBoot] Excel 생성 및 다운로드 개요 ElasticSearch로 조회한 목록들을 엑셀로 다운로드할 수 있는 기능을 추가해달라는 요청이 들어와 구현을 해봤습니다. 구현 코드 ExcelController.java ExampleService.java ExcelView.java * 주석으로도 작.. jaimemin.tistory.com https://jaimemin.tistory.com/2069 [SpringBoot] 대용량 엑셀 파일 생성 및 다운로드 삽질기 개요 작년에 이어 올해도 엑셀 파일 생성 및 다운로드 기능을 담당하게 되었습니다. https:..

[DEV] 기록 2021.08.05

[SpringBoot] HV000232: No JSR 223 script engine found for language "javascript"

개요 Bean Validation 내 ObjectError을 적용하기 위해 @ScriptAssert 어노테이션을 적용했더니 아래와 같은 에러가 발생했습니다. HV000232: No JSR 223 script engine found for language "javascript" 원인 해당 에러의 원인은 자바 버전이 달라서 발생하는 문제였습니다. @ScriptAssert 어노테이션의 경우 Java 11에 최적화되어있는 듯 합니다. 실제로 JDK를 11로 적용하고 프로젝트를 빌드하면 아래와 같은 메시지를 볼 수 있습니다. Warning: Nashorn engine is planned to be removed from a future JDK release 해결방법 따라서, 결국 JDK를 11로 적용하고 프로젝트..

[DEV] 기록 2021.07.24

[SpringBoot] Excel 생성 및 다운로드

개요 ElasticSearch로 조회한 목록들을 엑셀로 다운로드할 수 있는 기능을 추가해달라는 요청이 들어와 구현을 해봤습니다. 2021.08.08 해당 코드는 OOM 예외를 야기할 수 있으므로 보다 나은 코드는 아래 게시글을 참고해주세요. https://jaimemin.tistory.com/1889 [SpringBoot] 대용량 엑셀 다운로드를 위한 SXSSFWorkbook 개요 기존에 Excel 생성 및 다운로드 기능을 구현하는 코드를 공유했었습니다. https://jaimemin.tistory.com/1768 [SpringBoot] Excel 생성 및 다운로드 개요 ElasticSearch로 조회한 목록들을 엑셀로 다운로드할.. jaimemin.tistory.com 구현 코드 ExcelControl..

[DEV] 기록 2021.05.17

티스토리 블로그 내 gist css 수정하는 방법

개요 코드를 가독성 좋게 포스팅하기 위해 gist를 사용하고 있는데, 코드가 사이드로 길어지면 블로그 사이드바를 침범하는 경우가 발생했습니다. 따라서, 임베디드된 gist의 css를 수정할 필요성을 느꼈기에 관련 내용을 포스팅합니다. 해결방법 적용할 css는 아래와 같습니다. .gist { max-width: [원하는 px]; overflow:auto; } .gist .blob-wrapper.data { max-height: [원하는 px]; overflow:auto; } 사실 코드가 길어짐에 따라 gist가 길어지는 것은 크게 상관없기 때문에 .gist 클래스에 대한 css만 적용해도 무방합니다. 저 같은 경우 max-width를 700px로 잡으니 얼추 블로그와 맞게 설정할 수 있었습니다. * 반응형..

[DEV] 기록 2021.04.25

[SpringBoot] 세션이 만료될 때 세션 값 가져오는 방법

개요 유저가 로그아웃할 때 시간을 DB에 저장하기 위해 세션이 만료되기 직전 세션 내 attribute를 가져와 어느 유저인지 확인하고 해당 유저의 로그아웃 시간을 업데이트해야 했습니다. 해결방법 처음에는 ApplicationListener를 상속받은 후 LogoutSuccessEvent가 발생했을 때 유저 정보를 가져와 업데이트하는 방식으로 접근했는데, 해당 이벤트는 유저가 직접 로그아웃 버튼을 눌러야만 발생하는 문제점이 있었습니다. 저는 세션이 만료됨에 따라 로그아웃 되는 유저의 로그아웃 시간도 기록하고 싶었기 때문에 HttpSessionListener를 상속받은 뒤 sessionDestroyed 메서드를 오버라이드 하여 문제를 해결했습니다. LogoutSuccessEvent가 발생했을 때 호출되는 ..

[DEV] 기록 2021.04.24