Spring Boot - 회원가입 / 로그인

UnKnown12·2023년 1월 26일
0

📌 개요

상품 등록 및 수정하는 사이트에서
사용자의 정보 ( id, pw ) 를 가져오고
Cookie 와 Session 에 담아 회원가입 / 로그인 / 로그아웃 기능을 구현

📌 Member

사용자가 회원가입할 때 입력한 정보를 담는 클래스

@Data
public class Member {

	/*
	 *  로그인 사용자의 정보를 담을 자바 클래스 
	 *  ID 넘버 , 회원 ID, 회원 이름, 회원 패스워드 
	 */
	
	private Long id;
	private String loginId;
	private String name;
	private String password;
}

📌 MemberController

사용자의 요청처리 중 회원가입 업무를 담당하는 컨트롤러 영역
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:/";
	}
}

📌 MemberRepository

컨트롤로 영역에서 사용자가 요청한 데이터를 담는 레포지토리 영역
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;
	}

}

📌 LoginForm

사용자의 로그인 정보 ( id , pw ) 를 담는 클래스

@Data
public class LoginForm {
>
	private String loginId;
	private String password;
} 

📌 LoginController

@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:/";
	}
}

📌 LoginService

@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;
		}
	}

}
profile
Hyobin12

0개의 댓글