본문 바로가기

Spring

[Spring] - 로그인

아 자고 싶다..

 

일단 

@RequestMapping("login.me") 

->들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 것이 @RequestMapping이다.

 

 

 

<header.jsp>

<form action="login.me" method="post">
    <!-- Modal body -->
    <div class="modal-body">
        <label for="userId" class="mr-sm-2">ID : </label>
        <input type="text" class="form-control mb-2 mr-sm-2" placeholder="Enter ID" id="userId" name="userId"> <br>
        <label for="userPwd" class="mr-sm-2">Password : </label>
        <input type="password" class="form-control mb-2 mr-sm-2" placeholder="Enter Password" id="userPwd" name="userPwd">
    </div>

    <!-- Modal footer -->
    <div class="modal-footer">
        <button type="submit" class="btn btn-primary">로그인</button>
        <button type="button" class="btn btn-danger" data-dismiss="modal">취소</button>
    </div>
</form>

 

<MemberController>

Spring에서 값 뽑는 방법

1) HttpServletRequest이용해서 값 뽑기 (JSP/Servlet과 동일)

@RequestMapping("login.me")
public String loginMember(HttpServletRequest request) {

    String userId = request.getParameter("id");
    String userPwd = request.getParameter("pwd");


return "main";
}

 

2) @RequestParam어노테이션으로 값 뽑기

   request.getParameter("키")로 밸류를 뽑아오는 역할을 대신해주는 어노테이션
   value속성의 밸류로 jsp에서 작성했던 name속성값을 담으면 알아서 해당 매개변수를 받아올 수 있다. 
   만약, 넘어온 값이 비어있는 형태라면 defaultValue속성으로 기본값을 지정할 수 있다.

@RequestMapping("login.me")
public String loginMember(@RequestParam(value="id", default="abc") String userId, @RequestParam(value ="pwd") String userPwd) {

	 System.out.println("userId : " + userId);
     System.out.println("userPwd : " + userPwd);
     return "main";

}

3) @RequestParam 어노테이션을 생략하는 방법
 * 단, 매개변수명을 jsp의 name속성값(요청 시 전달하는 값의 키값)과 동일하게 세팅해둬야 자동으로 값이 주입
 * 단점으로는 위에서 사용했던 defaultValue 속성은 사용할 수 없음

@RequestMapping("login.me")
public String loginMember(String id, String Pwd) {

	Member m = new Member();
    
    m.setUserId(id);
    m.setUserPwd(pwd);
    
    return "main";
}

 

4) 커멘드 객체 방식

해당 메서드의 매개변수로
요청 시 전달값을 담고자하는 VO클래스의 타입을 세팅 후 
요청 시 전달값의 키값(jsp의 name속성값)을 VO의 필드명으로 작성

스프링 컨테이너가 해당 객체를 기본생성자로 생성 후 내부적으로 setter메소드를 찾아서 
요청 시 전달값을 해당 필드에 담아줌  == setter주입

**반드시 name속성값과 담고자하는 필드명이 동일해야함 +  기본생성자가 꼭 있어야 함 + setter가 꼭 있어야 함

(jsp의 name속성 값하고 필드명을 같게 해준다.

@RequestMapping("login.me")
public String loginMemer(Member m) {

    Member loginUser = memberService.loginMember(m);

    if(loginUser == null) { //로그인 실패 => 에러문구르르 requestScope에 담고 에러페이지로 포워딩
        System.out.println("로그인실패");
    }else {//로그인 성공 => loginUser를 sessionScope에 담고 메인페이지 url로 요천
        System.out.println("로그인성공");
    }
    return "main";
}

)

 

5)스프링에서 제공 Model객체를 사용하는 방법

 * 포워딩할 응답뷰로 전달하고자 하는 데이터를 맵형식(key-value)으로 담을 수 있는 영역
    * Model객체는 requestScope
    * 단, setAttribute가 아닌 addAttribute메소드를 호출해야함
    * 
    * request를 쓸 수 있지만,
    * Spring에서 제공하는 Model객체를 사용
    *    

 

@RequestMapping("login.me")
	   public String loginMember(Member m, Model model, HttpSession session) {
	      Member loginUser = memberService.loginMember(m);
	      
	      if(loginUser == null) { // 로그인 실패 => 에러문구 requestScope에 담아서 에러페이지로 포워딩
	         model.addAttribute("errorMsg", "에러 발생");
	        
	                포워딩 (파일 경로를 포함한 파일 명을 제시)
	          * 
	          * return "XXX";
	          * servlet-context.xml <- 주소 자동완성을 시켜주는 도구 bean으로 등록해놨음 : View Resolver
	          * - prefix  : /WEB-INF/views/
	          * - 중간 : XXX (== 파일명)
	          * - suffix : .jsp
	          * 
	          * return된 문자열과 결합하면!!!!
	          * /WEB-INF/views/main.jsp
	          * 
	          * 에러페이지로 가려면? 
	          * /WEB-INF/views/'common/errorPage'.jsp
	          * 
	          * common/errorPage만 리턴해주면 됨!!!
	          * 
	          
	         
	         return "common/errorPage";   
	      } else { // 로그인 성공 => loginUser를 SessionScope에 담고 메인페이지로 url 재요청
	         
	         session.setAttribute("loginUser", loginUser);
	         
	         /*
	          * url 재요청방식 == sendRedirect(url경로를 제시)
	          * redirect:요청할 url
	          * 
	         return "redirect:/";
	         //localhost:8007/spring
	      }
	      
	   }

 

6)스프링에서 제공하는 ModelAndView 객체를 사용하는 방법

  * Model은 데이터를 key-value세트로 담을 수 있는 공간이라고 한다면
   * View는 응답뷰에 대한 정보를 담을 수 있는 공간
   * 
   * Model과 View가 결합된 형태의 객체
   * 단, Model 객체는 단독 사용이 가능하지만 View객체는 ModelAndView타입으로만 사용이 가능하다.
   * 

 

 @RequestMapping(value="login.me")
	  public ModelAndView loginMember(Member m, ModelAndView mv, HttpSession session) {
		  
		  Member loginUser = memberService.loginMember(m);
		  
		
		  
		  if(loginUser != null && bcryptPasswordEncoder.matches(m.getUserPwd(),loginUser.getUserPwd())) {
			  session.setAttribute("loginUser",loginUser);
			  mv.setViewName("redirect:/");
			  
		  } else {
			  // model.addAttribute("키","밸류");
			  mv.addObject("errorMsg","응 안돼!");
			  mv.setViewName("common/errorPage");
		  }
		  
		  return mv;
	  }

 

 

--------------------MemberServiceImpl

 

@Override 
	public Member loginMember(Member m) {
		
		//Member loginUser = memberDao.loginMember(sqlSession, m);
		
		// SqlSessionTemplate객체를 bean으로 등록 후 @Autowired
		//스프링이 사용후 자동으로 객체를 알아서 반납시켜주기 때문에
		//내가 더이상 close() 호출할일이 없어진다
		
		return memberDao.loginMember(sqlSession, m);
	}

 

 

---------------------MemberDao-

 

public Member loginMember(SqlSessionTemplate sqlSession, Member m) {
		
		return sqlSession.selectOne("memberMapper.loginMember", m);
	}

 

 

-----MemberMapper

 

<resultMap id="memberResultSet" type="member">
	
		<result column="USER_ID" property="userId" />
		<result column="USER_PWD" property="userPwd" />
		<result column="USER_NAME" property="userName" />
		<result column="EMAIL" property="email" />
		<result column="GENDER" property="gender" />
		<result column="AGE" property="age" />
		<result column="PHONE" property="phone" />
		<result column="ADDRESS" property="address" />
		<result column="ENROLL_DATE" property="enrollDate" />
		<result column="MODIFY_DATE" property="modifyDate" />
		<result column="STATUS" property="status" />
		
	</resultMap>

----

 

<select id="loginMember" parameterType="member" resultMap="memberResultSet">
		
		SELECT
		
				USER_ID,
				USER_PWD,
				USER_NAME,
				EMAIL,
				GENDER,
				AGE,
				PHONE,
				ADDRESS,
				ENROLL_DATE,
				MODIFY_DATE,
				STATUS
				
		FROM
				MEMBER
		WHERE
				USER_ID = #{userId}
				
		  AND
		  		STATUS = 'Y'
		  		
	</select>

'Spring' 카테고리의 다른 글

별점 리뷰 작성하기  (0) 2024.08.24