SpringBoot 2.x 버전 프로젝트 생성 방법

Intro 새로운 프로젝트 요청이 왔는데, Java 11 을 사용해 스프링부트로 프로젝트를 만들어야 하는 요구사항이 명시되었다. 그런데 스프링부트 3버전대의 등장 이후 2.x 버전으로 프로젝트를 생성한 적이 한번도 없었어서 이제야 알았는데 Spring Initializr 에서 스프링 부트 2.x 버전이 모두 제거되었다. 스프링 3.0 부터는 최소 JDK 요구 사항이 17이기 때문에 Spring Initialzr 에서는 이제 더이상 17 아래의 자바 버전들도 취급을 안해준다. 자바 버전은 17, 21만 선택 가능하다. 스프링부트는 2버전 선택이 불가능하다 당연하겠지만 start.spring.io 에 들어가서 생성하려 해도 마찬가지다. https://start.spring.io/ 이정도에서 끝나는게 아니고 ..

Programming/JPA ⁄ Spring 2024.01.08
Postgres의 배열컬럼을 JPA(Hibernate)에서 사용하는방법

Intro Postgresql 에서는 특이하게도 배열 타입을 사용할 수 있다. 개인적으로는 이걸 선호하지는 않는데, 일반적인 다른 데이터베이스와 다른 형태의 쿼리작성이 필요하고 좀 더 복잡해지기 때문이다. 만약에 DB 마이그레이션이라도 해야 한다면 참 골치아프겠다. 특히 이런경우 ORM과의 호환성이 큰 문제가 될 수 있다. 업무에서 JPA를 주로 사용하고 있는데, 예상했던대로 자체적으로는 Postgres의 배열타입을 지원해주지 않았다. 대신 UserType을 구현하여 새로운 타입을 정의할 수 있긴 했는데 그 방법으로 문제를 해결해보려 한다. 준비 작업 시연을 위해 샘플 프로젝트 및 샘플 데이터베이스를 준비하였으나, 이미 진행중인 프로젝트와 DB가 있다면 건너뛰어 코드 및 엔티티 부분만 참고해서 문제를 해..

Programming/JPA ⁄ Spring 2023.11.02
[스프링 부트] 외부 설정값으로 간단하게 복잡한 커스텀 빈 주입 받기

intro 웹 프로젝트를 진행하다보면 외부 설정값을 어플리케이션 내에서 활용할 일이 많다. 하드코딩을 해두면 후에 변경하기 쉽지 않기 때문에 외부에 설정값으로 빼는게 좋은데, 설정값이 한두개 일 때야 크게 어렵지 않지만 설정값이 점점 늘어나고 심지어 계층형 구조를 가진다면 점점 복잡해진다. 스프링에서는 편리하게 여러가지 설정값을 관리하기 위한 방법을 제공하는데 그 중 @ConfigurationProperties는 특히 프로퍼티의 값을 Bean으로 매핑하는 강력하고 직관적인 기능을 제공한다. 본 글에서는 @ConfigurationProperties의 기본 사용법과 주요 특징 및 주의할 점에 대해 다루어보려고 한다. main 프로젝트 생성 스프링부트 3.x 버전으로 먼저 생성하고 추후 2.x 버전으로 낮추며..

Programming/JPA ⁄ Spring 2023.10.05
스프링부트 프로젝트에서의 엑셀 및 압축파일에 대한 스트리밍

Intro 엑셀파일이나 zip 압축파일을 서버에서 생성해 다운로드를 제공할 때, 최초 응답시간에 대한 고려가 필요하다. 물론 미리 준비되어 있는 파일이라면 브라우저에 바로 응답을 보낼 수 있겠지만 DB에서 데이터를 조회하고, 이를 바탕으로 엑셀 파일을 생성하는 경우 사용자에게 여러 개의 파일을 압축된 형태로 제공하는 경우 이러한 상황에서는 파일을 준비하는 데 시간이 상당히 소요될 수 있다. 데이터의 크기에 따라 응답시간이 크게 달라지기 때문에 예상되는 응답 시간을 구체적으로 제공하기도 어려운 상황에서, 화면에 스피너만 딸랑 띄워놓는 것 만으로는 어지간한 사용자들의 인내심을 달래기 쉽지 않다. 서버에서 아무리 바쁘게 준비하고 있다고 뜨거운 열을 뿜어내며 소리쳐도 사용자는 서버가 멈춘 것으로 오해할 수 있다..

Programming/JPA ⁄ Spring 2023.09.14
[Spring] /actuator 엔드포인트에 인터셉터 적용 문제

Intro 사이드 프로젝트에 actuator 를 적용해보았다. 그런데 /actuator 경로를 그냥 오픈하고 싶지는 않았는데, 마침 기존에 관리자 페이지 접근 권한 부여를 위해 사용하던 인터셉터가 하나 있어서, actuator 엔드포인트에 등록 해 두고 그대로 사용하면 되겠다 싶었다. 아래 코드는 기존의 인터셉터 등록에 관련된 코드. @SpringBootApplication(exclude = [UserDetailsServiceAutoConfiguration::class]) @EnableJpaAuditing @EnableScheduling class DutyparkApplication( private val authService: AuthService, private val jwtConfig: JwtCon..

Programming/JPA ⁄ Spring 2023.05.15