R2DBC 및 PostgreSQL의 반응 Spring을 사용한 애플리케이션 시작

12448 단어

R2DBC 및 PostgreSQL의 반응 Spring을 사용한 애플리케이션 시작


최초 발표Medium
myblog에서도 구입 가능

반응성 응용


마이크로 서비스 체계 구조가 흥기함에 따라 반응식 응용은 갈수록 유행하고 있다.무공 시스템의 잠재력을 충분히 이용하기 위해서는 모든 시스템이 무공을 권장한다.그러나 JVM 세계에서 완전 반응식 응용 프로그램을 만드는 것은 여전히 상당히 큰 도전이다. 왜냐하면 JDBC(Java Database Connectivity, Java 데이터베이스 연결)는 동기화되고 막힌 API로 대부분의 응용 프로그램에 연결되어 데이터를 저장하는 관계 데이터베이스에 사용되기 때문이다.
이 문제를 해결하기 위해 Pivotal(Spring 프레임워크 뒤에 있는 회사)은 지역 사회 업무를 이끌고 데이터베이스에 연결하는 비동기적인 방식을 만들었다.이 프로젝트는 현재 R2DBC(반응식 관계 데이터베이스 연결)라고 불린다.Spring팀은 R2DBC 이니셔티브 이후 Spring 생태계에서 R2DBC를 지원하기로 결정함에 따라Spring Data R2DBC 탄생했다.

프로젝트 설정


Spring Boot과 Spring Data R2DBC를 사용하여 완벽하게 반응하는 애플리케이션을 만드는 방법을 살펴보겠습니다.우리는 HandySpring Initializr를 사용하여 이 프로젝트를 구축할 수 있다. 우리는 Java8, Maven, Jar를 우리의 포장으로 사용할 것이다.

세 가지 종속성이 포함되어야 합니다.
  • 스프링 데이터 R2DBC
  • PostgreSQL 드라이버
  • 스프링 반작용 복판
  • Lombok과 Spring Boot 개발 도구는 강제적이지는 않지만, Spring 응용 프로그램을 개발할 때의 많은 고통을 덜어주는 데 확실히 도움이 된다.만약 네가 그들의 용례가 무엇인지 모른다면, 나는 네가 그들의 문서를 좀 볼 것을 강력히 건의한다.
    프로젝트가 시작되면 이와 같은 일반적인 Spring Boot 마스터 클래스를 만나게 됩니다.
    @SpringBootApplication
    public class ReactivePostgresApplication {
    
      public static void main(String[] args) {
        SpringApplication.run(ReactivePostgresApplication.class, args);
      }
    }
    
    우선, 우리는 매우 간단한 구성원을 나타내는 POJO 클래스를 만들 것이다
    @Value
    @Builder
    public class Member {
      @Id
      private Long id;
      private String name;
    }
    
    @Value와 @Builder는 Lombok의 주석입니다. setter와 Getter, 그리고 샘플 코드가 가득한 것을 줄이기 위해 일련의 다른 것을 생성합니다.

    R2DBC 저장소


    저장소를 만드는 것도 매우 간단하고 다른 Spring 데이터 프레임워크에서 우리가 하는 일에 익숙하다. 이 예에서 우리는 R2dbcRepository를 사용하여 인터페이스를 확장할 것이다.
    public interface MemberRepository extends R2dbcRepository<Member, Long> {
      Mono<Member> findByName(String name);
    }
    
    두 번째 줄에서 사용자 정의 방법을 만들었습니다. 이 방법은 이름에 따라 구성원 데이터를 조회합니다.이 저장소가 무엇을 할 수 있는지 알고 싶으면 이것documentation을 보고 더 많은 정보를 얻을 수 있습니다.이 R2DBC 저장소에서 사용자 정의 방법은 구성원에게 직접 돌아가는 것이 아니라 모노로 포장된 것이다.이 저장소의 각 방법에는 Mono 또는 Flux가 사용됩니다.이것은 Project Reactor의 사용과 일치하기 때문에 우리는 반응식 API와 완전히 호환된다.
    R2DBC뿐만 아니라 Spring Data R2DBC에서도 다음 두 가지 옵션 중 하나로 인터페이스를 확장할 수 있습니다.
  • ReactiveCrudepository, 일반적인 때 저장소와
  • 추가 정렬 기능을 위한 ReactiveSortingRepository
  • 용례에 따라 이 옵션 중 하나를 선택할 수 있습니다.

    다음은 반응식 컨트롤러를 어떻게 실현하는지 살펴보자.
    @RestController
    @RequestMapping(value = "/api/member")
    @RequiredArgsConstructor
    public class MemberController {
    
      private final MemberRepository memberRepository;
    
      @GetMapping
      public Flux<Member> getAll() {
        return memberRepository.findAll();
      }
    
      @GetMapping(value = "/{name}")
      public Mono<Member> getOne(@PathVariable String name) {
        return memberRepository.findByName(name);
      }
    }
    
    이 예에서는 Mono와 Flux를 사용하는 두 개의 독립된 끝점을 생성합니다.
  • 방법 getAll에서 우리는 이전에 만든 저장소를 사용하여 데이터베이스에 있는 모든 데이터를 얻는다. 왜냐하면 우리는 한 개의 데이터를 얻지 않고 되돌아오는 데이터는 Flux에 봉인되기 때문이다.
  • 방법 getOne에서 우리는 데이터를 요청했다. 이런 상황에서 우리는Mono포장으로 되돌아온 데이터를 요청했다.
  • 우리 이제 거의 끝났어.이제 API를 설정했으므로 애플리케이션을 데이터베이스에 연결해야 합니다.이를 위해, 우리는 응용 프로그램에 이 두 속성을 추가해야 한다.속성 파일.
    spring.r2dbc.url=r2dbc:postgresql://postgres@localhost:5432/reactive
    logging.level.org.springframework.r2dbc=DEBUG
    
    첫 줄은spring이 로컬 데이터베이스에 연결되는 것을 알려 줍니다. 데이터베이스 이름은reactive이고 연결 프로토콜은 r2dbc입니다.
    두 번째 줄은 디버그 속성입니다. 그러면 프로그램에서 실행되는 검색을 정확하게 볼 수 있습니다.
    다음에 우리는 모델을 만들어야 한다.ql 파일로 데이터베이스 테이블을 초기화합니다. 우리는 다음과 같은 조회를 사용할 수 있습니다.
    CREATE TABLE IF NOT EXISTS member (
        id SERIAL PRIMARY KEY,
        name TEXT NOT NULL
    );
    
    자원 폴더에 저장하고 있습니다.
    마지막 단계는 Spring Data R2DBC 가 자동으로 데이터베이스를 초기화하는 모드를 지원하지 않기 때문에 애플리케이션을 시작할 때 이 질의를 수동으로 수행해야 합니다. 이 방법은 다음과 같습니다.
    우리는 메인 프로그램에 bean을 만들어서 실행 모드를 만들 수 있습니다.프로그램을 실행할 때마다 sql를 사용합니다.
    @Bean
    ConnectionFactoryInitializer initializer(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {
      ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
      initializer.setConnectionFactory(connectionFactory);
      ResourceDatabasePopulator resource =
          new ResourceDatabasePopulator(new ClassPathResource("schema.sql"));
      initializer.setDatabasePopulator(resource);
      return initializer;
    }
    
    이제 우리는 마침내 우리의 응용 프로그램을 실행할 수 있게 되었다.로그를 볼 때, 프로그램이 우리의 모드를 실행하는 것을 볼 수 있습니다.sql.
    202-01-07 12:33:49.037 DEBUG 37404 --- [actor-tcp-nio-1] o.s.r2dbc.connection.init.ScriptUtils    : Executing SQL script from class path resource [schema.sql]
    2021-01-07 12:33:49.088 DEBUG 37404 --- [actor-tcp-nio-1] o.s.r2dbc.connection.init.ScriptUtils    : 0 returned as update count for SQL: CREATE TABLE IF NOT EXISTS member ( id SERIAL PRIMARY KEY, name TEXT NOT NULL )
    
    위의 예제에 따라 두 개의 GET 끝점을 생성했습니다.
  • /api/member 우리 회원의 모든 데이터를 획득
  • /api/member/{name} 특정 구성원의 데이터 가져오기
  • API의 단점을 클릭하면localhost:8080/API/member의 모든 구성원을 얻을 수 있습니다. R2DBC가 이 SQL을 실행한 것을 볼 수 있습니다
    2021-01-07 12:35:21.823 DEBUG 37404 --- [ctor-http-nio-3] o.s.r2dbc.core.DefaultDatabaseClient     : Executing SQL statement [SELECT member.* FROM member]
    
    localhost:8080/api/member/{memberName} 에서 요청을 했을 때, 프로그램은 기록을 얻기 위해 검색을 실행하고 있음을 보여 줍니다.
    2021-01-07 12:39:24.956 DEBUG 37404 --- [ctor-http-nio-3] o.s.r2dbc.core.DefaultDatabaseClient     : Executing SQL statement [SELECT member.id, member.name FROM member WHERE member.name = $1]
    
    현재, 우리는 성공적으로 Spring 데이터 R2DBC로 완전 반응식 응용 프로그램을 만들었고, PostgreSQL을 관계 데이터베이스로 사용했다.

    결론


    Spring 데이터 R2DBC의 도움말 아래 완전 반응식 Spring 응용 프로그램을 만드는 것이 더욱 쉽다.이 과정은 우리가 이미 익숙해진 것과 크게 다르지 않다. 우리는 여전히 우리가 비반응성 데이터베이스에서 사용하는 같은 저장소를 사용할 수 있다.그것은 보기에 그렇게 유창하지 않다. 이것은 매우 기본적인 예시 응용 프로그램이지 모든 복잡한 수요를 가진 생산 규모 응용 프로그램이 아니다.따라서 사용자의 용례에 따라 Spring 데이터 R2DBC를 사용할 수 없을 수도 있습니다.
    데이터베이스를 미세하게 조정하는 방법에도 차이가 있다. 왜냐하면 우리는 더 이상 JDBC를 사용하지 않기 때문이다. 그 중 하나는 연결 탱크이다.데이터베이스 연결 풀에 대해 잘 알고 있을 수 있습니다HikariCP. 그러나 수동적인 측면에서는 HikariCP를 사용할 수 없습니다.연결 탱크를 사용하려면 R2DBC Pool를 사용할 수 있습니다.한 마디로 하면 R2DBC는 전도가 유망한 기술로 우리가 완전한 반응식 응용 프로그램을 가질 수 있게 한다.
    비록 많은 미지의 것이 있지만, 여전히 탐색할 가치가 있다!
    만약 당신이 완전한 원본 코드를 보고 싶다면, 여기는 repository의 링크입니다
    우리는 완전한 반응식의 응용을 할 수 있도록 전도가 유망한 기술이다.
    비록 많은 미지의 것이 있지만, 여전히 탐색할 가치가 있다!
    만약 당신이 완전한 원본 코드를 보고 싶다면, 여기는 repository의 링크입니다

    좋은 웹페이지 즐겨찾기