ex) 리액티브 마이크로서비스 프로그래밍

KKH_94·2023년 8월 30일
0

Reactive_Programming

목록 보기
12/18

Spring WebFlux를 사용하여 리액티브한 마이크로서비스를 만드는 방법을 보여줍니다.

이 예제에서는 간단한 "인증 서비스"를 구현합니다.

  1. 의존성 설정 : 먼저 build.gradle 파일에 Spring WebFlux와 관련된 의존성을 추가합니다.
    dependencies {
       implementation 'org.springframework.boot:spring-boot-starter-webflux'
       implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
       implementation 'org.springframework.boot:spring-boot-starter-security'
       implementation 'io.projectreactor:reactor-core'
       testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }

2. **사용자 모델 및 레포지토리** : 사용자 정보를 담을 모델과 사용자 관련 기능을 처리할 리액티브 레포지토리를 생성합니다.

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "users")
public class User {
    @Id
    private String id;
    private String username;
    private String password;
}

import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Mono;

public interface UserRepository extends ReactiveMongoRepository<User, String> {
    Mono<User> findByUsername(String username);
}
  1. 리액티브 서비스 : 사용자 로그인을 처리할 리액티브 서비스를 구현합니다.
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
public class UserService implements ReactiveUserDetailsService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public Mono<UserDetails> findByUsername(String username) {
        return userRepository.findByUsername(username)
            .switchIfEmpty(Mono.error(new UsernameNotFoundException("User not found")))
            .map(user -> org.springframework.security.core.userdetails.User
                .withUsername(user.getUsername())
                .password(user.getPassword())
                .roles("USER")
                .build());
    }
}
  1. 컨트롤러 : 사용자 인증을 처리할 컨트롤러를 생성합니다.
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class AuthController {
    @GetMapping("/auth/user")
    public Mono<String> getUser(@AuthenticationPrincipal Mono<UserDetails> userDetails) {
        return userDetails.map(UserDetails::getUsername);
    }
}
  1. 애플리케이션 엔트리 포인트 : 애플리케이션을 시작하는 엔트리 포인트 클래스를 생성합니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MicroserviceReactiveExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(MicroserviceReactiveExampleApplication.class, args);
    }
}

위의 코드 예제는 Spring WebFlux를 사용하여 리액티브한 마이크로서비스를 구현하는 방법을 보여주고 있습니다.

이 예제는 간단하게 사용자 인증 서비스를 구현하고 있지만, 리액티브 프로그래밍을 활용하여 마이크로서비스 아키텍처 전체에 걸쳐 비동기성, 확장성, 반응성을 강화할 수 있습니다.

profile
_serendipity

0개의 댓글