springboot 56

[SpringBoot] 컴파일 후 data.sql 오류가 발생할 경우

개요 ddl-auto를 create-drop으로 설정했기 때문에 resources 폴더 하위에 data.sql 파일을 생성하여 초기 데이터 값을 넣도록 설정했습니다. 위와 같이 설정했을 때 SpringBoot 2.4.X 버전에서는 정상적으로 작동했지만 2.5.0 버전 이상부터는 오류가 발생하여 찾아보니 application.properties 혹은 application.yml에 추가적인 설정이 필요했습니다. 문제 원인 SpringBoot 2.5.0 버전부터는 hibernate 초기화 과정보다 data.sql이 먼저 실행되어 문제가 발생했습니다. 해결 방법 application.yml 혹은 application.properties에 아래 내용 추가하면 됩니다. spring.jpa.defer-datasour..

[DEV] 기록 2022.05.02

[SXSSFWorkbook] 엑셀 드롭다운 셀 생성하는 방법

개요 기존에 Excel 생성 및 다운로드 관련 게시글을 여럿 공유했었습니다. https://jaimemin.tistory.com/2069 [SpringBoot] 대용량 엑셀 파일 생성 및 다운로드 삽질기 개요 작년에 이어 올해도 엑셀 파일 생성 및 다운로드 기능을 담당하게 되었습니다. https://jaimemin.tistory.com/1889 [SpringBoot] 대용량 엑셀 다운로드를 위한 SXSSFWorkbook 개요 기존에 Excel 생성 및 다운.. jaimemin.tistory.com https://jaimemin.tistory.com/1889 [SpringBoot] 대용량 엑셀 다운로드를 위한 SXSSFWorkbook 개요 기존에 Excel 생성 및 다운로드 기능을 구현하는 코드를 공유했었..

[DEV] 기록 2022.04.20

[SpringBoot + MyBatis] TypeHandler 통해 JSON List varchar로 저장

개요 api 응답으로 json list가 오는데 이를 MariaDB varchar형 칼럼에 저장하려고 하니 원하는 대로 안됐습니다. 열심히 검색한 결과 이를 위해서는 커스텀 TypeHandler를 정의해야했고 TypeHandler를 적절히 구현하면 JSON 형태의 문자열을 그대로 DB에 저장하고 조회할 수 있었습니다. 저는 keichee님 블로그를 보고 위 문제를 해결할 수 있었으며 하기 내용도 keichee님이 작성하신 내용과 거의 동일하므로 해당 블로그를 방문하시는 것을 추천드립니다! 1. DTO 구조 DTO 구조를 보면 ExampleWrapper 클래스가 ExampleJson 배열을 필드로 두고 있고 여기서 ExampleJson 클래스가 json 형태로 DB에 저장될 정보입니다. 2. TypeHan..

[DEV] 기록 2022.04.13

[SpringBoot] 여러 파일을 .zip 파일로 압축해서 다운로드

개요 UI 기획서 요구사항 중 하나가 서버에서 NAS에 저장된 tar.gz 파일과 서버에서 생성한 json 파일을 zip 파일로 압축해서 다운로드하는 기능이었습니다. 따라서 제가 구현한 기능이 정상적으로 작동하는지 확인하기 위해 tar.gz 파일 생성하는 코드, json 파일을 생성하는 코드, 그리고 이 둘을 압축하여 클라이언트로 내려주는 Controller를 구현해봤습니다. 소스 코드 tar.gz 생성하는 샘플 코드 json 파일을 생성하는 샘플 코드 이 둘을 압축하는 컨트롤러 클라이언트 측 다운로드하는 함수 참고 https://simplesolution.dev/spring-boot-download-multiple-files-as-zip-file/ Spring Boot Download Multiple ..

[DEV] 기록 2022.04.12

[SpringBoot + JPA] @NamedEntityGraph

개요 현재 프로젝트 내 JPA 글로벌 Fetch 타입은 Lazy이지만 특정 페이지에서는 연관관계가 있는 객체들을 모두 불러와야 하는 경우가 있어 Lazy Loading으로 N번 쿼리를 호출하는 것보다 한 번에 가져오는 것이 성능이 좋을 것이라고 판단했습니다. 찾아본 결과 @NamedEntityGraph 어노테이션을 사용하면 특정 JPA 쿼리에 대해 커스텀 Fetch 타입을 정의할 수 있다는 것을 알았고 저는 위 문제를 해당 어노테이션을 통해 해결했습니다. 예제 Example.class Example.class와 연관된 엔티티가 3개 있다고 가정 @OneToMany, @ManyToMany 연관관계는 디폴트 Fetch 타입이 Lazy 특정 페이지에서는 해당 엔티티들의 정보가 모두 필요하므로 Lazy Load..

[DEV] 기록 2022.04.10

[SpringBoot] 구글 SMTP 통해 메일 보내기

개요 회원 가입 이후 이메일 인증을 한 사용자에게만 서비스 접근을 할 수 있도록 구현하고 싶어 찾아본 결과 구글에서 제공하는 SMTP 서비스를 통해 비교적 쉽게 구현할 수 있었습니다. 단, 구글 SMTP 서비스는 한 이메일 당 하루 100건씩 제한을 걸기 때문에 로컬에서 여러 번 테스트하고 싶을 때는 실제 메일을 보내지 않고 콘솔에 메일 내용을 로그로 작성하는 것을 추천드립니다. 이번 게시글에서는 구글 SMTP 설정과 메일 보내는 방법 그리고 콘솔에 메일 내용을 로그로 작성하는 방법을 간단히 공유해보겠습니다. 1. 구글 계정 앱 비밀번호 설정 및 application.properties 설정 구글 SMTP를 사용하기 위해서는 구글 계정 내 앱 비밀번호를 설정해야 합니다. https://support.go..

Spring 2022.04.10

[SpringBoot] 컨트롤러에서 RequestParam으로 Date 타입 받는 방법

개요 ajax를 통해 Date 타입을 RequestParam으로 보내는데 아래와 같이 400 에러가 발생했습니다. HTTP Status 400: The request sent by the client was syntactically incorrect. 코드 html Controller 해결 방법 아래와 같이 @DateTimeFormat 어노테이션을 추가하면 해결되는 문제입니다. 참고 https://stackoverflow.com/questions/15164864/how-to-accept-date-params-in-a-get-request-to-spring-mvc-controller How to accept Date params in a GET request to Spring MVC Controller? ..

[DEV] 기록 2022.04.04

[SpringBoot] 로그인된 사용자가 접근할 수 있는 기능 Test 작성하는 방법

개요 로그인된 사용자를 대상으로 하는 Controller 테스트를 작성할 때 저는 @BeforeEach 어노테이션을 통해 form 로그인을 먼저 진행하고 @WithUserDetails의 setUpBefore를 TEST_EXECUTION으로 설정하여 @BeforeEach 어노테이션이 호출된 뒤 테스트를 진행하도록 구현했습니다. 하지만, 테스트는 제가 원했던 순서와 달리 @WithUserDetails 어노테이션이 붙어있는 테스트가 @BeforeEach가 먼저 실행되어 에러가 발생했습니다. 찾아본 결과 이는 JUnit5 Spring Security 버그이며 현재 2022.04.02 기준으로도 아직 해결이 되지 않은 상태입니다. 따라서, 저는 커스텀 어노테이션과 @WithSecurityContext 어노테이션 ..

Spring 2022.04.02

[SpringBoot] OpenSessionInView

개요 JPA를 사용하는 서비스를 개발하는 도중 Controller에서 데이터를 변경했는데도 불구하고 DB에 변경이 되지 않는 문제가 발생했습니다. 검색해보니 이는 Transactional 범위 밖에서 데이터를 변경했기 때문에 발생했던 문제이고 자세한 내용을 알기 위해서는 OpenSessionInView(OSIV) 동작 원리를 알아야 한다고 해서 간단히 정리해보겠습니다. (OSIV는 hibernate에서 사용하는 용어이고 사실 JPA에서는 OpenEntityManagerInView(OEIV)라고 지칭합니다.) 내용을 잘 정리해주신 Shi._.D TIL님께 감사드립니다. * 해당 글은 JPA 영속성 컨텍스트에 대해 안다는 전제 하에 작성했습니다. https://jaimemin.tistory.com/1898 ..

Spring 2022.03.29