본문 바로가기

전체 글847

스프링 Webflux - 스레드와 이벤트 루프 개요 이벤트 루프는 단순한 스레드인데 어떻게 CPU를 블락킹하는 일반적인 자바 스레드와 다르게 동작할 수 있을까? 리액티브 프로그래밍은 이해하기 어렵진 않지만 완벽하게 이해하기는 쉬운 일이 아니다. 카페에 가서 선호하는 음료를 주문한다고 상상해보자. 주문을 한 후 바리스타가 커피를 다 만들때까지 카페에서 기다리거나 또는 카페 근처를 산책할수도 있다. 또는 주문 직후 핸드폰으로 이메일을 보내거나 다음 미팅 스케줄을 잡을수도 있다. 리액트 프로그래밍의 원리를 이해하고 사용하는것은 매우 중요한데, 프레임워크에 가려져있기에 쉽게 파악하기가 까다롭다. 본 포스팅에서는 일반적인 리액티브 프로그래밍에 대해 초점을 맞추지 않을 것이다. 대신, 스프링 내부에서 어떻게 통합되고 동작하는지에 대해 설명하겠다. Reactiv.. 2023. 11. 13.
스프링 MVC 1 정리 서블릿 @ServletComponentScan @SpringBootApplication @ServletComponentScan public class ServletApplication { public static void main(String[] args) { SpringApplication.run(ServletApplication.class, args); } } 스프링 부트는 서블릿을 직접 등록해서 사용할 수 있는 어노테이션을 제공한다. 예를 들어 위처럼 @ServletComponentScan 어노테이션을 사용하면 스프링이 자동으로 현재 패키지 기준 하위 패키지를 스캔하여 모든 서블릿을 찾고 등록시켜준다. @WebServlet @WebServlet(name = "helloServlet", urlPatt.. 2023. 9. 12.
스프링 통합 테스트를 위한 AbstractTestExecutionListener 개요 테스트는 메소드별로 타 테스트에 영향이 없어야한다. 스프링에서는 @Transactional 어노테이션을 사용하면 테스트 실행 시 발생한 DB작업에 대해 테스트가 종료 시 자동으로 롤백해주는 기능을 제공한다. 지금까지 해당 기능을 통해 통합 테스트를 수행했고 별다른 문제가 발생하지 않았는데, 이번에 비즈니스 로직을 추가하면서 전파 속성이 REQUIRES_NEW인 트랜잭션 단위에 대해 문제가 발생했고 이에 따라 데이터베이스를 초기화시켜주는 작업을 @Transactional 사용에서 AbstractTestExecutionListener를 사용하는 것으로 변경하게 되었다. 본 포스팅에서는 MySQL 대상으로 각 테스트 시 데이터베이스 초기화를 통해 테스트를 격리시키는 방법에 대해 기술한다. Abstract.. 2023. 8. 30.
Reactive Streams 개념 정리 구성 요소 Publisher: 데이터를 생성하고 통지(발행, 게시, 방출)하는 역할을 한다. Subscriber: 구독한 Publisher로부터 통지된 데이터를 전달받아서 처리하는 역할을 한다. Subscription: Publisher에 요청할 데이터의 개수를 지정하고 데이터의 구독을 취소하는 역할을 한다. Processor: Publisher와 Subscriber의 기능을 모두 가지고 있다. 즉, Subscriber로서 다른 Publisher를 구독할 수 있고 Publisher로서 다른 Subscriber가 구독할 수 있다. 동작 과정 Subscriber는 Publisher를 구독한다. (subscribe) Publisher는 Subscriber에게 데이터를 통지할 준비가 되었음을 알린다. (onSu.. 2023. 8. 23.
스프링 테스트 코드를 위한 어노테이션 개요 테스트 코드를 작성하다보면 중복코드가 많이 발생한다. 예를 들어 서비스 레이어를 테스트하는 슬라이스 테스트인 경우 @ExtendWith(MockitoExtension.class)를 통해 Mokcito를 활성화시켜주고, 필요하다면 @ActiveProfiles를 통해 프로필을 설정하는 등의 코드들이 계속 생겨나는 모습을 볼 수 있다. 본 포스팅에서는 통합 테스트/유닛/레포지토리 테스트 코드 작성 시 코드 로직 작성에만 집중할 수 있도록 각 테스트 대상에 맞는 통합 어노테이션을 만들고 적용하는 과정에 대해 기술한다. @TestEnvironment @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ActiveProfiles("test") @Te.. 2023. 8. 22.
스프링 프로젝트 시작을 위한 컨벤션 설정 개요 프로젝트를 시작하기 전 가장 중요한 점이 있는데 바로 일관적인 코드가 유지될 수 있도록 하는것이다. 이는 코드 관점에서는 아키텍처와 규칙이 될 수 있겠고 컨벤션 관점에서는 포맷팅이 있을 것 같다. 사람이 코드 포맷팅을 직접 지키면서 작업하기는 힘들기 때문에 일반적으로 플러그인 등의 기능을 이용하여 모든 코드에 일관성을 지키는데 이를 도와주는 것이 바로 Spotless이다. Spotless를 사용하면 현재의 코드가 정해진 규약을 충족하는지 체크할 수 있고 충족하지 않는다면 자동으로 코드를 변경해주는 기능 또한 제공한다. 또한 모든 코드는 테스트 코드가 필수적으로 들어가는데, 사람이 직접 엣지 케이스를 찾아내는건 쉽지 않은 일이다. 이때 코드 커버리지를 측정하는 방법을 도입할 수 있는데 이는 실제로 굉.. 2023. 8. 22.