[Spring][React] Spring Security를 통한 로그인 + 회원가입 구현 -2(BE)

CodeKong의 기술 블로그·2023년 9월 22일
1
post-thumbnail

[완료된 포스트입니다.]

오늘은 저번 회원가입 파트의 FE 부분에 이어서 BE인 spring을 만들어보겠습니다!!


먼저 FE에서 보내줄 정보를 받을 DTO 객체를 만들어줍니다.

UserCreateDto.java

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserCreateDto {

    String username;

    String email;

    String password;

    String mbtiType;
}

다음 회원가입의 엔드포인트를 맡을 controller를 추가해줍니다.

UserController.java

@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);
    }
    
}

UserCreateDto를 받아서 userService의 createUser에 넘겨줍니다

리턴값으로 회원가입에 성공하면 username을 리턴받아 반환합니다.


UserService.java

@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를 인코딩하여 새롭게 등록합니다.


또한 테스트 코드 작성을 습관화 하기 위해 작성하였습니다!

TEST

@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요청을 보내고 응답값을 생성값과 비교합니다!

통과 완료!


적용


테스트 정보를 입력해볼게요

성공!

0개의 댓글