Spring 7

[Spring] Spring Framework vs Spring Boot

스프링 프레임워크와 스프링 부트의 차이는 무엇일까? 스프링 부트 공식문서에 따르면 스프링 부트는 다음과 같다고 한다. Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run". We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration. 즉, 스프링 프레임워크는 기능이 많은만큼 환경설정이 복잡..

Spring 2023.01.03

[Spring] DI 의존성 주입 방식과 생성자 주입을 사용해야 하는 이유

의존성 주입(DI)이란? DI란, 객체 간 의존 관계를 스프링 컨테이너가 Bean등록 정보를 바탕으로 자동으로 주입해주는 기능을 말한다. 일반적으로 스프링 프로젝트를 보면, 컨트롤러에서 서비스나 레포지토리 객체를 사용 시, 컨트롤러에서 서비스나 레포지토리 객체를 사용 시 new 키워드를 통해 컨트롤러에서 직접 객체를 생성하지 않고 의존성 주입을 통해 스프링 컨테이너에 생성된 객체를 받아 사용하고 있는 것을 볼 수 있다. 위와 같은 어노테이션이 붙은 클래스들은 스프링 실행 시 스캔을 통해 개발자가 정의한 의존성 정보를 자동으로 bean 설정 정보에 등록을 하게 되어 의존성 주입이 동작하게 합니다. 이를 통해 객체간 결합도를 낮추고, 코드의 양을 줄여주고, 테스트를 용이하게 하며, 개발 및 유지보수를 더 쉽..

Spring 2022.11.22

[Spring] ArgumentResolver란?

ArgumentResolver가 필요한 상황 서비스를 운영하다보면 다양한 종류의 데이터를 받는다. 즉, 컨트롤러의 파라미터로 다양한 데이터가 온다는 것이다. 만약 사용자로부터 회원 id 요청이 들어왔지만 서버에서 필요한 정보는 회원이라면 어떻게 할까? 회원 id로 부터 회원정보를 조회해 회원 객체를 만들어주는 일련의 과정이 필요할 것이다. 이 때 사용되는것이 ArgumentResolver이다. Spring에서는 파라미터를 공통으로 처리할 수 있도록 구현된 인터페이스가 있는데, 그것을 바로 ArgumentResolver라고 부른다. 즉, 어떠한 요청이 컨트롤러에 들어왔을 때, 요청에 들어온 값으로부터 원하는 객체를 만들어내는 일을 ArgumentResolver이 간접적으로 해줄 수 있다. Spring Ar..

Spring 2022.11.18

[Spring] @Transactional의 트랜잭션 전파레벨

트랜잭션 전파레벨 @Transactional이란? 어노테이션 기반으로 설정하는 트랜잭션 구성 방식. 어노테이션 방식은 선언적 트랜잭션이라고도 불린다. 선언 시 트랜잭션 기능이 적용된 프록시 객체가 생성된다는 특징이 있다. @Transactional로 생성된 프록시 객체는 @Transactional이 적용된 메소드가 호출될 경우 PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit/Rollback 동작을 수행한다. 즉, 트랜잭션 처리를 JDK Dynamic Proxy 객체에게 대신 위임하여 AOP로 동작하게 한다. 어노테이션으로 트랜잭션을 구성할 경우 다음과 같은 옵션을 줄 수 있다. propagation 트랜잭션 전파 옵션으로 동작 도중 다른 트랜..

Spring 2022.11.17

[Spring] 필터와 인터셉터 (Filter vs Interceptor)

필터와 인터셉터 Filter vs Interceptor Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 필터와 인터셉터가 그 중 하나이다. 여기서 말하는 공통의 관심사란 무엇일까? 다음과 같은 상황을 가정해보자. 로그인 한 사용자만 상품 관리 페이지에 들어갈 수 있다. 상품관리 컨트롤러에서 로그인 여부를 체크하는 로직을 하나하나 작성하면 되겠지만, 만일 등록, 수정, 삭제, 조회 등 컨트롤러가 늘어나면 어떻게 될까? 로그인 한 사용자인지 아닌지 체크하는 로직이 중복되어 들어갈 것이다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 것을 공통 관심사라고 한다. 여기서 등록, 수정, 삭제, 조회 등 여러 로직에서 공통으로 인증에 대해서..

Spring 2022.11.16

[Spring] SpringBootTest 테스트 격리 방법

테스트 격리란? 마틴 파울러의 비결정적 테스트의 문제를 해결하기 위한 것. 비결정적 테스트란? 같은 입력값에 대해 항상 같은 결과를 출력하지 않는 테스트를 의미한다. 테스트 격리가 되지 않고 비결정적 테스트가 되는 근본적인 원인은? 각각의 테스트가 하나의 자원을 공유하기 때문이다. 그래서 스프링부트와 JUnit에서는 @BeforeEach, @AfterEach, @Transactional과 같은 어노테이션 기반의 격리를 지원한다. @SpringBootTest에서 테스트 격리하기 1. @Transactional 어노테이션 사용 @SpringBootTest를 사용한다면? 롤백되지 않는다. 만일 인수테스트를 할 때 @SpringBootTest 어노테이션을 사용한다면 문제가 생긴다. @SpringBootTest는..

Spring 2022.11.15

[Spring] Spring Bean Validation의 @Valid vs @Validated

Spring Bean을 검증하는 방법 Spring Bean을 검증하는 방법에는 어떤 것들이 있을까? 코드로 검증하기 Bean Validation 코드로 검증한다고 한다면? 다음과 같은 객체가 있다고 가정하자. public class Item { private final String itemName; private final int price; } 그리고 다음과 같은 검증이 필요하다고 가정해보자. itemName은 null값이 올 수 없다. itemName은 2자 이상, 30자 이하의 값이 와야한다. price는 null값이 올 수 없다. price 는 1000이상이어야한다…. 이러한 과정을 모두 코드로 작성한다면? 코드가 복잡해질 수 있다. Bean Validation을 활용한다면 어노테이션 하나로 검증..

Spring 2022.11.14