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);
}
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());
}
}
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);
}
}
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를 사용하여 리액티브한 마이크로서비스를 구현하는 방법을 보여주고 있습니다.
이 예제는 간단하게 사용자 인증 서비스를 구현하고 있지만, 리액티브 프로그래밍을 활용하여 마이크로서비스 아키텍처 전체에 걸쳐 비동기성, 확장성, 반응성을 강화할 수 있습니다.