Spring

Spring(로그인 - 1)

불도정 2023. 4. 25. 21:45

이번엔 로그인을 클릭하면 로그인 정보를 가져오고 그 정보를 session에 저장시켜 유지시키고, 

Redirect가 되어도 속성들을 유지시켜줄수있는 객체를 사용하여 로그인을 유지시키는 코드들을 작성해 볼것이다.

또한 입력한 이메일과 패스워드가 일치하지 않을 시 메세지를 띄워주는 코드들도 작성해볼거다.

 

 

먼저  MemberController 클래스이다

package edu.kh.comm.member.controller;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import edu.kh.comm.member.model.service.MemberService;
import edu.kh.comm.member.model.vo.Member;

@Controller

@RequestMapping("/member")

@SessionAttributes({"loginMember", "message"}) // Model에 추가된 값의 key와 어노테이션에 작성된 값이 같으면
									// 해당 값을 session scope로 이동시키는 역할
public class MemberController {
	
	private Logger logger = LoggerFactory.getLogger(MemberController.class);
	
	@Autowired
	private MemberService service; 

	@PostMapping("/login")
	public String login( @ModelAttribute Member inputMember,
						Model model,
						RedirectAttributes ra,) {
		
		// RedirectAttributes -> 리다이렉트 후에도 속성들 유지시켜줌
		logger.info("로그인 기능 수행됨");
		logger.debug(inputMember.getMemberEmail());
		logger.debug(inputMember.getMemberPw());
		
		// 아이디, 비밀번호가 일치하는 회원 정보를 조회하는 service 호출 후
		// 결과 반환 받기.
		
		Member loginMember = service.login(inputMember);
		
		/* Model : 데이터를 맵 형식(K:V) 형태로 담아 전달하는 용도의 객체
		 * ->  request, session 을 대체하는 객체
		 * 
		 * - 기본 scope : request
		 * - session scope로 변환하고 싶은 경우
		 *  클래스 레벨로 @SessionAttributes 를 작성하면 된다.
		 */
		
		if(loginMember != null) { // 로그인 성공시
        
			model.addAttribute("loginMember", loginMember);
            
		} else {
        
		//	model.addAttribute("message", "아이디 또는 비밀번호가 일치하지 않습니다.");
			ra.addFlashAttribute("message", "아이디 또는 비밀번호가 일치하지 않습니다.");
		}
		
		return "redirect:/";
	}
	

}

먼저 login메소드 안에 로그인 정보를 담을 inputMember, 데이터를 맵 형식으로 받을 Model, 리다이렉트 하고도 속성을

유지 시켜줄 수 있는 RedirectAttributes를 담아준다.

여기서 Model에 대해 좀더 알아보자

 

- Model : 데이터를 맵 형식(K:V) 형태로 담아 전달하는 용도의 객체
   ->  request, session 을 대체하는 객체
   - 기본 scope : request
   ->session scope로 변환하고 싶은 경우 클래스 레벨로 @SessionAttributes 를 작성하면 된다.

 

다음은 DAO클래스이다

package edu.kh.comm1.member.model.dao;

import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import edu.kh.comm1.member.model.vo.Member;

@Repository
public class MemberDAO {
	
	@Autowired
	private SqlSessionTemplate sqlSession;
	
	private Logger logger = LoggerFactory.getLogger(MemberDAO.class);
	
	public Member login(Member inputMember) {
		
		// 1행 조회(파라미터VO, 반환되는 결과 VO)
		Member loginMember = sqlSession.selectOne("memberMapper.login", inputMember);
		
		return loginMember;
	}

}

 

다음은 service이다

 

package edu.kh.comm1.member.model.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import edu.kh.comm1.member.model.dao.MemberDAO;
import edu.kh.comm1.member.model.vo.Member;

@Service
public class MemberServiceImpl implements MemberService {
	
	@Autowired
	private MemberDAO dao;
	
	@Override
	public Member login(Member inputMember) {
		
		Member loginMember = dao.login(inputMember);
		return loginMember;
	}
}

service클래스에서 달리진건 loginMember를 리턴해준다는거 정도...

 

 <select id="login" parameterType="member" resultMap="member_rm">
	   		SELECT MEMBER_NO,MEMBER_EMAIL,MEMBER_NICK ,MEMBER_TEL,
    	MEMBER_ADDR, PROFILE_IMG, 
    	TO_CHAR( ENROLL_DT, 'YYYY-MM-DD HH24:MI:SS') AS ENROLL_DT
		FROM MEMBER_S
		WHERE MEMBER_EMAIL = #{memberEmail}
		AND MEMBER_PW = #{memberPw}
		AND SECESSION_FL = 'N'
	   		
	   </select>

member-mapper.xml에 <select>태그이다.

 

그리고 서버를 실행해보면

로그인이 잘 되었다!

 

다음편에 이어서 해보겠다.