성장 기록 블로그🌴

## 자바 스프링 ( 로그인 페이지 만들기 , 스프링 로그인 기능 구현하기 ) 본문

AI & BigData 교육과정/자바 Spring & SQL 관련

## 자바 스프링 ( 로그인 페이지 만들기 , 스프링 로그인 기능 구현하기 )

wlswls2s 2022. 10. 21. 17:53
728x90

< 자바스프링 내용 >

 


◆ 자바스프링 기본

개념정리

# 로그인 페이지 만들기!

# Member.java

package kr.smhrd.entity;

import lombok.Data;

// 여기에 @Data 해주면 자동으로 setter getter 생성됨
@Data
public class Member {
	
	private String memId;
	private String memPwd;
	private String memName;
	
	// setter, getter - Lombok API
	
}

01. list.jsp에 login.do로 이동할 수 있는 action 기능 추가! - member 데이터의 정보랑 일치할 시 로그인!

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt"%><!-- 필수 -->
    
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Card</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
   <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>  <script>
     // $의 의미는 선택자! select -> 찾아가라는 의미! 
     // ready() 메서드 : 사용자가 사이트를 방문할 때 요청한 HTML 문서 객체의
     //             로딩이 끝나면이벤트를 발생시킴!
     $(document).ready(function(){
        
        // 버튼을 클릭할 때 발생하는 메서드 지정!
        $("button").click(function(){
           
           // 내가 register.jsp 파일로 가고싶어도 그럴 수없음!
           // Controll한테 register.do로 지시를 해서 그 경로를 통해 jsp파일로 넘어가게!
           location.href="register.do";
        });   
        
        
     }); 
  </script>
</head>
<body> 
 
  <div class="card">
    <div class="card-header">
       <div class="jumbotron jumbotron-fluid" style="background-color : #FAFAD2;">
         <div class="container">
             <h1>♣~This is My Homepage^-^~♣</h1>
             <h5>Welcome to wls homepage!!</h5>
         </div>
      </div> 
    </div>
    <div class="card-body">
       <div class="row">
          <!-- 컬럼을 2:7:3 비율로 나눠서 사용하겠다!  -->
          <div class = "col-lg-2">
           <div class="card" style="min-height: 500px; max-height: 1000px;" >
            <div class="card-body">
            	<!-- 로그인 실패코드 : m에 값이 없다면! empty m -->
               <c:if test="${empty m}">
               <h4 class="card-title">Guest</h4>
               <p class="card-text">회원님 Welcome!!</p>
               <form action="login.do" method= "post">
                  <div class="form-group">
                     <label for="memId">아이디</label>
                     <input type="text" class="form-control" name="memId"/>
                  </div>
                  <div class="form-group">
                     <label for="memPwd">비밀번호</label>
                     <input type="password" class="form-control" name="memPwd"/>
                  </div>
                  <button type="submit" class="btn btn-sm btn-primary form-control">로그인</button>
               </form>
               </c:if>
               <!-- 로그인 성공코드 : m에 값이 있다면! !empty m -->
               <c:if test="${!empty m}">
                <h4 class="card-title">${m.memName}님의 페이지</h4>
               <p class="card-text">회원님 Welcome!!</p>
                 <button type="button" class="btn btn-sm btn-primary form-control">로그아웃</button>
               </c:if>
            </div>    
           </div>
          </div>
          <div class = "col-lg-7">
             <div class="card" style="min-height: 500px; max-height: 1000px;">
             <div class="card-body">
               <h4 class="card-title">BOARD</h4>
               <!-- 게시판 리스트 보기 화면 구현! -->
               <table class = "table table-bordered table-hover">
               <thead>
                   <th>번호</th>
                   <th>제목</th>             
                   <th>작성자</th>          
                   <th>작성일</th>
                   <th>조회수</th>          
                  </thead>
                  
                  <tbody>             
                  <c:forEach var="vo" items = "${list}">
                  <tr>
                        <td>${vo.idx}</td>
                        <!-- 상세보기 기능! 게시판 번호를 가지고 와서 값을 넘김!-->
                        <td><a href="get.do?idx=${vo.idx}">${ vo.title}</a></td>
                        <td>${ vo.writer}</td>
                        <td><fmt:formatDate value="${vo.indate}" pattern="yyyy-MM-dd" /></td>
                        <td>${ vo.count}</td>                                          
                     </tr>
                     </c:forEach>   
            </tbody>
       </table>
       <button class="btn btn-sm btn-primary">글쓰기</button>
             </div>
             </div>
          </div>
           <div class = "col-lg-3">
              <div class="card" style="min-height: 500px; max-height: 1000px;">
              <div class="card-body">
              <h4 class="card-title">My Menu</h4>
              <p class="card-text">  <img src="resources/img/img7.jfif" class="img-circle" alt="Cinque Terre" width="304" height="236"> 
              </p>
              </div>
              </div>
           </div>
       </div>
    </div>
    <div class="card-footer">Made by>(AI.BigData 취업역량강화)_wls</div>
  </div>

</body>
</html>

# 02. LoginController(로그인컨트롤러 만들기)

- LoginController.java 로 로그인 기능 구현되는 클래스 파일 생성

 

package kr.smhrd.controller;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import kr.smhrd.entity.Member;
import kr.smhrd.repository.BoardMapper;

//Controller API 기능 오버라이딩 시키기
@Controller
public class LoginController 
{
	@Autowired
	private BoardMapper mapper;
	
	// 01. 로그인 기능 구현하기!
	@RequestMapping("/login.do")
	public String login(Member member , HttpSession session) //memId, memPwd
	{
		Member m = mapper.login(member);
		
		//m의 값이 null이면 로그인 실패! , m의 값이 들어있으면 로그인 성공!
		if(m != null)
		{
			session.setAttribute("m",m);
		}
	
			return "redirect:/list.do";
	
		
	}

}

# 03. LoginMapper(로그인맵퍼 만들기)

- 기존에 있던 BoardMapper.java에 login 메서드 추가하기!

package kr.smhrd.repository;

import java.util.List;

import com.mysql.fabric.xmlrpc.base.Member;

import kr.smhrd.entity.Board;

// JDBC API(CRUD) -> 생산성이 떨어진다 , 유지 보수가 어렵다 (Java+SQL 둘다 고려해야함) 
//=> 대안: MyBatis Framework 이용 : Java <-----분리개발(mapping)-----> SQL(xml파일로 만들기!)
public interface BoardMapper {

	
	//1. 전체 게시판 정보 리스트를 가져오는 메소드	
	public List<Board> getList(); //select SQL~
		
	
	//2. 글쓰기 등록하는 메서드 // insert SQL~
	public void register(Board vo);
	
	//3. 상세보기 메소드 -> 우리가 게시물을 누르면 거기로 이동시켜줌!
	public Board get(int idx); //select SQL~
	
	// 4. 게시글 삭제하기 메소드 
	public void remove(int idx);
	
	// 5. 게시글 정보 수정하기 메소드
	public void updateForm(int idx); //delete SQL~
	
	// 6. 게시글 업데이트 메소드
	public void update(Board vo); //update SQL~
	
	// 7. 조회수 누적
	public void countUpdate(int idx); //update SQL~
	
	//=================== 로그인 페이지 만들기 ==============================
	//8. 로그인 페이지 만들기
	public Member login(Member member); //select SQL ~
}

-  기존에 있던 BoardMapper.xml 파일에 로그인 정보 출력하는 SQL 코드 생성

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<!-- Mapper : 내가 연결시킬 파일의 주소와 파일명을 입력해줌! -->
<mapper namespace="kr.smhrd.repository.BoardMapper">
  
  <!-- SQL 쿼리를 이제 여기 안에다가 사용하면 됨! -->
  <!-- 1. board table 모든 게시물을 가져오는 sql -->
  <!-- select는 검색한 결과를 가져와야하기때문에 resultType으로 Board타입 가져옴! -->
  <select id="getList" resultType="kr.smhrd.entity.Board">    
	  select * from board order by idx desc
  </select>
  
  <!-- 2. 글 쓴 내용들 삽입해주는 register 구문 만들기! -->
  <!-- 파라미터가 어떤 타입에 있는지 알아야기 때문에 파라미터타입으로 가져오면됨 -->
  <insert id = "register" parameterType = "kr.smhrd.entity.Board">
  	insert into board(title, content, writer)
  	values(#{title},#{content},#{writer})
  </insert>
  
  <!-- 3. 상세보기 - 게시물의 내용을 다 가져오는 것 -->
  <!-- parameter 타입과 resulttype을 다 가져올 수 있음! 
  	 하지만 하나만 가져올때는 필요없음 => 데이터 타입이 하나기때문에!
  -->
  <select id="get" resultType="kr.smhrd.entity.Board" parameterType="int">
  		select * from board where idx = #{idx}
  	
  </select>
  
  <!-- 4. 게시물 삭제하기 기능 - 해당 idx 선택 시 그 게시물 삭제! -->
  <delete id="remove" parameterType="int">
  		delete from board where idx= #{idx}	
  </delete>
  
  <!-- 5. 게시물 수정하기 기능 - 해당 idx에서 그 게시물 수정기능 -->
  <update id="update" parameterType="kr.smhrd.entity.Board" >
  	update board SET title=#{title},content= #{content} WHERE idx = #{idx}
  </update>
  
  <update id="countUpdate" >
  	update board SET count = count + 1 where idx = #{idx}  
  </update>
  
  <!--  =============================로그인 기능 구현하기======================= --> -->
  
  <!-- 1. 로그인 기능 구현하기 --> 
  <select id="login" resultType="kr.smhrd.entity.Member" 
  						parameterType = "kr.smhrd.entity.Member">
  	select * from member where memId=#{memId} and memPwd = #{memPwd}
  
  </select>
</mapper>

 

 

728x90