springboot 56

[Springboot] 멀티 데이터소스 (MyBatis, JPA)

개요 최근 회사 업무를 하며 멀티 테넌시 아키텍처를 적용한 서비스를 개발했습니다. 요구사항은 아래와 같았습니다. 사용자 로그인 정보를 토대로 해당 tenant에 매핑된 데이터베이스와 연동 런타임에 테넌트 추가 가능 즉, 재기동 없이 동적으로 사용자와 사용자가 매핑된 데이터소스를 추가 가능 테넌트를 추가할 때 데이터베이스 및 테이블 자동 생성 클라우드 시장이 성장함에 따라 멀티 테넌시를 지원하는 XaaS가 늘어날 것으로 판단되기 때문에 해당 내용을 다루고 싶었고 생각보다 코드 레벨까지 설명해 주는 글이 별로 없었기 때문에 개인적으로 정리해 보겠습니다. 멀티 테넌시 아키텍처 중 멀티 데이터소스를 집중적으로 다룰 예정이고 기타 예외처리 및 인증/인가 설정은 주제에 벗어나기 때문에 생략하도록 하겠습니다. (구현..

리서치 2023.03.25

[Maven] java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x2fbb01ba) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler)

개요 SpringBoot 프로젝트를 실행하는데 아래와 같은 에러가 발생했습니다. java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x2fbb01ba) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) 원인 pom.xml에 명시된 Java 버전과 lombok 버전 호환성이 맞지 않아 발생하는 문제였습니다. 해결 방법 저 같은 경우 Java 11 버전을 사용하고 있었고 lombok은 별도 version 명시 없이 사용하고 있었는데 Java 11과 호환성이 맞는 버전인..

[DEV] 기록 2023.01.27

[SpringBoot 2.X.X] No beans of 'AuthenticationManager' type found.

개요 Spring Security를 적용하는데 아래와 같은 메시지와 함께 에러가 발생했습니다. Could not autowire. No beans of 'AuthenticationManager' type found. 원인 release note에 따르면 1점대 버전에서는 별도 처리 없이 SpringBoot에서 제공하는 AuthenticationManager를 주입시킬 수 있었지만 2점대 버전부터는 WebSecurityConfigurerAdapter를 상속받는 클래스에서 authenticationmanagerBean() 메서드를 오버라이드 해야 autowire가 가능했습니다. 자세한 내용은 아래 링크로 첨부합니다. https://github.com/spring-projects/spring-boot/wiki..

[DEV] 기록 2022.10.20

[tus protocol] 재개 가능한 파일 업로드를 위한 오픈 프로토콜

개요 개발 진행 중인 프로젝트에서 대용량 파일 업로드 기능을 구현해야 하는데 요구사항은 아래와 같았습니다. 대용량 파일을 브라우저에서 서버로 한 번에 업로드할 경우 OOM(Out of Memory Exception)이 발생할 수 있으므로 파일을 청크 단위로 끊어서 업로드할 수 있어야 함 업로드하는 도중 네트워크 오류 혹은 휴먼 에러로 인해 업로드 요청이 끊기더라도 재요청 시 이어서 업로드할 수 있어야 함 (Resumable) 찾아본 결과 위에서 언급한 두 가지 요구사항을 충족하는 라이브러리가 있었고(tus-js-client, tus-java-client) 이 둘은 모두 tus protocol을 기반으로 구현이 되어 있었습니다. 따라서, 저는 이번 프로젝트에서 해당 라이브러리들을 적용하기로 했고 이번 게시..

리서치 2022.10.06

[SpringBoot + Fastexcel] 대용량 엑셀 생성 및 다운로드

개요 여태까지 엑셀 생성 및 다운로드 기능을 구현할 때 Apache Poi 라이브러리를 사용했었고 이와 관련하여 게시글을 여러 번 남겼습니다. https://jaimemin.tistory.com/2069 [SpringBoot] 대용량 엑셀 파일 생성 및 다운로드 삽질기 개요 작년에 이어 올해도 엑셀 파일 생성 및 다운로드 기능을 담당하게 되었습니다. https://jaimemin.tistory.com/1889 [SpringBoot] 대용량 엑셀 다운로드를 위한 SXSSFWorkbook 개요 기존에 Excel 생성 및 다운.. jaimemin.tistory.com Apache Poi 라이브러리가 보편적으로 사용됨에 따라 레퍼런스도 많고 주기적인 버전업이 이루어졌기 때문에 지금까지 해당 라이브러리를 사용해왔..

리서치 2022.09.14

[SpringBoot] Prometheus, Grafana 연동하는 방법

개요 기존에 엑셀 다운로드 기능을 Apache POI 라이브러리를 통해 구현했는데 메모리도 많이 먹는 것 같고 non streaming 방식이라 streaming 방식인 fastexcel 라이브러리로 변경하려고 합니다. 기존 코드를 대체하기 위해서는 합리적인 이유가 필요한데 이를 위해 모니터링 툴을 연동하여 각각의 라이브러리를 적용했을 때 CPU 사용량, JVM Heap 메모리, 그리고 실행 속도를 비교해봤습니다. 처음에는 Spring Admin UI를 사용하려고 했지만 실무에서 Prometheous와 Grafana가 많이 쓰인다고 해서 프로메테우스와 그라파나를 연동해봤고 연동하는 방법에 대해 간단히 정리하고자 합니다. 다행히 잘 정리된 글들이 있어 해당 글들을 참고했습니다. https://devbksh..

[DEV] 기록 2022.09.01

[SpringBoot] Failed to start bean documentationPluginsBootstrapper

개요 SpringBoot에 actuator를 연동한 뒤 실행하였더니 아래와 같은 오류 메시지가 발생했습니다. org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null 원인 SpringFox 측에서 업데이트를 진행하지 않아 Spring..

[DEV] 기록 2022.08.31

[SpringBoot] Prometheus 연동시 "INVALID" is not a valid start token

개요 Spring Security가 적용된 프로젝트에서 actuator를 적용하고 프로메테우스와 연동했을 때 아래와 같은 오류 메시지와 함께 State가 DOWN인 것을 확인했습니다. "INVALID" is not a valid start token 원인 Spring Security가 적용되어 endpoint를 접근할 수 없어 발생하는 문제였습니다. 해결 방법 actuator가 endpoint에 접근할 수 있도록 actuator 관련 url에 대해서는 Spring Security가 적용되지 않도록 처리해주면 해결이 됩니다. @Override public void configure(WebSecurity web) throws Exception { web.ignoring() .antMatchers("/actu..

[DEV] 기록 2022.08.31

[Maven + Tomcat] 메이븐 빌드 후 톰캣에 war 배포하는 방법

개요 개발한 프로젝트를 dev 환경에서 테스트해보기 위해 EPC에 배포를 진행해야 했습니다. 이에 따라 Maven 빌드를 진행하여 war 파일을 생성하고 EPC 톰캣 내 ROOT.war 파일과 바꿔치기하여 배포를 진행하였고 해당 과정을 간단하게 공유해보겠습니다. Maven Wrapper를 통해 war 파일 생성 A. Maven과 Maven Wrapper란? Maven은 Gradle과 같이 build tool 중 하나입니다. Maven Wrapper는 개발자들이 Maven을 별도의 환경에서 개발할 때 local machine에 별도로 설치를 원하지 않거나 Maven의 특정 버전을 통해 빌드하길 원할 때 사용됩니다ㅣ. 즉, Maven Wrapper를 사용할 경우 특정 버전 혹은 개발 환경에 의존하지 않고 독..

[DEV] 기록 2022.06.02

[QueryDSL] QClass 생성 오류 해결 방법

개요 QueryDSL을 사용하기 위해 maven에 querydsl dependency와 QClass를 생성하는 plugin을 추가한 뒤 build를 진행했는데도 불구하고 아래의 문구와 함께 빌드 오류가 발생했습니다. querydsl dependency com.querydsl querydsl-jpa 4.4.0 com.querydsl querydsl-apt 4.4.0 querydsl plugin com.mysema.maven apt-maven-plugin 1.1.3 process target/generated-sources/java com.querydsl.apt.jpa.JPAAnnotationProcessor com.querydsl querydsl-apt ${querydsl.version} 해결 방법 mav..

[DEV] 기록 2022.05.15