@Slf4j
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping("/users")
public ResponseEntity<ResponseRegisterUser> register(@RequestBody RequestRegisterUser user) {
try {
ResponseRegisterUser responseRegisterUser = userService.register(user);
return ResponseEntity.ok().body(responseRegisterUser);
} catch (DataAccessException e) {
log.error("Save err", e);
return ResponseEntity.badRequest().build();
}
}
@GetMapping("/users/{userId}")
public ResponseEntity<ResponseUser> getUser(@PathVariable String userId) {
try {
ResponseUser user = userService.getUser(userId);
return ResponseEntity.ok().body(user);
} catch (DataAccessException e) {
log.error("User find err", e);
return ResponseEntity.badRequest().build();
}
}
@GetMapping("/user/{providerId}")
public ResponseEntity<String> isUserAlreadyRegistered(@PathVariable String providerId) {
if (userService.isUserAlreadyRegistered(providerId)) return ResponseEntity.ok().build();
else return ResponseEntity.notFound().build();
}
}
유저 마이크로 서비스의 회원가입, 조회 기능을 일부 구현했다.
request와 response에서 받아오거나 보내는 데이터는 따로 클래스로 만들었다.
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class RequestRegisterUser {
private String userId;
private String providerId;
private User.Status status;
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class ResponseRegisterUser {
private String userId;
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class ResponseUser {
private String userId;
private String providerId;
private String nickname;
private String phone;
private String address;
@Enumerated(value = EnumType.STRING)
private User.Status status;
}
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "users")
@Entity
public class User extends BaseDateTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userId;
@Column(name = "provider_id")
private String providerId;
private String nickname;
private String phone;
private String address;
@Enumerated(value = EnumType.ORDINAL)
private Status status;
public enum Status {
ADMIN, MANAGER, USER
}
}
@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public ResponseRegisterUser register(RequestRegisterUser user) {
User userEntity = UserMapper.INSTANCE.requestRegisterUserToUser(user);
userRepository.save(userEntity);
return UserMapper.INSTANCE.requestRegisterUserToResponseUser(user);
}
public ResponseUser getUser(String userId) {
User foundUser = userRepository.findByUserId(userId).orElseThrow();
return UserMapper.INSTANCE.userToResponseUser(foundUser);
}
public boolean isUserAlreadyRegistered(String providerId) {
return userRepository.findByProviderId(providerId).isPresent();
}
}
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper( UserMapper.class );
User requestRegisterUserToUser(RequestRegisterUser user);
ResponseRegisterUser requestRegisterUserToResponseUser(RequestRegisterUser user);
ResponseUser userToResponseUser(User user);
}
MapStruct를 사용해서 dto와 엔티티간 변환을 했다. 처음에는 데이터가 전달되지 않아 null로 다 채워지거나, 자동으로 생성되는 Impl 클래스에서 변환되는 부분이 만들어지지 않는 등의 문제가 있었는데 dto 클래스들에서 생성자와 빌더를 설정하니 해결되었다.
@DataJpaTest
class UserServiceTest {
private final UserService userService;
private final UserRepository userRepository;
@Autowired
public UserServiceTest(UserRepository userRepository) {
this.userRepository = userRepository;
this.userService = new UserService(this.userRepository);
}
@Test
public void 저장이_성공적으로_완료된다() {
// given
RequestRegisterUser requestRegisterUser = RequestRegisterUser.builder()
.userId("test@test.com")
.providerId("n12345678")
.status(User.Status.USER)
.build();
// when
ResponseRegisterUser result = userService.register(requestRegisterUser);
ResponseUser foundUser = userService.getUser(requestRegisterUser.getUserId());
// then
Assertions.assertThat(result.getUserId()).isEqualTo(requestRegisterUser.getUserId());
Assertions.assertThat(foundUser.getUserId()).isEqualTo(requestRegisterUser.getUserId());
}
}
@DataJpaTest 어노테이션은 처음 사용해봤는데 @SpringBootTest보다 테스트 실행 속도가 빠를 줄 알았는데 별 차이가 없어서 나중에 한번 제대로 공부해봐야 겠다.

일단 몇 가지 기능만 조금 구현해놓은거라 DB 설정 부분이나 여러 가지 손 봐야할 부분이 아직 많다...
'공부 > Spring Cloud' 카테고리의 다른 글
| [Spring Cloud][5] JWT, OAuth2 로그아웃 구현하기 (0) | 2024.05.04 |
|---|---|
| [Spring Cloud][4] JWT, OAuth2로 로그인 하기 (0) | 2024.05.03 |
| [Spring Cloud] Kafka cluster와 H2 포트 충돌 해결하기 (0) | 2024.04.08 |
| [Spring Cloud] log4j:ERROR Could not read configuration file 해결하기 (0) | 2024.04.05 |
| [Spring Cloud][2] Eureka Discovery Client 등록하기 (0) | 2024.03.31 |