springboot 52

[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

[SpringBoot] 대용량 엑셀 파일 생성 및 다운로드 삽질기

개요 작년에 이어 올해도 엑셀 파일 생성 및 다운로드 기능을 담당하게 되었습니다. https://jaimemin.tistory.com/1889 [SpringBoot] 대용량 엑셀 다운로드를 위한 SXSSFWorkbook 개요 기존에 Excel 생성 및 다운로드 기능을 구현하는 코드를 공유했었습니다. https://jaimemin.tistory.com/1768 [SpringBoot] Excel 생성 및 다운로드 개요 ElasticSearch로 조회한 목록들을 엑셀로 다운로드할.. jaimemin.tistory.com 한 가지 달라진 점은 기존 프로젝트와 달리 이번에는 OOM을 방지하기 위해 파일 업로드 및 생성을 별도 인스턴스에서 진행한다는 점입니다. 기존에는 모두 한 서버 내에서 진행했기 때문에 API에..

[DEV] 기록 2022.03.13

[SpringBoot] LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

개요 암호화 모듈 버전업을 위해 배포를 하는데 아래와 같은 런타임 에러가 발생했습니다. java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from jar:file:~/slf4j-log4j12-1.7.7jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages ..

[DEV] 기록 2022.01.25

[SpringBoot] AOP 간단 정리

개요 AOP(Aspect-Oriented Programming)은 IOC(Inversion Of Control), DI(Dependency Injection)와 함께 스프링 프레임워크의 핵심 요소로 거론됩니다. 이번 게시글에서는 AOP에 대해 간단히 알아보겠습니다. 본문을 읽기에 앞서 아래 게시글을 먼저 훑어보시는 것을 추천드립니다. https://jaimemin.tistory.com/2025 [디자인 패턴] JDK 동적 프록시와 CGLIB 개요 기존에 정리한 프록시 패턴(https://jaimemin.tistory.com/2016)을 통해 기존 코드를 변경하지 않고 부가적인 기능을 추가할 수 있는 장점이 있었지만 비슷한 구조를 갖는 프록시 클래스를 계속 생성 jaimemin.tistory.com htt..

Spring 2022.01.12