2023-04-25 화
오늘은 마음을 다 잡고 공부를 했다.
오늘은 userController의 테스트를 진행해 보았다.
어제 비밀번호 변경시 데이터를 가져올 방법을 모르겠어서 취직을 먼저한 동기에게 물어보았다.
"세션을 이용해서 데이터를 가져와봐" 라고 했다.
와 나 그 생각을 못했지? 라는 생각이 들어 머리가 띵했다.
그 후 빠르게 코드를 작성하고, 나머지 코드들도 수정하며 테스트를 진행했다.
페이지만 넘어가는 로직은 빼고 진행하겠다.
// 로그인 페이지에서 로그인 버튼 클릭시 실행
// html form - post
// return "redirect:/login";
@PostMapping("/login")
public ResponseEntity<String> login(@RequestParam("userId") String userId,@RequestParam("userPassword") String userPassword, HttpSession session){
Long userIndex = userService.login(userId, userPassword);
if(userIndex == null){
return new ResponseEntity<>("no userData", HttpStatus.BAD_REQUEST);
// return "redirect:/login";
}
session.setAttribute("userIndex", userIndex);
log.info(session.getAttribute("userIndex").toString());
return new ResponseEntity<>(userIndex.toString(), HttpStatus.OK);
// return "redirect:/";
}
form 태그로 아이디와 비밀번호를 받을 때, 로그인이 되는 기능이다.
만약 해당 user가 없다면 다시 로그인창으로 돌아가야 하기 때문에, 테스트 시 받아온 userIndex가 null이면 "no userData"라는 문자가 나오게 만들었다.
그래서 ResponseEntity<Long>에서 ResponseEntity<String>으로 변경하고, 로그인 될 시 세션을 저장하고 toString() 메서드를 이용해 userIndex를 String 타입으로 변환 후, 반환하였다.
// 로그아웃 기능
@PostMapping("/logout")
public ResponseEntity<String> logout(HttpSession session){
session.invalidate();
return new ResponseEntity<>("logout successfully", HttpStatus.OK);
// return "redirect:/";
}
로그아웃 기능이다.
로그아웃 버튼을 클릭했을 시, 세션을 invalidate() 메서드로 지우고 지워졌는지 확인하기 위해 "logout successfully"라는 문자를 반환 시키도록 했다.
// 회원가입 기능
// html form - post (여기서는 @ModdelAttribute 생략함 -> model.addattribute 됨)
// return 로그인 페이지
// return "login.html";
@PostMapping("/signup")
public ResponseEntity<UserEntity> signup(UserDto userDto){
UserEntity user = userService.save(userDto);
return new ResponseEntity<>(user, HttpStatus.OK);
}
회원가입 버튼을 클릭했을 때 사용자 정보를 저장하는 로직이다.
회원가입 시 아이디, 닉네임 중복 체크를 했는지에 대한 부분은 ajax에서 처리 할 것이기 때문에, 바로 저장을 하게 하도록 만들었다.
// 아이디 중복 체크 버튼
// id 창에 들어간 데이터를 ajax로 가져옴
// return 1 or 0
@PostMapping("/check/id")
public ResponseEntity<Integer> checkId(@RequestBody String userId){
int trueOrFalse = userService.checkDuplicateId(userId);
return new ResponseEntity<>(trueOrFalse, HttpStatus.OK);
}
// 닉네임 중복 체크 버튼
// nickname 창에 들어간 데이터를 ajax로 가져옴
// return 1(중복) or 0(가능)
@PostMapping("/check/nick")
public ResponseEntity<Integer> checkNick(@RequestBody String userNickName){
int trueOrFalse = userService.checkDuplicateNickName(userNickName);
return new ResponseEntity<>(trueOrFalse, HttpStatus.OK);
}
아이디와 닉네임 중복 체크 버튼 기능이다.
이전 회고록의 설명과 동일하다.
// 아이디 찾기 버튼 클릭시 기능
// ajax로 이름 전화번호 받아와서 해당 아이디 alert로 보여주기
// 후 ajax로 success 후 페이지 이동
// return "login.html";
@PostMapping("/find/id")
public ResponseEntity<String> findId(@RequestBody String userName, @RequestBody String userPhoneNumber){
String userId = userService.findId(userName, userPhoneNumber);
return new ResponseEntity<>(userId, HttpStatus.OK);
}
이름과 전화번호를 파라미터로 받아와서 해당 사용자의 아이디를 반환하는 로직이다.
// 이름과 아이디 파라미터를 받아 비밀번호 변경 페이지로 넘어가기
// html form - post
// return "changePw.html";
@PostMapping("/find/pw")
public ResponseEntity<Optional<UserEntity>> findPw(@RequestParam("userId") String userId,@RequestParam("userName") String userName, HttpSession session ){
Optional<UserEntity> user = userService.findPassword(userId, userName);
Long userIndex = user.get().getUserIndex();
session.setAttribute("userIndex", userIndex);
return new ResponseEntity<>(user, HttpStatus.OK);
}
// 비밀번호 변경 기능
// 수정해야됨
@PostMapping("/change/pw")
public ResponseEntity<Optional<UserEntity>> changePw(HttpSession session, @RequestParam("userPassword") String userPassword){
Long userIndex = (Long) session.getAttribute("userIndex");
Optional<UserEntity> userInfo = userService.findUserInfo(userIndex);
userService.changePassword(userInfo, userPassword);
session.invalidate();
return new ResponseEntity<>(userInfo, HttpStatus.OK);
}
이 부분이 오늘 가장 막혔던 부분이다.
비밀번호 찾기 페이지에서 이름과 아이디를 받아오면 비밀번호 변경 페이지로 넘어가는 부분이다.
비밀번호 찾기 페이지에서 이름과 아이디를 받아와서 다음 페이지에 해당 사용자의 정보를 넘겨야 하는데, 이 방법을 몰랐던 것이다.
그래서 이름과 아이디를 받았을 때 해당 사용자의 정보를 찾고 해당 사용자의 index를 세션에 저장시켜 다음 페이지에 넘기는 것이다.
그 후 비밀번호 변경 페이지에서 해당 세션을 받아와 사용자 정보를 받고, 비밀번호를 받아와 userService의 changePassword 메서드로 비밀번호를 변경한다.
그 후 세션을 유지하면 안되기 때문에 바로 세션을 지워버린다.
// 회원정보 수정 페이지 넘어가기
@GetMapping("/user/edit")
public ResponseEntity<Optional<UserEntity>> UserEdit(HttpSession session, Model model){
Long userIndex = (Long) session.getAttribute("userIndex");
Optional<UserEntity> userInfo = userService.findUserInfo(userIndex);
model.addAttribute("userInfo", userInfo);
return new ResponseEntity<>(userInfo, HttpStatus.OK);
}
회원정보 수정 페이지는 사용자의 정보가 들어가 있을 때만 해당 페이지로 넘어갈 수 있다.
하지만, 회원정보 수정 버튼은 로그인이 되있을 때만 사용할 수 있기 때문에 세션이 있는지에 대한 판별은 하지 않았다.
사용자의 정보를 세션에서 받아와 페이지로 넘기는 작업을 했다.
// 회원정보 수정 버튼 기능
@PostMapping("/user/edit")
public ResponseEntity<Optional<UserEntity>> userEdit(HttpSession session, @ModelAttribute UserDto userDto){
Long userIndex = (Long) session.getAttribute("userIndex");
UserEntity user = userDto.toEntity();
Optional<UserEntity> userInfo = userService.changeUserInfo(userIndex, user);
return new ResponseEntity<>(userInfo, HttpStatus.OK);
}
회원정보를 수정한 뒤, 수정 버튼을 클릭했을 때의 로직이다.
우선 해당 사용자의 정보를 가져오고, 작성된 데이터를 파라미터로 받아온다.
그 후, userService의 changeUserInfo 메서드를 통해 사용자의 정보를 수정한다.
이 때, 수정 할 수 있는 데이터는 이름, 닉네임 그리고 전화번호 밖에 없다.
// 회원 탈퇴 버튼 기능
@DeleteMapping("/user/delete")
public ResponseEntity<String> deleteUserInfo(HttpSession session){
Long userIndex = (Long) session.getAttribute("userIndex");
userService.deleteUserInfo(userIndex);
session.invalidate();
return new ResponseEntity<String>("delete success", HttpStatus.OK);
}
}
마지막으로 회원 탈퇴 버튼이다.
탈퇴버튼을 클릭시 세션에서 사용자 정보를 가져와 삭제 시킨 후 세션도 없앤다.
이렇게 userController 부분도 테스트도 마쳐 마무리 하였다.
오늘은 세션에 대해 좀 알아가는 것 같았다.
로그인 기능은 내가 생각한 것보다 쉬운것 같다.
세션에 대해서 알면 금방 할 수 있는 기능인 것 같다.
하지만, 데이터를 주고 받는 방법에 대해 아직 햇갈려 하는 것 같다.
사실 웹공부를 하면서 가장 중요한 것이 데이터를 주고 받는 것인데, 조금 더 공부를 해서 내것으로 만들어야 한다.
아직 프로젝트 진행 해야 할 것들이 많다.
이미지 저장 기능과, db 한 컬럼에 여러개의 데이터가 들어가게 하는 것, 그리고 댓글 기능까지.
아직 해야할 것이 많긴 하지만 오늘 또 한부분을 클리어 했다는 것에 대해 기분이 좋은 하루 였다.
내일도 빡코딩 해야지!!