Programming/Spring Boot 100

OSIV(Open Session In View) 개념 정리 및 예시

OSIV(Open Session In View) 개념 정리 및 예시 spring.jpa.open-in-view=false application.properties(또는 yml) 파일의 내용을 항상 복사 붙여 넣기 식으로 사용하고, 또 동작에 문제가 없었기 때문에 'spring.jpa.open-in-view' 옵션이 어떤 역할을 하는지 모르는 상태로 계속 사용해 왔었는데요. 최근 프로젝트에서 해당 옵션 값으로 인해 문제가 발생하면서 'OSIV(Open Session In View)'가 무엇인지 찾아보고 정리하게 되었습니다. OSIV란? 먼저 JPA의 EntityManager가 Hibernate에서는 Session이라고 불리는데요. OSIV의 Session은 이 세션을 의미합니다. 때문에 사실 JPA에서는 ..

spring boot email 전송 (spring-boot-starter-mail, mailjet)

Spring Boot Email 전송하기 (+ Mailjet) 해당 포스팅은 스프링 부트에서 'spring-boot-starter-mail' 의존성을 사용하여 이메일을 전송하는 코드 예시입니다. 전체 코드는 포스팅 맨 하단에 github 주소를 링크해 두었으니 참고해 주시면 좋을 것 같습니다. (아래 이메일 발송 코드는 spring boot 3.1.4 환경에서 작업되었습니다.) SMTP SMTP는 'Simple Mail Transfer Protocol'의 약자로 인터넷을 통해 이메일을 보내고 받는 데 사용되는 통신 프로토콜인데요. SMTP 서버는 SMTP 프로토콜(Simple Mail Transfer Protocol)을 사용하여 메일을 보내는 메일 서버의 구성 요소를 말하며, 이메일 발신 작업에만 사용되..

(Spring Boot) Filter를 통한 Request, Response Logging

Filter를 통한 Request, Response Logging 방식과 발생했던 문제 개발을 하다 보면 요청된 Request에 대한 로깅이 필요한 경우가 생기는데요. 해당 포스팅은 'Filter를 통해 Request, Response에 대한 로깅을 남기는 방법과 그 과정에서 발생했던 문제점'에 대해 기록한 내용입니다. *** Logging의 경우 Filter가 아닌 인터셉터(Interceptor) 또는 AOP(Aspect Oriented Programming)로도 처리가 가능한데요. 각각의 방식에 대한 용도와 장단점이 있겠지만, 여기서는 필터 체이닝 과정에서 ServletRequest, ServletResponse 객체에 대한 조작이 가능하다는 점과 스프링 영역 밖(Dispatcher Servlet 전..

JPA save, saveAll 성능 차이가 발생하는 이유

JPA save(), saveAll() 성능 차이가 발생하는 이유(Feat. @Transactional) Spring Data Jpa에서 데이터를 insert 할 때 'save()' 메서드 또는 'saveAll()' 메서드를 사용할 수 있는데요. 구현된 코드를 살펴보면 saveAll() 메서드는 내부적으로 save() 메서드를 반복하는 구조로 되어 있습니다. 그러면 단순하게 생각해서 여러 건의 데이터를 반복문을 통해 각각 save() 하는 것과 한 번에 saveAll() 하는 것에는 차이가 없을 것 같은데요. 결론을 먼저 말씀드리면, 여러 건의 데이터를 insert 할 때는 saveAll() 메서드를 사용하는 것이 성능상 더 좋으며, 해당 포스팅은 'saveAll()을 사용하였을 때 성능 차이가 발생하는..

spring boot 로그 파일 남기는 방법 (logback-spring.xml 설정)

스프링 부트 logback-spring.xml 파일을 통한 로깅 설정 해당 포스팅은 '스프링 부트 환경에서 로그를 콘솔 또는 파일 등으로 기록하는 방법'에 대해 정리한 내용입니다. .properties(또는 .yml) 파일을 통해서도 로깅 관련 설정을 할 수 있지만 logback-spring.xml 파일을 통해 조금 더 세부적인 설정을 할 수 있기 때문에 logback-spring.xml에 대해 더 중점을 두고 정리되었다는 점 참고 부탁드립니다. (작업 환경은 'org.springframework.boot' version '3.1.2'에서 진행되었습니다.) 로그와 로깅이란? '로그(Log)'의 사전적 의미는 시스템에서 발생되는 모든 행위와 이벤트 정보를 시간에 따라 남겨둔 데이터를 뜻하며, '로깅(Log..

(spring boot) XSS 공격 개념과 대응 방법 정리

XSS 공격이란 무엇인지, Spring Boot에서 대응할 수 있는 방법은 해당 포스팅은 'xss(cross-site scripting) 공격의 개념과 해당 공격에 대해 spring boot 내부적으로 처리할 수 있는 대응 방법'을 정리한 내용입니다. 예전에 면접에서 스프링 부트에서 처리할 수 있는 보안 문제에 대해 아는 것이 있냐고 질문을 받았던 적이 있는데요. 당시에는 생각나는 것이 없어 대답을 하지 못했었는데 xss 공격도 처리해야 할 보안 문제 중 하나로 볼 수 있습니다. XSS(Cross-site Scripting) 공격이란? SQL Injection과 함께 웹 상에서의 취약점을 공격하는 기본적인 방법 중 하나인데요. 쉽게 공격자가 서버로 전달하는 데이터에 악의적인 스크립트 문을 삽입하여 개발자..

(spring boot) Redis Key Event Notification 처리 방법

스프링 부트 Redis Key Event Notification 처리 방법 'redis keyspace notification'은 redis 2.8.0부터 지원된 기능인데요. 해당 포스팅은 스프링 부트에서 redis key expired event를 수신하는 방법에 대해 정리한 내용입니다. 우선 redis.conf 설정 파일을 살펴보면 notify-keyspace-events 옵션을 통해 redis에서 발생하는 이벤트에 대한 알림 설정을 할 수 있는데요. redis 이벤트 알림 기능의 경우 성능적 오버헤드가 발생할 수 있기 때문에 기본적으로 사용되지 않으며, 사용하지 않을 때 다음과 같이 ""으로 설정되어 있습니다. 기본적으로 K 또는 E 중 하나를 설정해야 알림이 발송되며, 해당 부분에 대해 조금 더 ..

@AutoConfiguration을 사용하여 라이브러리 만들어보기

자동 구성 @AutoConfiguration을 사용한 라이브러리 만들어보기 spring boot에서는 AutoConfiguration 기능을 통해 web, data, aop, cache, jdbc 등 여러 라이브러리에 대한 자동 구성을 제공하는데요. 아래 내용은 '@AutoConfiguration을 적용하여 자동 구성이 실행되는 방식을 활용한 라이브러리를 만드는 방법과 만들어진 라이브러리를 사용하는 방법'에 대한 내용입니다. (예시에서는 gradle build tool을 사용하였습니다.) * 추가로 spring boot 자동 구성 auto configuration이 동작하는 원리가 궁금하시다면 포스팅 맨 하단에 관련 자료에 대한 링크가 있으니 참고하시면 좋을 것 같습니다. build.gradle plug..

Spring Boot 자동 구성 AutoConfiguration 동작 원리 파헤치기

Spring Boot 자동 구성 AutoConfiguration 동작하는 원리 파헤치기 Spring Boot AutoConfiguration 자동 환경 설정(AutoConfiguration)은 Spring Boot의 가장 대표적인 기능이라고 할 수 있는데요. 스프링 부트는 spring-boot-project의 하위 모듈인 'spring-boot-autoconfigure'라는 프로젝트를 통해 web, aop, jdbc, jpa, redis 등, 수많은 자동 환경 설정(자동 구성)을 제공합니다. (spring-boot-starter 안에 spring-boot-autoconfigure가 포함되어 있습니다.) 개발자의 입장에서는 사용할 라이브러리의 의존성만 추가하게 되면 autoconfigure를 통해서 해당 ..

@Conditional 어노테이션의 기능과 확장(@ConditionalOnXxx)

@Conditional 어노테이션의 기능과 확장 '@Conditional' 어노테이션은 Spring 4.0(released on 2013)부터 제공되기 시작했는데요. @Configuration, @Component, @Bean 어노테이션과 함께 사용되며, 이름 그대로 특정 조건을 만족하는지를 구별하는 기능입니다. 직접 사용할 일이 많을 것 같지는 않았지만 spring boot 자동 구성에 중요한 역할을 하는 당, 흥미 있는 기능이라고 생각되어 정리해 보았습니다. 아래 내용에서는 @Conditional 어노테이션을 직접 구현 및 적용하여 조건에 따라 동작하는지 여부를 살펴보고, 스프링 부트에서 확장된 @ConditionalOnXxx 어노테이션 기능을 통해 자동 구성이 실행되는 부분에 대해 간단하게 살펴보겠..