#해야 할 일
로그인 후에는 내비바에 로그인된 회원의 username 이 보여야 한다.
내 정보 페이지 임시 구현
- 이름
- 가입날짜
로그인 된 회원의 username의 경우 로그인시에 세션에 저장되어 있기 때문에 그냥 가져올 수 있지만, 회원의 번호와 가입날짜의 경우에는 들어있지 않다.
@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";
}
이렇게 하면 내 정보를 네비바에 보여줄 수는 있는데 이렇게 되면 homeController가 memberService에 요청을 계속해야하는 상황이 발생하다보니
이 부분이 좋은 아이디어로 느껴졌다.
RequestScope 어노테이션을 통해서 매 요청마다 한번씩만 만들어지게 진행
@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;
}
}
저 부분들을 전부 관리해주기 때문에 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>