본문 바로가기

Develop43

[Spring Reactive] 리액티브 테스트 작성하기 스프링부트와 리액터에서는 비동기, 논블로킹 코드도 JUnit을 이용해 테스트할 수 있다. 리액티브 단위 테스트 리액티브 코드를 테스트할 때 핵심은 기능만을 검사하는 게 아니라 리액티브 스트림 시그널도 함께 검사해야 한다는 점이다. 리액티브 스트림은 onSubscribe, onNext, onError, onComplete를 말한다. @ExtendWith(SpringExtension.class) class InventoryServiceTest { InventoryService inventoryService; @MockBean private ItemRepository itemRepository; @MockBean private CartRepository cartRepository; @BeforeEach voi.. 2023. 3. 13.
[Spring Reactive] 리액티브 데이터 Repository 정의하기 리포지토리를 생성하기 앞서 도메인은 다음과 같다. public class Item { private @Id String id; private String name; private double price; private Item(){} public Item(String name, double price) { this.name = name; this.price = price; } public String getId() { return id; } } 블로킹API인 JPA를 사용하지 않지만 JPA와 매우 유사한 인터페이스가 정의되어 있다. ReactiveCrudRepository 인터페이스를 상속하면 된다. 주석 내용은 기본적으로 제공하는 메서드이다. JPA와 거의 동일하게 제공한다는 것을 알 수 있다. pub.. 2023. 3. 12.
[Spring Reactive] 리액티브 데이터베이스 저장 요건 리액티브 프로그래밍의 핵심은 모든 과정이 리액티브여야 한다! 웹 컨트롤러와 서비스 계층도 리액티브 방식으로 동작하게 만들었는데, 블로킹 방식으로 연결되는 데이터베이스를 호출하면 리액티브는 무너진다. 블로킹 방식으로 데이터베이스를 호출한 스레드는 응답을 받을 때까지 다른 작업을 하지 못한 채 기다린다. 동기, 비동기와 블로킹, 논블로킹 개념이 헷갈린다면? 2023.03.09 - [Develop/CS] - 동기(Synchronous)와 비동기(Asynchronous), 블로킹(Blocking)과 논블로킹(Non-Blocking) 그렇다면 어떤 데이터베이스가 리액티브 패러다임을 지원하고 있을까? 몽고디비 레디스 아파치 카산드라 엘라스틱서치 네오포제이 카우치베이스 우리가 평소 사용하는 관계형 데이터베이스는 포함.. 2023. 3. 10.
[Spring Reactive] WebFlux를 사용해 Reactive Spring Boot 구성해보기 Spring Boot WebFlux를 사용해 리액티브 스프링을 사용할 것입니다. maven으로 빌드를 해야 해서 골치가 조금 아픕니다. (^..^) 리액티브 스트림이란? 발행자(publisher)와 구독자(subscriber) 사이의 간단한 계약을 정의하는 명세다. 트래픽을 가능한 한 빨리 발행하는 대신에 구독자가 '난 10개만 더 받을 수 있어.'라고 발행자에게 알리는 방식으로 트래픽을 제어할 수 있다. 리액터란? 리액티브 스트림은 수요 조절에 기반하고 있다. 프로젝트 리액터는 핵심 타입인 Flux를 사용해 수요 조절을 구현한다. Flux는 일련의 T 객체를 담고 있는 컨테이너다. 예시를 들자면 레스토랑에서 서빙 점원과 비슷하다고 할 수 있다. 주방에서 요리가 완성되면, 점원이 요리를 받아서 손님에게 .. 2023. 3. 8.
[Spring] 컴포넌트 탐색, 의존관계 주입과 서비스 로케이터 스프링 애플리케이션에서 빈을 등록하는 방식은 두 가지로 나눌 수 있다. 빈으로 등록될 클래스의 물리적 위치와 무관하게, 환경설정 클래스에서 직접 하나하나 빈으로 등록하기 그냥 빈의 존재를 플래그로 표시하기만 하고, 나머지는 스프링이 컴포넌트 탐색(Component Scanning)을 통해 자동으로 빈을 찾아내 등록하게 하기. 스프링 애플리케이션이 실행되면 모든 빈은 애플리케이션 컨텍스트(Application Context)에 등록된다. 스프링 애플리케이션에서는 의존관계 주입(DI, Dependency Injection)을 사용한다. 의존관계 주입 개념이 없던 2000년대 초반에는 서비스 로케이터(Service Locator) 패턴을 사용해서 서비스를 식별 가능한 어떤 주소와 함께 등록하고, 그 주소를 통.. 2023. 3. 7.
TDD 테스트 주도 개발 Test Driven Development 1. TDD의 주된 이익 코드를 깨끗하게 유지하도록 치열하게 싸우지 않으면 시스템은 점점 퇴화한다. 코드를 재빠르게 추가할 수는 있지만 처음에는 good code 라기보다는 not so great code 일 가능성이 높다. TDD를 잘 따른다면 구현하는 실질적인 모든 사례에 대해 단위테스트를 작성하게 된다. 단위 테스트는 코드를 지속적으로 발전시킬 수 있는 자유를 준다. 작성하려는 코드가 있다면 항상 먼저 어떻게 그 코드를 테스트할지 고민해야 한다. 작성할 코드를 묘사하는 테스트를 설계해야 한다. 이러한 역 방향 접근법은 단위 테스트 전략의 핵심이다. 2. 단순하게 시작 TDD는 세 부분의 사이클로 구성된다. - 실패하는 테스트 코드 작성하기 - 테스트 통과시.. 2023. 2. 19.
[Spring Boot] 애플리케이션 배포하기 다루는 내용 - WAR 파일 배포 - 클라우드에 배포 애플리케이션 서버에 배포하기 WAR 파일 생성하기 war 파일 생성 후 톰캣 등 서버에 올려서 사용한다. java -jar build/libs/readingList-0.0.1-SNAPSHOT.war 클라우드에 배포하기 PaaS 클라우드를 이용해 배포를 한다. 가장 유명한 플랫폼인 '클라우드 파운드리'와 '헤로쿠'에 배포할 것이다. 가 책의 내용이지만... 요즘 트렌드와 거리가 먼 것 같아서 가볍게 읽고 넘어간다. 도커를 안 쓸 때인가 아무튼 배포 라인은 따로 공부할 예정이다. 2023. 2. 18.
[Spring Boot] 액추에이터로 내부 들여다보기 - 2 다루는 내용 - 액추에이터 원격 셸에 접속하기 - 액추에이터 보안 원격 셸을 이용해 접속하기(DEPRECATED) 엔드포인트를 이용한 방법 말고도 원격 셸을 이용하면 작동 중인 애플리케이션의 내부를 알 수 있다. 스프링 부트는 CRaSH를 내장하고 있는데 이 셸은 어떤 자바 애플리케이션에서든 내장할 수 있다. 또 스프링 부트는 액추에이터의 엔드포인트와 거의 동일한 기능을 스프링 부트에 특화된 명령으로 제공하려고 CRaSH를 확장했다. 쩝... 대략 18년 이후부터 deprecated 되었나보다. 이런 방법이 있었다~ 액추에이터 사용자화하기 엔드포인트 ID 변경하기 management: endpoints: shutdown: id: kill 엔드포인트 활성화/비활성화하기 management: endpoint.. 2023. 2. 17.