1. 먼저 멤버테이블에서 email(식별자) 을 기반으로 멤버 엔티티를 가져오는 repository에 메소드를 작성한다. 로그인할 때 사용할 것이다.
1) @EntityGraph 속성 : 일대 다 , 혹은 컬렉션객체를 멤버변수로 가지고 있을 경우, 그 멤버변수의 갯수만큼 jpa는 select를 날린다. 비효율적이기 때문에 이러한 어노테이션을 이용하면 join으로 한번에 가져올 수 있다.
2) 소셜로그인 유저에 대해서는 따로 처리할 것이기 때문에 boolean fromSocial이라는 파라메터도 추가로 넣어준다.
3) 위에서는 빠뜨렸지만 @Param어노테이션으로 파라메터를 확실히 명시해주는게 좋다. jpa는 똑똑해서 잘 받아오긴 하지만서두~
2. ClubMemberDTO를 추가한다. 이것은 화면에 보여줄그릇(dto)역할이자, UserDetails 역할을 하게된다. UserDetails를 구현한 클래스를 이미 스프링이 준비해두고 있으므로 , 이 중 하나인 User라는 클래스를 extends해서 생성자 오버라이딩 해주자.
entity 와 DTO의 영역을 따로 구분하기 위해 이러한 클래스를 만들었다.
만약 마이바티스같은 맵퍼를 이용한다면 has a로 구현할 수도 있을것이다. ( User를 extends하는 DTO클래스를 만들고, 실제 ClubMember 타입을 멤버변수로 가져서 -> clubmember의 생성자를 만들어준다던지... 중간역할? 이건 나중에 필요할 때 더 생각하자. )
3. UserDetailsService를 구현하는 클래스를 작성한다.
이 클래스를 구현하려면 loadByUsername이라는 메소드를 작성해야한다.
repository에서 유저 정보를 찾아오고 -> 찾아온 유저정보를 기반으로 로그인을 시도하는 유저가 존재하는지 아닌지 검사 ( 없으면 exception을 날린다)
4. 유저가 존재하는 경우 해당 유저의 정보를 entity클래스에서 뽑아내서 UserDetails타입을 구현한 User타입의 ClubMemberDTO로 변환한다. 이 클래스는 화면에 보여줄 그릇이자 - UserDetails타입을 충성히 수행한다! 얏호.
특히 SimpleGrantedAuthority 라는, GrantedAuthority를 구현한 클래스로 Role을 변환해서 넣어준다. (람다식의 map이용해서 role이 여러개인경우에도 대비)
/sample/member페이지 접속 시도시 스프링시큐리티에서 자동으로 설정해 둔 로그인 창이 뜨며 성공적으로 로그인하면 위와같이 멤버 페이지를 확인할 수 있다.






댓글 없음:
댓글 쓰기