2023-04-24 월
오늘은 userController 부분을 공부해 보았다.
요번 프로젝트가 로그인 기능을 구현하는게 처음이다 보니, 아직 어렵다.
어떠한 방식으로 로그인 기능이 구현되는지는 알겠지만, 아직 처음이다 보니 많이 미숙한 것 같다.
그리고 처음 해보는 것인데 너무 빨리 해보려 하다보니 과부하가 온것 같다.
이럴때는 주변에 멘토가 있었으면 참 좋겠다는 생각이 들었다.
또한, 아직 userController에 대한 테스트를 진행하지 못하였다.
조금 완벽하게 작성한 후 PostMan으로 테스트를 돌릴 예정이다.
// 로그인 페이지 넘어가기
@GetMapping("/login")
public String loginPage(HttpSession session){
Long userIndex = (Long) session.getAttribute("userIndex");
if(userIndex != null){
return "redirect:/";
}
return "login";
}
가장 먼저 로그인 페이지로 넘어가게 하는 로직이다.
먼저 세션에서 사용자의 index를 가져와서 해당 userIndex가 있으면 로그인이 되어있는 상태이기 때문에 메인 페이지로 넘어가고, 없다면 로그인 페이지로 넘어가게 한다.
// 로그인 페이지에서 로그인 버튼 클릭시 실행
// html form - post
// return "redirect:/login";
@PostMapping("/login")
public ResponseEntity<Long> login(@RequestParam("userId") String userId,@RequestParam("userPassword") String userPassword, HttpSession session){
Long userIndex = userService.login(userId, userPassword);
if(userIndex == null){
return new ResponseEntity<>(userIndex, HttpStatus.BAD_REQUEST);
// return "redirect:/login";
}
session.setAttribute("userIndex", userIndex);
return new ResponseEntity<>(userIndex, HttpStatus.OK);
// return "redirect:/";
}
로그인 페이지에서 로그인 버튼을 누르면 실행되는 로직이다.
만약 해당 아이디와 비밀번호를 가진 사용자가 없다면 다시 로그인페이지로 넘어가고, 있다면 해당 사용자 index를 세션에 저장시킨후 메인 페이지로 넘어가게 한다.
여기서 사용자 데이터 전체를 세션에 저장하는 것이 아니라 index만 저장하는 이유는 세션은 정보가 쉽게 노출되기 때문에 비밀번호가 유출될 수 있기 때문에 index만 저장한다.
// 로그아웃 기능
@PostMapping("/logout")
public String logout(HttpSession session){
session.invalidate();
return "redirect:/";
}
다음 로직은 로그아웃 기능이다.
invalidate메서드로 세션을 없앤 후 메인페이지로 redirect 한다.
// 회원가입 페이지 넘어가기
@GetMapping("/signup")
public String signupPage(){
return "signup";
}
해당 로직은 회원 가입페이지로 넘어가는 로직이다.(쉬워서 패스)
// 회원가입 기능
// 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);
}
회원 가입 버튼을 눌렀을 때 사용하는 로직이다.
회원 가입은 form 태그를 사용해 데이터를 보낼 것이다.
그래서 @ModelAttribute 어노테이션을 생략하여 userDto를 모델에 추가 시킨후 데이터베이스에 저장 시킨다.
이후 로그인 페이지로 넘긴다.
// 아이디 중복 체크 버튼
// 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);
}
회원가입 시 필요한 아이디, 닉네임 중복체크 버튼 기능이다.
아이디와 닉네임을 가져와 service클래스의 중복 체크 메서드를 이용해 중복 체크를 한다.
이 때는 ajax로 데이터를 받아 반환값을 보낼 것이다.
1이나 0을 반환값으로 받아와 중복인지 아닌지 js로 체크할 것이다.
// 아이디 찾기 페이지 넘어가기
@GetMapping("/find/id")
public String findIdPage(){
return "findid";
}
로그인 페이지에서 아이디 찾기 버튼을 눌렀을 때 페이지를 넘기는 로직이다.
// 아이디 찾기 버튼 클릭시 기능
// 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);
}
아이디 찾기 로직도 ajax로 데이터를 받아와 아이디를 찾고 반환할 것이다.
ajax로 데이터를 보내기 때문에 @RequestBody를 사용했다.
// 비밀번호 찾기 페이지 넘어가기
@GetMapping("/find/pw")
public String findPwPage(){
return "findpw";
}
로그인 페이지에서 비밀번호 찾기 버튼을 눌렀을 때 페이지를 넘기는 로직이다.
// 이름과 아이디 파라미터를 받아 비밀번호 변경 페이지로 넘어가기
// html form - post
// return "changePw.html";
@PostMapping("/find/pw")
public ResponseEntity<Optional<UserEntity>> findPw(@RequestParam("userId") String userId,@RequestParam("userName") String userName, Model model){
Optional<UserEntity> user = userService.findPassword(userId, userName);
//model에 비밀번호 변경할 정보 담아서 보내고
model.addAttribute("user", user);
return new ResponseEntity<>(user, HttpStatus.OK);
}
일단은 해당 로직은 html form태그로 데이터를 받을 것이다. 원래는 게시글들은 form태그를 사용하여 데이터를 보낼것이었는데 아이디 비밀번호 데이터를 보내는 것 때문에 상의를 해보아야 할것 같다.
// 비밀번호 변경 기능
// 수정해야됨
@PostMapping("/change/pw")
public ResponseEntity<UserEntity> changePw(@RequestParam("userPassword") String userPassword){
return null;
}
해당 로직은 아직 어떤 방식으로 사용자 정보를 가져와서 수정해야될지 모르겠어서 남겨두었다.
// 회원정보 수정 페이지 넘어가기
@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);
}
회원정보 수정 페이지로 넘어가는 것은 로그인이 되어있는 상태에서 들어갈 수 있기 때문에, 세션을 가져와 사용자 정보를 넘기게 만들었다.
세션이 없을 때는 애초에 수정 페이지를 들어갈 수 없기 때문에 만들지 않았다.
// 회원정보 수정 버튼 기능
// 회원 탈퇴 버튼 기능
@DeleteMapping("/user/delete")
public ResponseEntity<String> deleteUserInfo(HttpSession session){
Long userIndex = (Long) session.getAttribute("userIndex");
userService.deleteUserInfo(userIndex);
return new ResponseEntity<String>("delete success", HttpStatus.OK);
}
}
아직 수정 버튼 기능은 만들지 않았다.
회원탈퇴 버튼도 세션이 없으면 버튼이 생성되지 않기 때문에 세션 유무를 확인하지 않았다.
세션을 가져와 지우고 다시 메인 페이지로 넘길 것이다.
로그인 기능 구현은 처음이다 보니 아직 구체적으로 잡히지 않고 뭔가 흐지부지 되는 듯한 느낌이 든다.
사실 userController 코드를 작성하면서 많은 고뇌에 빠졌었다.
어느 부분에서 세션 확인을 해야되고, 어떤 방식으로 데이터를 보내고 받고, 등등 많은 고민을 하고 있고, 아직도 하고있다.
이런 생각이 들면 아직 내가 공부를 덜 한 것이라고 판단하게 된다.
좋은 말로는 자기객관화가 잘된거고, 나쁜 말로는 부정적인 생각만 하는 것이다.
아직 배워야 할게 많은 것 같다.
앞으로 공부를 더 열심히 해야할 것 같다.