그램그램 - 내 정보(임시) 추가

JIWOO YUN·2024년 5월 14일
0

GramGram

목록 보기
4/11
post-custom-banner
#해야 할 일
로그인 후에는 내비바에 로그인된 회원의 username 이 보여야 한다.
내 정보 페이지 임시 구현
- 이름
- 가입날짜

로그인 된 회원의 username의 경우 로그인시에 세션에 저장되어 있기 때문에 그냥 가져올 수 있지만, 회원의 번호와 가입날짜의 경우에는 들어있지 않다.

  • 이동할 때마다 가져와야함.
  • findByUsername을 통해서 현재 객체를 찾아와서 model에 넣어서 보내준걸 토대로 나오게
@GetMapping("/")
public String showMain(Model model, Principal principal) {
    if (principal != null) {
        Member member = memberService.findByUsername(principal.getName()).orElseThrow();
        model.addAttribute("member", member);
    }
    return "home/main";
}
  • 메인 홈에서도 만약 로그인 상태라면 내 이름과 번호 생성날짜가 보이게 하기 위해서 memberService를 연결하여 찾아와서 model에 넣어서 보내준다.

이렇게 하면 내 정보를 네비바에 보여줄 수는 있는데 이렇게 되면 homeController가 memberService에 요청을 계속해야하는 상황이 발생하다보니

Rq(Request)를 만들어서 request와 response,session,cookie, 현재 로그인된 유저 정보와 권한을 관리할 수 있게.

  • 이 부분이 좋은 아이디어로 느껴졌다.

    • 정보를 관리하는데에 한 곳에서 이 부분을 전부 관리해준다면 관리하기 편할 거같아서
  • RequestScope 어노테이션을 통해서 매 요청마다 한번씩만 만들어지게 진행

    • 요청이 끝나면 사라진다.

Rq 코드 부분

@Component
@RequestScope
public class Rq {

    private final MemberService memberService;
    private final HttpServletRequest req;
    private final HttpServletResponse resp;
    private final HttpSession session;

    private final User user;

    private Member member = null;

    public Rq(MemberService memberService, HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
        this.memberService = memberService;
        this.req = req;
        this.resp = resp;
        this.session = session;

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        if (authentication.getPrincipal() instanceof User) {
            this.user = (User) authentication.getPrincipal();
        } else {
            this.user = null;
        }


    }

    public boolean isLogin() {
        return user != null;
    }

    public boolean isLogout() {
        return !isLogin();
    }

    public Member getMember() {
        if (isLogout()) return null;

        if (member == null) {
            member = memberService.findByUsername(user.getUsername()).orElseThrow();
        }
        return member;
    }
}
  • member 의 경우 null 상태로 유지한다음 값을 가져오는 이유
    • 지연 로딩 이용
    • 필요할때만 로딩할 수 있게

저 부분들을 전부 관리해주기 때문에 HomeController에 현재 MemberService를 가져올 필요가 없기 때문에 제거

@GetMapping("/")
public String showMain() {
    return "home/main";
}

내 정보 페이지

<head>
    <title>내 정보</title>
</head>

<body>

<main layout:fragment="main">
    <div sec:authorize="isAuthenticated()" th:text="|${#authentication.principal.username}님 환영합니다.|"></div>
    <div sec:authorize="isAuthenticated()">당신의 회원번호는 [[${@rq.member.id}]]번입니다.</div>
    <div sec:authorize="isAuthenticated()">당신은 [[${@rq.member.createDate}]]에 가입하셨습니다.</div>
</main>
</body>
  • rq을 통해서 로그인된 member의 정보를 가져오기 때문에 마찬가지로 /member/me에서도 model을 통해서 member를 넣어줄 필요가없어졌다.

진행된 PR 부분

profile
열심히하자
post-custom-banner

0개의 댓글