TACO 프로젝트 회고록(2023-04-25)

윤현우·2023년 4월 25일
0

TACO 프로젝트 회고록

목록 보기
15/31
post-thumbnail

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 한 컬럼에 여러개의 데이터가 들어가게 하는 것, 그리고 댓글 기능까지.

아직 해야할 것이 많긴 하지만 오늘 또 한부분을 클리어 했다는 것에 대해 기분이 좋은 하루 였다.

내일도 빡코딩 해야지!!

profile
개발자가 되는 그날까지

0개의 댓글