@Service public class UserService { private final UserRepository userRepository; private final KafkaTemplate<String, String> kafkaTemplate; public UserService(UserRepository userRepository, KafkaTemplate<String, String> kafkaTemplate) { this.userRepository = userRepository; this.kafkaTemplate = kafkaTemplate; } public void signUp(SignUpRequestDto signUpRequestDto) { // 회원 가입한 사용자 정보 DB에 저장 User user = new User( signUpRequestDto.getEmail(), signUpRequestDto.getName(), signUpRequestDto.getPassword() ); userRepository.save(user); } }
UserSignedUpEvent라고 지을건데, 이렇게 이름을 짓는 이유는 MSA 구조에서 많이 사용하는 이벤트 기반 아키텍처에서 사용하는 네이밍 방식을 활용해 지은 것이다. 이 개념에 대해 모르는 분들은 그냥 ‘MSA에서 많이 사용하는 메시지 객체의 이름이구나’ 정도로만 인지하고 넘어가자. public class UserSignedUpEvent { private Long userId; private String email; private String name; public UserSignedUpEvent(Long userId, String email, String name) { this.userId = userId; this.email = email; this.name = name; } public Long getUserId() { return userId; } public String getEmail() { return email; } public String getName() { return name; } }
UserSignedUpEvent 메시지 객체에 password 속성은 일부러 포함시키지 않았다. 왜냐하면 password 값을 다른 종류의 서버(ex. 이메일 서버)에서 활용할 일이 없기 때문이다. 다른 데서 활용할 일이 없는데 굳이 불필요한 정보를 포함시켜 kakfa에 메시지를 보낼 필요가 없다. 이와 같이 kafka에 메시지를 보낼 때는 필요한 정보만 선별해서 보내면 된다. @Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public void signUp(SignUpRequestDto signUpRequestDto) { // 회원 가입한 사용자 정보 DB에 저장 User user = new User( signUpRequestDto.getEmail(), signUpRequestDto.getName(), signUpRequestDto.getPassword() ); userRepository.save(user); } private String toJsonString(Object object) { ObjectMapper objectMapper = new ObjectMapper(); try { String message = objectMapper.writeValueAsString(object); return message; } catch (JsonProcessingException e) { throw new RuntimeException("Json 직렬화 실패"); } } }
@Service public class UserService { private final UserRepository userRepository; private final KafkaTemplate<String, String> kafkaTemplate; public UserService(UserRepository userRepository, KafkaTemplate<String, String> kafkaTemplate) { this.userRepository = userRepository; this.kafkaTemplate = kafkaTemplate; } public void signUp(SignUpRequestDto signUpRequestDto) { // 회원 가입한 사용자 정보 DB에 저장 User user = new User( signUpRequestDto.getEmail(), signUpRequestDto.getName(), signUpRequestDto.getPassword() ); User savedUser = userRepository.save(user); // 카프카에 메시지 전송 UserSignedUpEvent userSignedUpEvent = new UserSignedUpEvent( savedUser.getId(), savedUser.getEmail(), savedUser.getName() ); this.kafkaTemplate.send("user.signed-up", toJsonString(userSignedUpEvent)); } private String toJsonString(Object object) { ObjectMapper objectMapper = new ObjectMapper(); try { String message = objectMapper.writeValueAsString(object); return message; } catch (JsonProcessingException e) { throw new RuntimeException("Json 직렬화 실패"); } } }
