From 02c870dd688974f50b6487bb96daaf9283722bee Mon Sep 17 00:00:00 2001 From: minjo-on Date: Thu, 20 Feb 2025 13:49:42 +0900 Subject: [PATCH 1/8] =?UTF-8?q?refactor:=20userProducer=20interface=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deepdive/team1/api/user/application/UserFacade.java | 2 +- .../team1/domain/user/application/UserProducer.java | 9 +++++++++ .../{UserConsumer.java => KafkaUserConsumer.java} | 2 +- .../{UserProducer.java => KafkaUserProducer.java} | 5 ++++- 4 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserProducer.java rename team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/consumer/{UserConsumer.java => KafkaUserConsumer.java} (98%) rename team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/{UserProducer.java => KafkaUserProducer.java} (88%) diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java index 48eebac..499cd80 100644 --- a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java @@ -29,13 +29,13 @@ import goorm.deepdive.team1.domain.addresshistory.application.AddressHistoryCommandService; import goorm.deepdive.team1.domain.addresshistory.domain.AddressHistory; import goorm.deepdive.team1.domain.user.application.UserCommandService; +import goorm.deepdive.team1.domain.user.application.UserProducer; import goorm.deepdive.team1.domain.user.application.UserQueryService; import goorm.deepdive.team1.domain.user.domain.User; import goorm.deepdive.team1.domain.user.domain.UserCache; import goorm.deepdive.team1.domain.user.domain.UserDocument; import goorm.deepdive.team1.domain.user.domain.enums.AgeGroups; import goorm.deepdive.team1.infra.kafka.producer.AddressHistoryProducer; -import goorm.deepdive.team1.infra.kafka.producer.UserProducer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserProducer.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserProducer.java new file mode 100644 index 0000000..79674c2 --- /dev/null +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserProducer.java @@ -0,0 +1,9 @@ +package goorm.deepdive.team1.domain.user.application; + +import goorm.deepdive.team1.domain.user.domain.User; + +public interface UserProducer { + void sendMessageToCreate(User user); + + void sendMessageToUpdate(User user); +} diff --git a/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/consumer/UserConsumer.java b/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/consumer/KafkaUserConsumer.java similarity index 98% rename from team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/consumer/UserConsumer.java rename to team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/consumer/KafkaUserConsumer.java index 145b66b..82deff9 100644 --- a/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/consumer/UserConsumer.java +++ b/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/consumer/KafkaUserConsumer.java @@ -17,7 +17,7 @@ @Component @RequiredArgsConstructor -public class UserConsumer { +public class KafkaUserConsumer { private final RedisUserRepository redisUserRepository; private final ElasticUserRepository elasticUserRepository; private final ObjectMapper objectMapper; diff --git a/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/UserProducer.java b/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaUserProducer.java similarity index 88% rename from team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/UserProducer.java rename to team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaUserProducer.java index 5af02fd..1533193 100644 --- a/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/UserProducer.java +++ b/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaUserProducer.java @@ -6,18 +6,20 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import goorm.deepdive.team1.domain.user.application.UserProducer; import goorm.deepdive.team1.domain.user.domain.User; import lombok.RequiredArgsConstructor; @Component @RequiredArgsConstructor -public class UserProducer { +public class KafkaUserProducer implements UserProducer { private final KafkaTemplate kafkaTemplate; private final ObjectMapper objectMapper; private static final String CREATE_USER = "create-user"; private static final String UPDATE_USER = "update-user"; + @Override public void sendMessageToCreate(User user) { try { String userJson = objectMapper.writeValueAsString(user); @@ -27,6 +29,7 @@ public void sendMessageToCreate(User user) { } } + @Override public void sendMessageToUpdate(User user) { try { String userJson = objectMapper.writeValueAsString(user); From f540c910c9bc638e1dbc8a76e97942a2e6db0acc Mon Sep 17 00:00:00 2001 From: minjo-on Date: Thu, 20 Feb 2025 13:54:29 +0900 Subject: [PATCH 2/8] =?UTF-8?q?refactor:=20address=20history=20producer=20?= =?UTF-8?q?interface=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deepdive/team1/api/user/application/UserFacade.java | 4 ++-- .../infrastructure/AddressHistoryProducer.java | 9 +++++++++ .../{application => infrastructure}/UserProducer.java | 2 +- ...oryProducer.java => KafkaAddressHistoryProducer.java} | 5 ++++- .../team1/infra/kafka/producer/KafkaUserProducer.java | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/infrastructure/AddressHistoryProducer.java rename team1-domain/src/main/java/goorm/deepdive/team1/domain/user/{application => infrastructure}/UserProducer.java (74%) rename team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/{AddressHistoryProducer.java => KafkaAddressHistoryProducer.java} (87%) diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java index 499cd80..d88cd04 100644 --- a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java @@ -28,14 +28,14 @@ import goorm.deepdive.team1.domain.address.domain.Address; import goorm.deepdive.team1.domain.addresshistory.application.AddressHistoryCommandService; import goorm.deepdive.team1.domain.addresshistory.domain.AddressHistory; +import goorm.deepdive.team1.domain.addresshistory.infrastructure.AddressHistoryProducer; import goorm.deepdive.team1.domain.user.application.UserCommandService; -import goorm.deepdive.team1.domain.user.application.UserProducer; import goorm.deepdive.team1.domain.user.application.UserQueryService; import goorm.deepdive.team1.domain.user.domain.User; import goorm.deepdive.team1.domain.user.domain.UserCache; import goorm.deepdive.team1.domain.user.domain.UserDocument; import goorm.deepdive.team1.domain.user.domain.enums.AgeGroups; -import goorm.deepdive.team1.infra.kafka.producer.AddressHistoryProducer; +import goorm.deepdive.team1.domain.user.infrastructure.UserProducer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/infrastructure/AddressHistoryProducer.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/infrastructure/AddressHistoryProducer.java new file mode 100644 index 0000000..750bcbb --- /dev/null +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/infrastructure/AddressHistoryProducer.java @@ -0,0 +1,9 @@ +package goorm.deepdive.team1.domain.addresshistory.infrastructure; + +import goorm.deepdive.team1.domain.addresshistory.domain.AddressHistory; + +public interface AddressHistoryProducer { + void sendMessageToCreate(AddressHistory addressHistory); + + void sendMessageToDelete(AddressHistory addressHistory); +} diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserProducer.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/infrastructure/UserProducer.java similarity index 74% rename from team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserProducer.java rename to team1-domain/src/main/java/goorm/deepdive/team1/domain/user/infrastructure/UserProducer.java index 79674c2..76517db 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserProducer.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/infrastructure/UserProducer.java @@ -1,4 +1,4 @@ -package goorm.deepdive.team1.domain.user.application; +package goorm.deepdive.team1.domain.user.infrastructure; import goorm.deepdive.team1.domain.user.domain.User; diff --git a/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/AddressHistoryProducer.java b/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaAddressHistoryProducer.java similarity index 87% rename from team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/AddressHistoryProducer.java rename to team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaAddressHistoryProducer.java index 96350f9..a73f9c8 100644 --- a/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/AddressHistoryProducer.java +++ b/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaAddressHistoryProducer.java @@ -7,17 +7,19 @@ import com.fasterxml.jackson.databind.ObjectMapper; import goorm.deepdive.team1.domain.addresshistory.domain.AddressHistory; +import goorm.deepdive.team1.domain.addresshistory.infrastructure.AddressHistoryProducer; import lombok.RequiredArgsConstructor; @Component @RequiredArgsConstructor -public class AddressHistoryProducer { +public class KafkaAddressHistoryProducer implements AddressHistoryProducer { private final KafkaTemplate kafkaTemplate; private final ObjectMapper objectMapper; private static final String CREATE_ADDRESS_HISTORY = "create-address-history"; private static final String DELETE_ADDRESS_HISTORY = "delete-address-history"; + @Override public void sendMessageToCreate(AddressHistory addressHistory) { try { String addressHistoryJson = objectMapper.writeValueAsString(addressHistory); @@ -27,6 +29,7 @@ public void sendMessageToCreate(AddressHistory addressHistory) { } } + @Override public void sendMessageToDelete(AddressHistory addressHistory) { try { String addressHistoryJson = objectMapper.writeValueAsString(addressHistory); diff --git a/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaUserProducer.java b/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaUserProducer.java index 1533193..42fd6b2 100644 --- a/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaUserProducer.java +++ b/team1-infra/src/main/java/goorm/deepdive/team1/infra/kafka/producer/KafkaUserProducer.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import goorm.deepdive.team1.domain.user.application.UserProducer; +import goorm.deepdive.team1.domain.user.infrastructure.UserProducer; import goorm.deepdive.team1.domain.user.domain.User; import lombok.RequiredArgsConstructor; From 62b75ead28e5205031ff13b0a41f95e69b1f46e8 Mon Sep 17 00:00:00 2001 From: minjo-on Date: Thu, 20 Feb 2025 14:03:30 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20userFacade=20=EC=97=90=EC=84=9C?= =?UTF-8?q?=20Producer=20service=20layer=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deepdive/team1/api/user/application/UserFacade.java | 5 ----- .../team1/domain/user/application/UserCommandService.java | 7 ++++++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java index d88cd04..9c6c4f5 100644 --- a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java @@ -35,7 +35,6 @@ import goorm.deepdive.team1.domain.user.domain.UserCache; import goorm.deepdive.team1.domain.user.domain.UserDocument; import goorm.deepdive.team1.domain.user.domain.enums.AgeGroups; -import goorm.deepdive.team1.domain.user.infrastructure.UserProducer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -47,7 +46,6 @@ public class UserFacade { private final UserCommandService userCommandService; private final AddressHistoryCommandService addressHistoryCommandService; private final AddressCommandService addressCommandService; - private final UserProducer userProducer; private final AddressHistoryProducer addressHistoryProducer; private final KakaoApiAddressService kakaoApiAddressService; private final AddressQueryService addressQueryService; @@ -67,7 +65,6 @@ public UserPersistResponse create(UserCreateRequest request) { AddressHistory addressHistory = addressHistoryCommandService.create(user, address); - userProducer.sendMessageToCreate(user); addressHistoryProducer.sendMessageToCreate(addressHistory); return UserPersistResponse.from(user); @@ -114,8 +111,6 @@ public void update(Long id, UserUpdateRequest request) { AddressHistory addressHistory = addressHistoryCommandService.create(user, address); addressHistoryProducer.sendMessageToDelete(addressHistory); } - - userProducer.sendMessageToUpdate(user); } @Transactional diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserCommandService.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserCommandService.java index 8b6fdd3..d191bcf 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserCommandService.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserCommandService.java @@ -8,6 +8,7 @@ import goorm.deepdive.team1.domain.user.domain.User; import goorm.deepdive.team1.domain.user.domain.UserCache; import goorm.deepdive.team1.domain.user.domain.enums.Gender; +import goorm.deepdive.team1.domain.user.infrastructure.UserProducer; import goorm.deepdive.team1.domain.user.infrastructure.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -17,10 +18,12 @@ @RequiredArgsConstructor public class UserCommandService { private final UserRepository userRepository; + private final UserProducer userProducer; public User create(String name, String email, String phoneNumber, Address address, Gender gender, Integer age) { User user = User.create(name, email, phoneNumber, address, gender, age); - return userRepository.save(user); + userProducer.sendMessageToCreate(userRepository.save(user)); + return user; } public void update(User user, String name, String email, String phoneNumber, Gender gender, Integer age, Address address) { @@ -30,6 +33,8 @@ public void update(User user, String name, String email, String phoneNumber, Gen user.updateGender(gender); user.updateAge(age); user.updateAddress(address); + + userProducer.sendMessageToUpdate(user); } public void delete(User user) { From 7a7fd7c163231cb284959b884a0d2c1473a645c6 Mon Sep 17 00:00:00 2001 From: minjo-on Date: Thu, 20 Feb 2025 14:11:23 +0900 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20addresshistoryService=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=A9=94=EC=84=B8=EC=A7=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team1/api/user/application/UserFacade.java | 10 ++-------- .../application/AddressHistoryCommandService.java | 11 +++++++++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java index 9c6c4f5..7a482a8 100644 --- a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java @@ -27,8 +27,6 @@ import goorm.deepdive.team1.domain.address.application.KakaoApiAddressService; import goorm.deepdive.team1.domain.address.domain.Address; import goorm.deepdive.team1.domain.addresshistory.application.AddressHistoryCommandService; -import goorm.deepdive.team1.domain.addresshistory.domain.AddressHistory; -import goorm.deepdive.team1.domain.addresshistory.infrastructure.AddressHistoryProducer; import goorm.deepdive.team1.domain.user.application.UserCommandService; import goorm.deepdive.team1.domain.user.application.UserQueryService; import goorm.deepdive.team1.domain.user.domain.User; @@ -46,7 +44,6 @@ public class UserFacade { private final UserCommandService userCommandService; private final AddressHistoryCommandService addressHistoryCommandService; private final AddressCommandService addressCommandService; - private final AddressHistoryProducer addressHistoryProducer; private final KakaoApiAddressService kakaoApiAddressService; private final AddressQueryService addressQueryService; @@ -63,9 +60,7 @@ public UserPersistResponse create(UserCreateRequest request) { request.age() ); - AddressHistory addressHistory = addressHistoryCommandService.create(user, address); - - addressHistoryProducer.sendMessageToCreate(addressHistory); + addressHistoryCommandService.create(user, address); return UserPersistResponse.from(user); } @@ -108,8 +103,7 @@ public void update(Long id, UserUpdateRequest request) { request.gender(), request.age(), address); if (isAddressChanged) { - AddressHistory addressHistory = addressHistoryCommandService.create(user, address); - addressHistoryProducer.sendMessageToDelete(addressHistory); + addressHistoryCommandService.create(user, address); } } diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/application/AddressHistoryCommandService.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/application/AddressHistoryCommandService.java index ca2cea5..0dce983 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/application/AddressHistoryCommandService.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/application/AddressHistoryCommandService.java @@ -7,6 +7,7 @@ import goorm.deepdive.team1.domain.address.domain.Address; import goorm.deepdive.team1.domain.addresshistory.domain.AddressHistory; +import goorm.deepdive.team1.domain.addresshistory.infrastructure.AddressHistoryProducer; import goorm.deepdive.team1.domain.addresshistory.infrastructure.AddressHistoryRepository; import goorm.deepdive.team1.domain.user.domain.User; import lombok.RequiredArgsConstructor; @@ -16,10 +17,16 @@ @Transactional public class AddressHistoryCommandService { private final AddressHistoryRepository addressHistoryRepository; + private final AddressHistoryProducer addressHistoryProducer; - public AddressHistory create(User user, Address address) { + public void create(User user, Address address) { AddressHistory addressHistory = AddressHistory.create(user, address); - return addressHistoryRepository.save(addressHistory); + addressHistoryProducer.sendMessageToCreate(addressHistoryRepository.save(addressHistory)); + } + + public void update(User user, Address address) { + AddressHistory addressHistory = AddressHistory.create(user, address); + addressHistoryProducer.sendMessageToCreate(addressHistoryRepository.save(addressHistory)); } public void saveAll(List addressHistories) { From 26ab8e870c718eb750ae0faab3e4002a6456b6f3 Mon Sep 17 00:00:00 2001 From: minjo-on Date: Thu, 20 Feb 2025 14:28:09 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20user=20event=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deepdive/team1/api/user/application/UserFacade.java | 6 +----- .../team1/domain/user/event/UserCreatedEvent.java | 8 ++++++++ .../team1/domain/user/event/UserUpdatedEvent.java | 8 ++++++++ 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserCreatedEvent.java create mode 100644 team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserUpdatedEvent.java diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java index 7a482a8..9582ec8 100644 --- a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java @@ -94,15 +94,11 @@ public PaginatedListResponse getAll(Pageable pageable) { @Transactional public void update(Long id, UserUpdateRequest request) { Address address = findOrCreateAddress(request.roadAddress()); - User user = userQueryService.getById(id); - - boolean isAddressChanged = !Objects.equals(address.getId(), user.getAddress().getId()); - userCommandService.update(user, request.name(), request.email(), request.phoneNumber(), request.gender(), request.age(), address); - if (isAddressChanged) { + if (Objects.equals(address.getId(), user.getAddress().getId())) { addressHistoryCommandService.create(user, address); } } diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserCreatedEvent.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserCreatedEvent.java new file mode 100644 index 0000000..b324d0d --- /dev/null +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserCreatedEvent.java @@ -0,0 +1,8 @@ +package goorm.deepdive.team1.domain.user.event; + +import goorm.deepdive.team1.domain.user.domain.User; + +public record UserCreatedEvent( + User user +) { +} diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserUpdatedEvent.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserUpdatedEvent.java new file mode 100644 index 0000000..095fd6b --- /dev/null +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserUpdatedEvent.java @@ -0,0 +1,8 @@ +package goorm.deepdive.team1.domain.user.event; + +import goorm.deepdive.team1.domain.user.domain.User; + +public record UserUpdatedEvent( + User user +) { +} From aa176504c6f1a0af8fe97b276a314126c353c2b7 Mon Sep 17 00:00:00 2001 From: minjo-on Date: Thu, 20 Feb 2025 14:42:59 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/user/application/UserFacade.java | 4 ++-- .../api/user/listener/UserEventListener.java | 21 +++++++++++++++++++ .../AddressHistoryCommandService.java | 11 +++++----- .../addresshistory/domain/AddressHistory.java | 4 ++-- 4 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 team1-api/src/main/java/goorm/deepdive/team1/api/user/listener/UserEventListener.java diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java index 9582ec8..cefe74d 100644 --- a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java @@ -60,7 +60,7 @@ public UserPersistResponse create(UserCreateRequest request) { request.age() ); - addressHistoryCommandService.create(user, address); + addressHistoryCommandService.create(user); return UserPersistResponse.from(user); } @@ -99,7 +99,7 @@ public void update(Long id, UserUpdateRequest request) { request.gender(), request.age(), address); if (Objects.equals(address.getId(), user.getAddress().getId())) { - addressHistoryCommandService.create(user, address); + addressHistoryCommandService.update(user); } } diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/listener/UserEventListener.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/listener/UserEventListener.java new file mode 100644 index 0000000..49be6e4 --- /dev/null +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/listener/UserEventListener.java @@ -0,0 +1,21 @@ +package goorm.deepdive.team1.api.user.listener; + +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import goorm.deepdive.team1.domain.addresshistory.application.AddressHistoryCommandService; +import goorm.deepdive.team1.domain.user.domain.User; +import goorm.deepdive.team1.domain.user.event.UserCreatedEvent; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class UserEventListener { + private final AddressHistoryCommandService addressHistoryCommandService; + + @EventListener + public void handleUserCreatedEvent(UserCreatedEvent event) { + User user = event.user(); + addressHistoryCommandService.create(user); + } +} diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/application/AddressHistoryCommandService.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/application/AddressHistoryCommandService.java index 0dce983..7637220 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/application/AddressHistoryCommandService.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/application/AddressHistoryCommandService.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import goorm.deepdive.team1.domain.address.domain.Address; import goorm.deepdive.team1.domain.addresshistory.domain.AddressHistory; import goorm.deepdive.team1.domain.addresshistory.infrastructure.AddressHistoryProducer; import goorm.deepdive.team1.domain.addresshistory.infrastructure.AddressHistoryRepository; @@ -19,14 +18,14 @@ public class AddressHistoryCommandService { private final AddressHistoryRepository addressHistoryRepository; private final AddressHistoryProducer addressHistoryProducer; - public void create(User user, Address address) { - AddressHistory addressHistory = AddressHistory.create(user, address); + public void create(User user) { + AddressHistory addressHistory = AddressHistory.create(user); addressHistoryProducer.sendMessageToCreate(addressHistoryRepository.save(addressHistory)); } - public void update(User user, Address address) { - AddressHistory addressHistory = AddressHistory.create(user, address); - addressHistoryProducer.sendMessageToCreate(addressHistoryRepository.save(addressHistory)); + public void update(User user) { + AddressHistory addressHistory = AddressHistory.create(user); + addressHistoryProducer.sendMessageToDelete(addressHistoryRepository.save(addressHistory)); } public void saveAll(List addressHistories) { diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/domain/AddressHistory.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/domain/AddressHistory.java index 30df94c..d8d18e7 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/domain/AddressHistory.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/domain/AddressHistory.java @@ -40,10 +40,10 @@ public class AddressHistory extends BaseTimeEntity { @JoinColumn(name = "address_id", nullable = false) private Address address; - public static AddressHistory create(User user, Address address) { + public static AddressHistory create(User user) { return AddressHistory.builder() .user(user) - .address(address) + .address(user.getAddress()) .build(); } } From ad9e5b02dd26abde2465e5a7fa70cfc829f2cde9 Mon Sep 17 00:00:00 2001 From: minjo-on Date: Thu, 20 Feb 2025 15:16:27 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20user=20eventpublisher=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/user/listener/UserEventListener.java | 16 +++++++++++++--- .../domain/user/event/UserCreatedEvent.java | 7 +++++++ .../domain/user/event/UserDeletedEvent.java | 16 ++++++++++++++++ .../domain/user/event/UserUpdatedEvent.java | 7 +++++++ 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserDeletedEvent.java diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/listener/UserEventListener.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/listener/UserEventListener.java index 49be6e4..4f3c015 100644 --- a/team1-api/src/main/java/goorm/deepdive/team1/api/user/listener/UserEventListener.java +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/listener/UserEventListener.java @@ -4,8 +4,9 @@ import org.springframework.stereotype.Component; import goorm.deepdive.team1.domain.addresshistory.application.AddressHistoryCommandService; -import goorm.deepdive.team1.domain.user.domain.User; import goorm.deepdive.team1.domain.user.event.UserCreatedEvent; +import goorm.deepdive.team1.domain.user.event.UserDeletedEvent; +import goorm.deepdive.team1.domain.user.event.UserUpdatedEvent; import lombok.RequiredArgsConstructor; @Component @@ -15,7 +16,16 @@ public class UserEventListener { @EventListener public void handleUserCreatedEvent(UserCreatedEvent event) { - User user = event.user(); - addressHistoryCommandService.create(user); + addressHistoryCommandService.create(event.user()); + } + + @EventListener + public void handleUserUpdatedEvent(UserUpdatedEvent event) { + addressHistoryCommandService.update(event.user()); + } + + @EventListener + public void handleUserDeletedEvent(UserDeletedEvent event) { + addressHistoryCommandService.cleanUpDeletedAddressHistories(event.userIds()); } } diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserCreatedEvent.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserCreatedEvent.java index b324d0d..df17b3a 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserCreatedEvent.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserCreatedEvent.java @@ -1,8 +1,15 @@ package goorm.deepdive.team1.domain.user.event; import goorm.deepdive.team1.domain.user.domain.User; +import lombok.Builder; +@Builder public record UserCreatedEvent( User user ) { + public static UserCreatedEvent of(User user) { + return UserCreatedEvent.builder() + .user(user) + .build(); + } } diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserDeletedEvent.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserDeletedEvent.java new file mode 100644 index 0000000..59c181f --- /dev/null +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserDeletedEvent.java @@ -0,0 +1,16 @@ +package goorm.deepdive.team1.domain.user.event; + +import java.util.List; + +import lombok.Builder; + +@Builder +public record UserDeletedEvent( + List userIds +) { + public static UserDeletedEvent of(List userIds) { + return UserDeletedEvent.builder() + .userIds(userIds) + .build(); + } +} diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserUpdatedEvent.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserUpdatedEvent.java index 095fd6b..9b4b803 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserUpdatedEvent.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/event/UserUpdatedEvent.java @@ -1,8 +1,15 @@ package goorm.deepdive.team1.domain.user.event; import goorm.deepdive.team1.domain.user.domain.User; +import lombok.Builder; +@Builder public record UserUpdatedEvent( User user ) { + public static UserUpdatedEvent of(User user) { + return UserUpdatedEvent.builder() + .user(user) + .build(); + } } From b7f5da23b8bfe728fe9723a7041b58424dbe9f86 Mon Sep 17 00:00:00 2001 From: minjo-on Date: Thu, 20 Feb 2025 15:20:00 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20user=20eventpublisher=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team1/api/user/application/UserFacade.java | 14 ++------------ .../addresshistory/domain/AddressHistory.java | 3 ++- .../user/application/UserCommandService.java | 16 +++++++++++++++- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java index cefe74d..1211198 100644 --- a/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java +++ b/team1-api/src/main/java/goorm/deepdive/team1/api/user/application/UserFacade.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -26,7 +25,6 @@ import goorm.deepdive.team1.domain.address.application.AddressQueryService; import goorm.deepdive.team1.domain.address.application.KakaoApiAddressService; import goorm.deepdive.team1.domain.address.domain.Address; -import goorm.deepdive.team1.domain.addresshistory.application.AddressHistoryCommandService; import goorm.deepdive.team1.domain.user.application.UserCommandService; import goorm.deepdive.team1.domain.user.application.UserQueryService; import goorm.deepdive.team1.domain.user.domain.User; @@ -42,7 +40,6 @@ public class UserFacade { private final UserQueryService userQueryService; private final UserCommandService userCommandService; - private final AddressHistoryCommandService addressHistoryCommandService; private final AddressCommandService addressCommandService; private final KakaoApiAddressService kakaoApiAddressService; private final AddressQueryService addressQueryService; @@ -60,8 +57,6 @@ public UserPersistResponse create(UserCreateRequest request) { request.age() ); - addressHistoryCommandService.create(user); - return UserPersistResponse.from(user); } @@ -97,10 +92,6 @@ public void update(Long id, UserUpdateRequest request) { User user = userQueryService.getById(id); userCommandService.update(user, request.name(), request.email(), request.phoneNumber(), request.gender(), request.age(), address); - - if (Objects.equals(address.getId(), user.getAddress().getId())) { - addressHistoryCommandService.update(user); - } } @Transactional @@ -140,16 +131,15 @@ public List getUserHeatMap(List region, List ag } @Transactional - @Scheduled(cron = "0 0 0 * * *") + @Scheduled(cron = "20 18 15 * * *") public void cleanUpDeletedUsers() { - log.info("πŸ—‘οΈ μœ μ € μ‚­μ œ μŠ€μΌ€μ€„λ§ μž‘λ™..."); List userIdsToDelete = userQueryService.findIdsByDeletedAtIsNotNull(); if (userIdsToDelete.isEmpty()) { log.info("βœ… μ‚­μ œν•  μœ μ € 데이터가 μ—†μŠ΅λ‹ˆλ‹€."); return; } - addressHistoryCommandService.cleanUpDeletedAddressHistories(userIdsToDelete); + userCommandService.cleanUpDeletedUsers(userIdsToDelete); } diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/domain/AddressHistory.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/domain/AddressHistory.java index d8d18e7..64ded0b 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/domain/AddressHistory.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/addresshistory/domain/AddressHistory.java @@ -7,6 +7,7 @@ import goorm.deepdive.team1.domain.address.domain.Address; import goorm.deepdive.team1.domain.common.BaseTimeEntity; import goorm.deepdive.team1.domain.user.domain.User; +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; @@ -32,7 +33,7 @@ public class AddressHistory extends BaseTimeEntity { @GeneratedValue(strategy = IDENTITY) private Long id; - @ManyToOne(fetch = LAZY) + @ManyToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "user_id", nullable = false) private User user; diff --git a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserCommandService.java b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserCommandService.java index d191bcf..b430d97 100644 --- a/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserCommandService.java +++ b/team1-domain/src/main/java/goorm/deepdive/team1/domain/user/application/UserCommandService.java @@ -1,13 +1,17 @@ package goorm.deepdive.team1.domain.user.application; import java.util.List; +import java.util.Objects; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import goorm.deepdive.team1.domain.address.domain.Address; import goorm.deepdive.team1.domain.user.domain.User; import goorm.deepdive.team1.domain.user.domain.UserCache; import goorm.deepdive.team1.domain.user.domain.enums.Gender; +import goorm.deepdive.team1.domain.user.event.UserCreatedEvent; +import goorm.deepdive.team1.domain.user.event.UserUpdatedEvent; import goorm.deepdive.team1.domain.user.infrastructure.UserProducer; import goorm.deepdive.team1.domain.user.infrastructure.UserRepository; import lombok.RequiredArgsConstructor; @@ -18,11 +22,13 @@ @RequiredArgsConstructor public class UserCommandService { private final UserRepository userRepository; + private final ApplicationEventPublisher eventPublisher; private final UserProducer userProducer; public User create(String name, String email, String phoneNumber, Address address, Gender gender, Integer age) { User user = User.create(name, email, phoneNumber, address, gender, age); userProducer.sendMessageToCreate(userRepository.save(user)); + eventPublisher.publishEvent(UserCreatedEvent.of(user)); return user; } @@ -32,9 +38,16 @@ public void update(User user, String name, String email, String phoneNumber, Gen user.updatePhoneNumber(phoneNumber); user.updateGender(gender); user.updateAge(age); - user.updateAddress(address); + if (!Objects.equals(user.getAddress().getId(), address.getId())) { + updateAddress(user, address); + } + } + + private void updateAddress(User user, Address address) { + user.updateAddress(address); userProducer.sendMessageToUpdate(user); + eventPublisher.publishEvent(UserUpdatedEvent.of(user)); } public void delete(User user) { @@ -48,6 +61,7 @@ public void saveCache(UserCache userCache) { public void cleanUpDeletedUsers(List ids) { userRepository.deleteScheduling(ids); log.info("βœ… {}λͺ…μ˜ μœ μ € 데이터가 μ‚­μ œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€", ids.size()); + eventPublisher.publishEvent(ids); } public void saveAllCaches(List userCaches) {