Transaction이란?Spring을 사용하다 보면 자연스럽게 MVC 구조를 접하게 되고, 이 과정에서 데이터 저장소(Model)에 접근하기 위해 JDBC, JPA, Hibernate 등의 기술을 활용하게 됩니다.이러한 기술들을 사용하여 데이터 저장소에 요청할 쿼리를 만들고 실행하기 전까지의 과정을 하나의 작업 단위라고 하는데, 이를 한 단어로 트랜잭션이라고 부릅니다.트랜잭션은 작업 단위 안에서 발생하는 조회, 생성, 수정, 삭제 등의 여러 작업을 하나로 묶어 처리하는데요,예를 들어, 주문이라는 작업은 다음과 같은 단계를 포함하며, 이를 하나의 트랜잭션으로 처리합니다:사용자의 주문 요청상품 재고 감소주문 정보 저장사용자에게 주문 요청 완료 알림 발송이처럼 주문 작업은 여러 단계를 포함하는 하나의 트랜잭..
Spring Framework/spring
안녕하세요, 이번에 알아볼 주제는 Spring의 Filter입니다. Spring에서는 WEB 요청을 위한 다양한 필터가 존재하는데요,이번 시간에는 Spring에서 기본적으로 제공 해 주는 필터 종류와 필터들이 어떻게 호출 되는지, 그리고 필터의 올바른 사용에 대해서 알아보려 합니다.Spring의 필터란?Filter는 Java Servlet API에서 제공하는 기능으로, HTTP 요청/응답에 대한 사전 및 사후 처리를 수행할 수 있는 기능을 제공합니다. 이는 Java 웹 애플리케이션에서 가장 기본적인 필터링 메커니즘입니다. 필터는 다양하게 사용되는데요, 주로 인증 및 권한 검사, 로깅 및 모니터링, 요청/응답 데이터 변환, CORS 설정 등으로 다양하게 사용되고 있습니다. Spring Filter는 Spr..
Event? Spring에서는 특정 동작이나 프로세스가 수행될 때, 특수한 행동을 일으키는 이벤트 라는 개념이 존재합니다. 예를 들면, JPA의 경우 엔티티의 감지를 위해 다음과 같은 리스너 어노테이션을 사용하고 있는 것을 볼 수 있는데요,@Entity@EntityListeners(UserEntityListener.class)public class User { @Id @GeneratedValue private Long id; private String name; // Getters and setters...} 이처럼 Spring 이벤트는 특정 동작이 수행될 때, 비즈니스 로직과 별개의 동작을 수행하는 이벤트를 처리할 수 있는 기능을 제공 해 주고 있는데, 오늘은 이에 대해서 ..
@ComponentScan의 동작 원리Spring 프레임워크에서 @ComponentScan은 지정된 패키지를 스캔하여 Spring 컨테이너에서 관리할 빈(Component)을 자동으로 등록하는 역할을 합니다.이 어노테이션은 주로 @Configuration 클래스와 함께 사용되며, Spring 애플리케이션 초기화 과정에서 매우 중요한 부분을 차지합니다. @ComponentScan은 @SpringBootApplication을 통해서 관리됩니다.@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan( // ..
작성 개요평소 개인적으로 사용하기도 하고 현업에서도 사용하고 있는 Spring을 충분히 이해하고 있는가?라는 생각을 가지고 동작 원리에 대해 다시 한 번 정리하게 되었습니다. 어디까지 분석할 것인가?어디까지 쓸 것인가를 가장 고민하게 되었는데, 본 글을 쓰게 된 목적이 MVC 과정을 어떻게 수행하는지가 목적이기 때문에, 그 과정에서 개별 어노테이션이 어떻게 동작하는지 까지 분석하는 것은 오버스펙일듯 하여 추후 세부적으로 접근 가능하게끔 하는 가이드 문서쯤 어딘가..? 라는 글을 적는게 좋을 것 같았습니다..ㅎㅎ SpringBoot의 시작SpringBoot는 어떻게 시작될까요? SpringBoot는 다음과 같이 다양한 실행 방식을 제공합니다.Intellij 사용 시, [Gradle > bootRun]co..
간단한 Rest Docs 작성 예시 [build.graddle.kt] plugin { id("com.epages.restdocs-api-spec") version "0.17.1" } configure { setServer("http://localhost:9999") title = "Rest API 문서" description = "Rest API 문서" version = "0.1.0" format = "yaml" outputDirectory = "build/docs" outputFileNamePrefix = "rest_docs" } val asciidoctorExtensions: Configuration by configurations.creating dependencies { testImplementa..
Spring Unit Test에서 컨트롤러 테스트와 Rest Docs 결합 시, 빌드 시간이 오래 걸리는 문제점에 대한 해결 방안 작성 현재 개발 상황 각각의 테스트 클래스에서 @WebMvcTest 사용 => 테스트마다 Spring Context를 다시 띄우게 된다. 이 문제점을 해결하기 위해 팩토리 패턴으로 하나의 추상 클래스에서 다음과 같이 작성하여 빌드 시간 단축 현재 구조의 문제점 @MockBean은 @SpyBean과 함께 Mockito가 아닌, Spring-test에서 제공되는 어노테이션이다 @MockBean을 사용하는 테스트 클래스마다 Spring Context가 새로 띄워진다. @MockBean을 사용하는 테스트 클래스가 많아지는만큼 빌드 속도가 느려지게 된다. 컨트롤러 테스트에서 Sprin..
스프링을 공부하다가 우연히 @RequestBody와 @ModelAttribute를 통해 값을 바인딩할 때 오류를 겪는 상황을 발견하고, 평소 Class 바인딩은 자연스럽게 @ModelAttribute로, Json과 같은 타입은 자연스럽게 @RequestBody로 작성했었던, 아무 생각 없이 스프링을 공부했던 나 자신을 돌아보며 오늘 글을 작성하려한다. 이를 이해하기 위해서는 우선 HTTP Message에 대한 이해가 필요하다. HTTP Message는 우리가 어떤 요청을 보내거나 요청에 대한 응답을 보낼 때, 서버와 클라이언트가 서로 데이터를 교환하는 방식이다. 데이터를 요청할 때 부르는 용어인 Rquest에는 서버가 특정 동작을 수행하도록 하는 메시지를 담고 있고, 총 4개의 섹션으로 구분하고 있는데 ..