상품 등록 및 수정하는 사이트에서
사용자의 정보 ( id, pw ) 를 가져오고
Cookie 와 Session 에 담아 회원가입 / 로그인 / 로그아웃 기능을 구현
사용자가 회원가입할 때 입력한 정보를 담는 클래스
@Data
public class Member {
/*
* 로그인 사용자의 정보를 담을 자바 클래스
* ID 넘버 , 회원 ID, 회원 이름, 회원 패스워드
*/
private Long id;
private String loginId;
private String name;
private String password;
}
사용자의 요청처리 중 회원가입 업무를 담당하는 컨트롤러 영역
Thymeleaf를 통해 사용자가 입력한 정보를 가져오고
Repository에 저장 한 후 페이지를 새로고침하여 회원가입을 완료한다.
@Controller
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
private final MemberRepository memberRepository;
/*
* 1. 멤버 회원등록 ( addForm )
* "/member/add" 의 사용자 요청을 받으면
* "members/addMemberForm" 으로 이동하고
* 사용자가 입력폼에 입력한 값을
* memberRepository.save 통해 로그인 멤버 정보 저장
*
* 정보 저장이 완료되면 redirect 실행
*/
@GetMapping("/add")
public String addForm( @ModelAttribute("member") Member member) {
return "members/addMemberForm";
}
@PostMapping("/add")
public String save( @ModelAttribute Member member) {
memberRepository.save(member);
return "redirect:/";
}
}
컨트롤로 영역에서 사용자가 요청한 데이터를 담는 레포지토리 영역
HashMap 타입으로 정보를 담아오고 회원가입이 완료되면
회원 아이디를 sequence++ 통해 고유 id를 서버 영역에 저장한다.
( ❗ 중복회원가입을 방지하기 위함 )
@Repository
public class MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
/*
* 1. 멤버 회원등록
* Member DTO 값을 HashMap 타입으로 변환하고
* 사용자가 입력한 데이터를 MemberDTO 에 저장
* ( ! 중복회원을 방지하기 위해 sequence++ 추가 )
*/
public Member save(Member member) {
member.setId(sequence++);
store.put(member.getId(), member);
return member;
}
/*
* 2. 로그인 하기
*
* 사용자의 로그인 정보를 LoginController -> LoginService 통해
* 받아오고, 해당 로그인 정보가 일치한지 검증하는 로직
*
* MemberRepository 에서 사용자가 입력한 String LoginId 값을
* 통해 전체 조회하고
*
* 조회한 값 = 사용자가 입력한 값이 일치한다면
* 해당 정보를 리턴
*/
public Member findById(Long id) {
return store.get(id);
}
public List<Member> findAll(){
return new ArrayList<Member>(store.values());
}
public Member findByLoginId(String loginId) {
List<Member> all = findAll();
for( Member m : all) {
if (m.getLoginId().equals(loginId)) {
return m;
}
}
// 사용자가 입력한 값이 일치하지 않는다면
// null 값 리턴
return null;
}
}
사용자의 로그인 정보 ( id , pw ) 를 담는 클래스
@Data
public class LoginForm {
>
private String loginId;
private String password;
}
@Controller
@RequiredArgsConstructor
public class LoginController {
private final LoginService loginService;
/*
* 1. 로그인 으로 이동
* 사용자가 "login" URI 에서 요청시
* "login/loginForm" 위치로 이동
*/
@GetMapping("login")
public String loginForm(@ModelAttribute("loginForm") LoginForm loginform) {
return "login/loginForm";
}
/*
* 2-1. 로그인 하기
*
* Cookie 사용 시
*/
// @PostMapping("/login")
public String login (@ModelAttribute LoginForm form,
Model model, RedirectAttributes redirectAttributes, HttpServletResponse response) {
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
// 로그인 실패 시 - "login/loginForm" 으로 이동
if ( loginMember == null) {
model.addAttribute("msg", "로그인 실패");
return "login/loginForm";
}
// 로그인 성공 시
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);
redirectAttributes.addFlashAttribute("msg", "로그인 성공");
return "redirect:/";
}
/*
* 2-2 로그인 하기
* Session 사용시
*/
// @PostMapping("/login")
public String login2(@ModelAttribute LoginForm form,
Model model, RedirectAttributes redirectAttributes, HttpServletRequest req) {
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
// 로그인 실패
if( loginMember == null) {
model.addAttribute("msg", "로그인 실패");
return "login/loginForm";
}
// 로그인 성공
HttpSession session = req.getSession();
// 세션에 로그인 회원 정보 보관
session.setAttribute( SessionConst.LOGIN_MEMBER, loginMember);
redirectAttributes.addFlashAttribute("msg", "로그인 성공");
return "redirect:/";
}
@PostMapping("/login")
public String login3 (@ModelAttribute LoginForm form,
Model model, RedirectAttributes redirectAttributes
, HttpServletRequest req
, @RequestParam(defaultValue = "/")String redirectURL) {
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
// 로그인 실패
if( loginMember == null) {
model.addAttribute("msg", "로그인 실패");
return "login/loginForm";
}
// 로그인 성공
HttpSession session = req.getSession();
session.setAttribute( SessionConst.LOGIN_MEMBER, loginMember);
redirectAttributes.addFlashAttribute("msg", "로그인 성공");
return "redirect:/";
}
/*
* 3-1. 로그아웃 ( 쿠키 사용 )
* 로그아웃 시 이전화면 이동 + 동시에 쿠키 값 리셋
*/
// @PostMapping("/logout")
public String logout( HttpServletResponse response) {
// cookie 안에 memberId 에 null 을 할당
Cookie cookie = new Cookie("memberId", null);
cookie.setMaxAge(0);
response.addCookie(cookie);
return "redirect:/";
}
/*
* 3-2 로그아웃 ( 세션 사용 )
*
* 로그아웃 시 이전 화면 이동 + 동시에 세션 값 삭제
*/
@PostMapping("/logout")
public String logout2( HttpServletRequest req) {
/*
* req.getSession(true)
* 세션이 있으면 기존 세션을 반환
* 단, 세션이 없으면 새로운 세션을 생성해서 반환한다
*
* req.getSession(false)
* 세션이 있으면 기존 세션을 반환
* 세션이 없으면 새로운 세션을 생성하지 않고 null 로 반환
*/
HttpSession session = req.getSession(false);
// 만약 session이 삭제 되지 않는다면
// 세션 무효화 = .invalidate() 통해 삭제
if( session != null) {
session.invalidate();
}
return "redirect:/";
}
}
@Service
@RequiredArgsConstructor
public class LoginService {
// loginService date -> MemberRepository 로 이동
private final MemberRepository memberRepository;
/*
* 2. 로그인 하기
* 로그인 Controller 영역에서 사용자가 입력한
* id, pw 가 일치하면 해당 값을 MemberRepository 에 가져와
* 반환 동시에 로그인 성공을 리턴
*
* 만약 사용자 정보 != MemberRepository 정보가 일치하지 않는다면
* null 값 리턴
*/
public Member login(String loginId, String password) {
Member member = memberRepository.findByLoginId(loginId);
// 로그인 성공시
if ( member != null && member.getLoginId().equals(loginId)) {
return member;
//로그인 실패 시
}else {
return null;
}
}
}