[완료된 포스트입니다.]
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserCreateDto {
String username;
String email;
String password;
String mbtiType;
}
@RestController
@CrossOrigin(origins = "http://localhost:3000")
@RequiredArgsConstructor
@RequestMapping("/api")
public class UserController {
private final UserService userService;
@PostMapping("/signup")
public ResponseEntity<?> postUser(@RequestBody UserCreateDto user) {
String username = userService.createUser(user);
return new ResponseEntity<>(username, HttpStatus.OK);
}
}
@Service
@RequiredArgsConstructor
public class UserService {
private final Logger logger = LoggerFactory.getLogger(UserService.class);
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
@Transactional
public String createUser(UserCreateDto user) {
try {
userRepository.findByEmail(user.getEmail()).ifPresent(m -> {
throw new IllegalArgumentException("이미 가입된 유저입니다.");
});
//비밀번호 암호화
String encodepwd = passwordEncoder.encode(user.getPassword());
User savedUser = User.toEntity(user, encodepwd);
//가입된 유저의 이름 반환
return userRepository.save(savedUser).getUsername();
} catch (IllegalArgumentException e) {
throw e;
}
}
}
createUser 함수에서는 DTO를 받아 repository에서 요청한 메일로 가입된 user가 있는지 체크합니다.
만약 기존에 있는 유저라면 에러를 반환하고
신규 유저라면 password를 인코딩하여 새롭게 등록합니다.
또한 테스트 코드 작성을 습관화 하기 위해 작성하였습니다!
@SpringBootTest
@AutoConfigureMockMvc
@Transactional
class UserControllerTest {
//모의 의존 관계 주입
@Autowired
private UserService userService;
@Autowired
private MockMvc mockMvc;
@DisplayName("회원가입")
@Test
@WithMockUser
void postUser() throws Exception {
//given
UserCreateDto userCreateDto = UserCreateDto.builder().username("testUser").email("testEmail@email.com").mbtiType("ISTJ").password("testpassword").build();
String reqJSON = new Gson().toJson(userCreateDto);
//when
MvcResult mvcResult = mockMvc.perform(post("/api/signup").contentType("application/json").content(reqJSON)).andReturn();
String resJSON = mvcResult.getResponse().getContentAsString();
//then
Assertions.assertEquals(userCreateDto.getUsername(), resJSON);
}
}
MockMVC를 이용해 post요청을 보내고 응답값을 생성값과 비교합니다!
테스트 정보를 입력해볼게요
성공!