WIL 5주차 스프링부트!

session 활용하기

  session.setAttribute("logInUserInfo", userId);
  int id = (int) session.getAttribute("logInUserInfo");
  • 이런식으로 set, get을 이용하여 세션에 원하는 값을 저장할 수 있다.
  • logInUserInfo 이름으로 세션을 저장해서 당연히 session에도 이러한 이름을 가진 값이 있을거라고 생각했는데

    JSESSIONID=70F70A07DC4EB4899A82EE3A67467CD0; 이런식으로 전혀 이해할 수 없는 값이 저장되어 있었다.

    아직 찾아보지는 못했지만 암호화 인 것 같은데 한번 찾아봐야 겠다.

user nickname 바꾸기

  • 처음 nickname 관련 코드를 만들어볼때 들어오는 값은 nickname 하나인데 또 관련 dto를 생성해야 하나 고민했다.
  • 하나가 들어오는데 return type 을 맞추기 위해서 새로운 dto 생성을 해야한다는게 매우 불필요하다고 생각했었다.

    어떤 키워드로 검색을 해야할지도 모르겠어서 고민하다가 리드님 깃을 보게 되었고 매우 간단한 방법을 알게 되었다.

    if(userRepository.existsUserByNickname(nickName)){
      return Optional.empty();
    //~생략
    return Optional.of(user);
  • Optional.of / .empty()로 간단하게 구현이 가능했다..
  • controller 부분에서 isEmpty() 함수로 간단하게 체크 가능할 수 있어서 더 깔끔하고 편리한 코드라고 생각이 들었다.

login 구현하기

람다식의 return

  • 저번주에 배웠던 message 값이 ““인지 아닌지로 값이 제대로 들어왔는지 판단했던것과 같이
  • session을 만드는데 필요한 user_id를 0인지 아닌지로 판단하여 로그인을 구현하고 싶었다.
      public int login(LoginDto loginDto){
      Optional<User> user = userRepository.findByUserId(loginDto.getUserId());
      user.ifPresent(getUser->{
          return getUser.getId();
      })
    
  • 이와 같이 만약 DB에 일치하는 유저가 있다면 user의 id만 return하게 만들고 싶었는데 return 타입이 맞지 않다는 오류가 나왔다.
  • 한참을 고민해본 결과 ifPresent 내부의 람다식에 return을 했기 때문에 login함수에 return을 해주는게 아니였다.

passwordEncoder match

  • 또한 비밀번호를 확인하기 위해서는 들어온 비밀번호를 먼저 one way hash func에 넣은 후 나온 값과 비교해야 한다고 생각했는데 매우 잘못된 생각이였다.
  • 당연하게도 유저들중에는 같은 비밀번호를 쓰는 사람이 있을것이고 같은 비밀번호에 대해서 같은 hash 값이 나온다면 보안에 취약해지기 때문에 같은 비밀번호라도 다른 비밀번호가 나와야 한다.
  • 그래서 비밀번호를 확인하기 위한 함수를 통해 확인해야 했다.
  •     boolean checkPassword = passwordEncoder.matches(loginDto.getPassword(), getUser.getPassword());
    
  • 위의 두가지 문제를 해결한 뒤 다음과 같은 코드가 나왔다.
  •     public int login(LoginDto loginDto){
            Optional<User> user = userRepository.findByUserId(loginDto.getUserId());
            if (user.isPresent()){
                User getUser = user.get();
                boolean checkPassword = passwordEncoder.matches(loginDto.getPassword(), getUser.getPassword());
                if (checkPassword){
                    return getUser.getId();
                }
                else{
                    return 0;
                }
            }
            return 0;
    }
    
  • 0이 나온다면 로그인이 되지 않은 것이고 0 외의 값이 나왔다면 DB에 있다는 뜻이기 때문에 정상적으로 로그인이 진행된다.

미흡한 부분

  • 아직 board 부분 API 2가지를 구현하지 못했다.. 생각보다 return type 맞추는게 어려웠다,,

다음 목표

  1. JSESSIONID 생성 규칙? 찾아보기
  2. Board 부분 완성 못한 2가지 진행