Spring

로그인 페이지 만들기

검정콩 2022. 5. 23. 17:29

1. Controller 만들기

@Autowired MemberService service;
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Model model) {
		logger.info("로그인 페이지");
		return "login";
	}

	@RequestMapping(value = "/joinForm")
	public String joinForm(Model model) {
		logger.info("회원가입 페이지1");
		return "joinForm";
	}
	
	@RequestMapping(value = "/join", method = RequestMethod.POST)
	public String join(Model model, HttpServletRequest request) {
		logger.info("회원가입 페이지");
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		logger.info(id+"/"+pw+"/"+name+"/"+email);
		
		//join 하고나면 메시지 주기
		String msg = service.join(id,pw,name,email);
		logger.info(msg);
		model.addAttribute("msg", msg);
		return "login";
	}
	
	@RequestMapping(value = "/login")
	public String login(Model model, HttpServletRequest request) {
		logger.info("로그인 페이지");
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		logger.info(id+"/"+pw);
		String loginId = service.login(id,pw);
		logger.info("로그인 아이디 : "+loginId);
		
		String msg = "아이디 또는 비밀번호를 확인하세요";
		String page = "login";
		
		if(loginId != null) {
			HttpSession session = request.getSession();
			session.setAttribute("loginId", loginId);
			//로그인 성공시 컨트롤러에 list 보여달라 요청
			page = "redirect:/list";
		} else {
			model.addAttribute("msg",msg);
		}
		return page;
	}
	
	@RequestMapping(value = "/list")
	public String list(Model model, HttpServletRequest request) {
		
		//로그인한 사용자가 아니면 login 으로 보냄
		String page = "main";
		HttpSession session = request.getSession();
		if(session.getAttribute("loginId") == null) {
			page = "login";
			model.addAttribute("msg", "로그인이 필요한 서비스입니다");
		} else {
			//값을 여러개 담기 위해 ArrayList 사용
			ArrayList<MemberDTO> list = service.list();
			logger.info("list 갯수 : "+list.size());
			model.addAttribute("list",list);
		}
		
		return page;
	}
	
	@RequestMapping(value = "/logout")
	public String logout(HttpSession session) {
		session.removeAttribute("loginId");
		return "login";
	}
	
	@RequestMapping(value = "/delete")
	public String delete(Model model, HttpServletRequest request) {
		String id = request.getParameter("id");
		logger.info("삭제 요청 : "+id);
		service.delete(id);
		
		return "redirect:/list";
	}
	
	@RequestMapping(value = "/detail")
	public String detail(Model model, @RequestParam String id) {
		logger.info("상세보기 할 아이디 : "+id);
		MemberDTO info = service.detail(id);
		logger.info("pw : "+info.getPw());
		logger.info("email : "+info.getEmail());
		model.addAttribute("info",info);
		
		return "detail";
	}
	
	@RequestMapping(value = "/update")
	public String update(Model model, HttpServletRequest request) {
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		logger.info(id+"/"+pw+"/"+name+"/"+email);
		service.update(id,pw,name,email);
		return "redirect:/detail?id="+id;
	}
}

원래는 다른 클래스도 왔다갔다 해야하는데, 편의상 코드를 한번에 올렸다.

실제로 코드를 작성할때는 기능 하나씩 만들고 에러뜨나 실행해보고 하면서 해야한다.

 

 

2. Service 만들기

@Service
public class MemberService {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired MemberDAO dao;
	
	public String join(String id, String pw, String name, String email) {
		logger.info("서비스 도착");
		
		String msg = "회원가입에 실패했습니다.";
		if(dao.join(id,pw,name,email) > 0) {
			msg = "회원가입에 성공했습니다.";
		}
		return msg;
	}

	public String login(String id, String pw) {
		logger.info("서비스 도착");
		return dao.login(id,pw);
		
	}

	public ArrayList<MemberDTO> list() {
		logger.info("리스트 요청 서비스");
		return dao.list();
	}

	public void delete(String id) {
		logger.info("삭제 서비스 도착");
		int success = dao.delete(id);
		logger.info("삭제된 데이터 수 : "+success);
	}

	public MemberDTO detail(String id) {
		logger.info(id+" 의 상세정보 DB 에 요청");
		return dao.detail(id);
	}

	public void update(String id, String pw, String name, String email) {
		logger.info(id+" 의 수정 DB 에 요청");
		int row = dao.update(id,pw,name,email);
		logger.info("수정한 데이터의 수 : "+row);
	}

dao와 dto 로 요청을 보낼 service를 만들어준다.

 

 

3. db와 연결해주는 인터페이스인 dao를 만들어준다.

public interface MemberDAO {

	int join(String id, String pw, String name, String email);

	String login(String id, String pw);

	ArrayList<MemberDTO> list();

	int delete(String id);

	MemberDTO detail(String id);

	int update(String id, String pw, String name, String email);

}

이걸 안만들어주면 db에 데이터를 넣고 가져오는 작업이 불가능하다.

 

 

4. 데이터를 한꺼번에 담아서 들고다니는 클래스인 dto 를 만들어준다.

public class MemberDTO {

	private String id;
	private String pw;
	private String name;
	private String email;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}

getter와 setter를 생성해주었다.

 

 

5. 요청을 db가 실행할 수 있도록 쿼리문을 작성해준다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.member.dao.MemberDAO">
	<insert id="join">
		INSERT INTO member(id,pw,name,email)
		VALUES(#{param1},#{param2},#{param3},#{param4})
	</insert>
	
	<select id="login" resultType="String">
		SELECT id FROM member
		WHERE id = #{param1} AND pw = #{param2}
	</select>
	
	<select id="list" resultType="com.test.member.dto.MemberDTO">
		SELECT id,pw,name,email FROM member
	</select>
	
	<delete id="delete" parameterType="String">
		DELETE FROM member WHERE id = #{id}
	</delete>
	
	<select id="detail" resultType="com.test.member.dto.MemberDTO" 
	parameterType="String">
		SELECT * FROM member WHERE id = #{id}
	</select>
	
	<update id="update">
		UPDATE member SET
			pw = #{param2}
			,name = #{param3}
			,email = #{param4}
		WHERE id = #{param1}
	</update>
</mapper>

db의 클래스명과 자바의 패키지명, 클래스명에 오타가 나지 않도록 유의한다.