728x90
MEM테이블에서 비밀번호관련
memUpdate.jsp
memInsert.jsp
Mem_SQL.xml
memInsert.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<!-- CKEditor -->
<!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 -->
<script type="text/javascript" src="resources/script/ckeditor/ckeditor.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#listBtn").on("click", function () {
$("#backForm").submit();
});
$("#insertBtn").on("click", function () {
// $.trim(값) : 값 앞 뒤 공백제거
if($.trim($("#memId").val()) == ""){
alert("아이디 입력하세요");
$("#memId").focus();
}else if($.trim($("#memPw").val()) == ""){
alert("비밀번호를 입력세요");
$("#memPw").focus();
} else if($.trim($("#memPw").val()) != $.trim($("#repw").val())){
alert("비밀번호가 일치하지 않습니다.");
$("#memPw").val("");
$("#repw").val("");
$("#memPw").focus();
} else if($.trim($("#memNm").val()) == ""){
alert("이름을 입력하세요");
$("#memNm").focus();
} else if($.trim($("#memBirth").val()) == ""){
alert("생년월일을 입력하세요");
$("#memBirth").focus();
} else {
$("#actionForm").submit();
}
});
});
</script>
</head>
<body>
<form action="memList" id="backForm" method="post">
<input type="hidden" name="page" value="${param.page}" />
<input type="hidden" name="searchGbn" value="${param.searchGbn}"/>
<input type="hidden" name="searchTxt" value="${param.searchTxt}"/>
</form>
<form action="memRes" id="actionForm" method="post">
<!-- gbn : 구분, 혹은 flag
구분: i - insert, u - update, d - delete -->
<input type="hidden" name="gbn" value="i"/>
아이디
<input type="text" name="memId" id="memId" />
<br />
비밀번호
<input type="password" name="memPw" id="memPw" />
<br />
비밀번호확인
<input type="password" id="repw" />
<br />
이름
<input type="text" name="memNm" id="memNm" />
<br/>
생년월일
<input type="date" name="memBirth" id="memBirth" />
<br/>
</form>
<input type="button" value="등록" id="insertBtn">
<input type="button" value="목록" id="listBtn">
</body>
</html>
memUpdate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#listBtn").on("click", function () {
history.back();
});
$("#updateBtn").on("click", function () {
// $.trim(값) : 값 앞 뒤 공백제거
if($.trim($("#memId").val()) == ""){
alert("아이디 입력하세요");
$("#memId").focus();
} else if($.trim($("#memNm").val()) == ""){
alert("이름을 입력하세요");
$("#memNm").focus();
} else if($.trim($("#memPw").val()) !="" // 이 부분이 업데이트에 추가됨
&& $.trim($("#memPw").val()) != $.trim($("#repw").val())){
alert("비밀번호가 일치하지 않습니다.");
$("#memPw").val("");
$("#repw").val("");
$("#memPw").focus();
} else if($.trim($("#memBirth").val()) == ""){
alert("생년월일을 입력하세요");
$("#memBirth").focus();
} else {
$("#actionForm").submit();
}
});
});
</script>
</head>
<body>
<form action="memRes" id="actionForm" method="post">
<input type="hidden" name="gbn" value="u"/>
<input type="hidden" name="no" value="${data.MEM_NO}"/>
아이디
<input type="text" name="memId" id="memId" value="${data.MEM_ID}"/>
<br />
이름
<input type="text" name="memNm" id="memNm" value="${data.MEM_NM}"/>
<br/>
비밀번호
<input type="password" name="memPw" id="memPw" value="${data.MEM_PW}"/>
<br/>
비밀번호확인
<input type="password" id="repw" />
<br/>
생년월일
<input type="date" name="memBirth" id="memBirth" value="${data.MEM_BIRTH}"/>
<br/>
</form>
<input type="button" value="수정" id="updateBtn">
<input type="button" value="뒤로가기" id="listBtn">
</body>
</html>
Mem_SQL.xml
<?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">
<!-- namespace : 클래스와 동일, 이 파일의 대표명 -->
<mapper namespace="mem">
<!-- select : 조회
id: 구분자, 메소드명과 동일
resultType : 조회 결과 중 한줄에 대한 자료 형태를 지정
hashmap: mybatis-config.xml에서 별칭 지정해놔서 줄여쓸수있는거임
쿼리 삽입시 주의사항: ;이 있는경우 문제가 발생한다. 이유는 해당 쿼리 실행시 자동으로 추가되기 때문
-->
<select id="getMemList" resultType="hashmap" parameterType="hashmap">
SELECT S.MEM_NO, S.MEM_ID, S.MEM_NM, S.REG_DT
FROM (SELECT MEM_NO, MEM_ID, MEM_NM, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT,
ROW_NUMBER() OVER(ORDER BY REG_DT DESC, MEM_NO DESC) AS RNK
FROM MEM
WHERE DEL = 1
<if test="searchTxt != null and searchTxt != ''"> <!-- 검색어가 있다면 -->
<choose>
<when test="searchGbn == 0"> <!-- 품목 -->
AND MEM_ID LIKE '%' || #{searchTxt} || '%'
</when>
<when test="searchGbn == 1"> <!-- 수량 -->
AND MEM_NM = #{searchTxt}
</when>
</choose>
</if>
) S
WHERE S.RNK BETWEEN #{start} AND #{end}
</select>
<!--
parameterType : 실행시 받는 값
#{키} : 헤당위치에 문자열로 키에 해당하는 값을 넣어준다
ex) no에 3이 들어있는 경우
WHERE SELL_NO = #{no}
=> WHERE SELL_NO = '3' // 문자열이기 때문에 ' '이 들어감
parameterType dao받는값, resultType값이 db실행결과
-->
<select id="getMem" resultType="hashmap" parameterType="hashmap">
SELECT MEM_NO, MEM_ID, MEM_NM, TO_CHAR(MEM_BIRTH,'YYYY-MM-DD') AS MEM_BIRTH, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT
FROM MEM
WHERE MEM_NO = #{no}
</select>
<!-- insert는 resultType 이 없음 -->
<insert id="insertMem" parameterType="hashmap">
INSERT INTO MEM(MEM_NO, MEM_ID, MEM_PW, MEM_NM, MEM_BIRTH)
VALUES(MEM_SEQ.NEXTVAL, #{memId}, #{memPw}, #{memNm}, #{memBirth})
</insert>
<update id="deleteMem" parameterType="hashmap">
UPDATE MEM SET DEL = 0
WHERE MEM_NO = #{no}
</update>
<update id="updateMem" parameterType="hashmap">
UPDATE MEM SET MEM_ID = #{memId},
MEM_NM = #{memNm},
<if test="memPw != null and memPw != ''">
MEM_PW = #{memPw},
</if>
MEM_BIRTH = #{memBirth}
WHERE MEM_NO = #{no}
</update>
<select id="getMemCnt" parameterType="hashmap" resultType="Integer">
SELECT COUNT(*) AS CNT
FROM MEM
WHERE DEL = 1
<if test="searchTxt != null and searchTxt != ''"> <!-- 검색어가 있다면 -->
<choose>
<when test="searchGbn == 0"> <!-- 품목 -->
AND MEM_ID LIKE '%' || #{searchTxt} || '%'
</when>
<when test="searchGbn == 1"> <!-- 수량 -->
AND MEM_NM = #{searchTxt}
</when>
</choose>
</if>
</select>
</mapper>
로그인
Login : 입력 정보와 일치하는 사용자 정보를 보관중인 상태
Logout : 보관중인 사용자 정보가 제거된 상태
Session : 서버에 사용자의 브라우저, 아이피 등에 따라 제공되는 임시 개별공간, 지정 시간 마다 미 사용시 초기화
(브라우저! 그래서 크롬에서 로그인 되어있어도, 엣지로 들어가면 로그인 안되어있음)
Session에 넣을 것들(권장): 기본 사용자 정보, 사용빈도가 높은 데이터 키값들
Request 를 통한 세션 취득
방법1
방법2
2번 방법은 한줄만 쓰면 되니 2번 방법을 많이 씀
로그아웃
세션에 정보 제거
LoginController.java
package com.spring.sample.web.test.controller;
import java.util.HashMap;
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 org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.spring.sample.web.test.service.ILoginService;
@Controller
public class LoginController {
@Autowired
public ILoginService iLoginService;
@RequestMapping(value = "/testLogin")
public ModelAndView testLogin(HttpSession session, // 로그인 된 상태에서 로그인 화면 못가게 하기 위해
ModelAndView mav) {
// session의 getAttribute(키) : 세션값 취득
// 세션에 값이 존재한다면 main으로 이동
if (session.getAttribute("sMemNm") != null && session.getAttribute("sMemNm") != "") {
mav.setViewName("redirect:testMain");
} else {
mav.setViewName("test/login/login");
}
return mav;
}
// DB에 붙을예정
@RequestMapping(value = "/testLoginAction")
public ModelAndView testLoginAction(
// HttpServletRequest req, // 1. 요청 객체 취득
HttpSession session, // 2. Spring에 Session 객체 요청
@RequestParam HashMap<String, String> params, ModelAndView mav) throws Throwable {
// 1. Request를 통한 세션 취득
// HttpSession session = req.getSession();
// 아이디와 비밀번호가 일치하는 사용자 정보 취득
HashMap<String, String> data = iLoginService.checkMem(params);
if (data != null) { // 조회 데이터가 있다면
// 세션에 값 추가
session.setAttribute("sMemNo", data.get("MEM_NO"));
session.setAttribute("sMemNm", data.get("MEM_NM"));
mav.setViewName("redirect:testMain");
} else {
mav.setViewName("test/login/action");
}
return mav;
}
@RequestMapping(value = "/testMain")
public ModelAndView testMain(ModelAndView mav) {
mav.setViewName("test/login/main");
return mav;
}
@RequestMapping(value = "/testLogout")
public ModelAndView testLogout(HttpSession session, ModelAndView mav) {
// 요청 사용자 세션 초기화
session.invalidate();
mav.setViewName("redirect:testMain");
return mav;
}
}
ILoginService.java
package com.spring.sample.web.test.service;
import java.util.HashMap;
public interface ILoginService {
public HashMap<String, String> checkMem(HashMap<String, String> params) throws Throwable;
}
LoginService.java
package com.spring.sample.web.test.service;
import java.util.HashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.spring.sample.web.test.dao.ILoginDao;
@Service
public class LoginService implements ILoginService {
@Autowired
public ILoginDao iLoginDao;
@Override
public HashMap<String, String> checkMem(HashMap<String, String> params) throws Throwable {
return iLoginDao.checkMem(params);
}
}
ILoginDao.java
package com.spring.sample.web.test.dao;
import java.util.HashMap;
public interface ILoginDao {
public HashMap<String, String> checkMem(HashMap<String, String> params) throws Throwable;
}
LoginDao.java
package com.spring.sample.web.test.dao;
import java.util.HashMap;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class LoginDao implements ILoginDao {
@Autowired
public SqlSession sqlSession;
@Override
public HashMap<String, String> checkMem(HashMap<String, String> params) throws Throwable {
return sqlSession.selectOne("Login.checkMem", params);
}
}
Login_SQL.xml
<?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="Login">
<select id="checkMem" resultType="hashmap" parameterType="hashmap">
SELECT MEM_NO, MEM_NM
FROM MEM
WHERE DEL = 1
AND MEM_ID = #{id} <!-- login/login jsp에서 name맞춰줘야함 -->
AND MEM_PW = #{pw}
</select>
</mapper>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#actionForm").on("keypress","input", function(event) {
// 1.엔터쳤을때
if(event.keyCode == 13){
// 1.직접 함수 호출
// login();
// 2.버튼 이벤트 발생
$("#loginBtn").click();
return false;
}
})
// 2.버튼 눌렀을때
$("#loginBtn").on("click", login);
});
// 왜 function으로 하는지
// 로그인 동작하는 상황 2종류, 1.엔터쳤을때 2.버튼 눌렀을때
function login() {
if($.trim($("#id").val()) == ""){
alert("아이디를 입력하세요.");
$("#id").focus();
} else if($.trim($("#pw").val()) == ""){
alert("비밀번호를 입력하세요.");
$("#pw").focus();
} else {
$("#actionForm").submit();
}
}
</script>
</head>
<body>
<form action="testLoginAction" id="actionForm" method="post">
아이디 <input type="text" name="id" id="id" /><br/>
비밀번호 <input type="password" name="pw" id="pw" /><br/>
</form>
<input type="button" value="로그인" id="loginBtn" />
</body>
</html>
action.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript">
alert("아이디나 비밀번호가 일치하지 않습니다.");
history.back();
</script>
<body>
</body>
</html>
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#logoutBtn").on("click", function () {
location.href = "testLogout";
})
$("#loginBtn").on("click", function () {
location.href = "testLogin";
})
})
</script>
</head>
<body>
<c:choose>
<c:when test="${empty sMemNm}"> <!-- el태그의 empty : 해당 값이 비어있는지 확인 -->
<input type="button" value="로그인" id="loginBtn" />
</c:when>
<c:otherwise>
${sMemNm}님 어서어세요. <input type="button" value="로그아웃" id="logoutBtn" />
</c:otherwise>
</c:choose>
</body>
</html>
TBOARD만들기
MEM테이블이랑 TBOARD랑 외래키 설정
테이블만 만들고, 조인은 화요일부터!
그리고 정렬하는거를 해봤는데
나혼자 한거라,
anboardList
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
table{
border-collapse: collapse;
}
th, td {
border: 1px solid #000;
padding: 5px;
}
</style>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
if("${param.searchGbn}" != "") { // 검색구분이 넘어오면
$("#searchGbn").val("${param.searchGbn}");
}
if("${param.sortGbn}" == ""){
$("#sortGbn").val("0");
}
if("${param.sortGbn}" != "") {
$("#sortGbn").val("${param.sortGbn}");
}
$('select').on('change', function() {
$("#actionForm").attr("action","anboardList");
$("#actionForm").submit();
});
$("tbody").on("click", "tr", function () {
console.log($(this).attr("no"));
$("#no").val($(this).attr("no"));
// 검색 상태 유지
$("#searchGbn").val($("#oldGbn").val());
$("#searchTxt").val($("#oldTxt").val());
$("#sortGbn").val($("#oldSort").val());
$("#actionForm").attr("action","anboardDetail");
$("#actionForm").submit();
})
$("#insertBtn").on("click", function () {
location.href = "anboardInsert";
});
$("#pagingWrap").on("click", "span", function () {
$("#page").val($(this).attr("page"));
// 검색 상태 유지
$("#searchGbn").val($("#oldGbn").val());
$("#searchTxt").val($("#oldTxt").val());
$("#sortGbn").val($("#oldSort").val());
$("#actionForm").attr("action","anboardList");
$("#actionForm").submit();
});
$("#searchBtn").on("click", function () {
// 검색하면 페이지는 무조건 1페이지로 감
$("#page").val("1"); // 페이지 초기화
$("#actionForm").attr("action","anboardList");
$("#actionForm").submit();
})
})
</script>
</head>
<body>
<!-- 기존 검색 내용 유지용 -->
<input type="hidden" id="oldGbn" value="${param.searchGbn}"/>
<input type="hidden" id="oldTxt" value="${param.searchTxt}"/>
<input type="hidden" id="oldSort" value="${param.sortGbn}"/>
<form action="anboardDetail" id="actionForm" method="post">
<input type="hidden" id="no" name="no" />
<input type="hidden" id="page" name="page" value="${page}" /> <!-- 상세보기 갈때 page 가져갈거임 -->
<select name="sortGbn" id="sortGbn">
<option value="0">번호순</option>
<option value="1">제목순</option>
</select>
<br/>
<!-- 검색 -->
<select name="searchGbn" id="searchGbn">
<option value="0">제목</option>
<option value="1">작성자</option>
</select>
<input type="text" name="searchTxt" id="searchTxt" value="${param.searchTxt}"/> <!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 -->
<input type="button" value="검색" id="searchBtn" />
<input type="button" value="추가" id="insertBtn" />
</form>
<table>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>조회수</th>
<th>작성일</th>
</tr>
</thead>
<tbody>
<c:forEach var="data" items="${list}">
<tr no="${data.NO}">
<td>${data.NO}</td>
<td>${data.TITLE}</td>
<td>${data.WRITER}</td>
<td>${data.HIT}</td>
<td>${data.DT}</td>
</tr>
</c:forEach>
</tbody>
</table>
<div id="pagingWrap">
<span page="1">처음</span>
<!-- 이전은 현재페이지에서 하나 전,
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요-->
<!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 -->
<c:choose>
<c:when test="${page eq 1}">
<span page="1">이전</span>
</c:when>
<c:otherwise>
<span page="${page - 1}">이전</span>
</c:otherwise>
</c:choose>
<!-- 페이지들 -->
<c:forEach var="i" begin="${pd.startP}" end="${pd.endP}" step="1">
<%-- 현재 페이지의 경우 별도 처리 --%>
<c:choose>
<c:when test="${i eq page}"> <%-- 현재페이지 --%>
<span page="${i}"><b>${i}</b></span>
</c:when>
<c:otherwise> <%-- 다른페이지 --%>
<span page="${i}">${i}</span>
</c:otherwise>
</c:choose>
</c:forEach>
<!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 -->
<c:choose>
<c:when test="${page eq pd.maxP}">
<span page="${pd.maxP}">다음</span>
</c:when>
<c:otherwise>
<span page="${page + 1}">다음</span>
</c:otherwise>
</c:choose>
<span page="${pd.maxP}">마지막</span>
</div>
</body>
</html>
detail, update, res 부분에 넣고
Test_SQL.xml
<?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">
<!-- namespace : 클래스와 동일, 이 파일의 대표명 -->
<mapper namespace="test">
<!-- anboard테이블 -->
<select id="getAnboardList" resultType="hashmap" parameterType="hashmap">
SELECT S.NO, S.TITLE, S.WRITER, S.HIT, S.DT
FROM (SELECT NO, TITLE, WRITER, HIT, CASE WHEN TO_CHAR(DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
THEN TO_CHAR(DT, 'HH24:MI')
ELSE TO_CHAR(DT, 'YY.MM.DD')
END AS DT,
ROW_NUMBER() OVER(ORDER BY DT DESC, NO DESC) AS RNK
FROM ANBOARD
WHERE DEL = 1
<if test="searchTxt != null and searchTxt != ''">
<choose>
<when test="searchGbn == 0">
AND TITLE LIKE '%' || #{searchTxt} || '%'
</when>
<when test="searchGbn == 1">
AND WRITER LIKE '%' || #{searchTxt} || '%'
</when>
</choose>
</if>
<if test="1 == 1">
<choose>
<when test="sortGbn == 0">
ORDER BY NO ASC
</when>
<when test="sortGbn == 1">
ORDER BY TITLE ASC
</when>
</choose>
</if>
) S
WHERE S.RNK BETWEEN #{start} AND #{end}
</select>
<select id="getAnboard" resultType="hashmap" parameterType="hashmap">
SELECT NO, TITLE, WRITER, CON, HIT, DT
FROM ANBOARD
WHERE NO = #{no}
</select>
<insert id="insertAnboard" parameterType="hashmap">
INSERT INTO ANBOARD(NO, TITLE, WRITER, CON)
VALUES(ANBOARD_SEQ.NEXTVAL, #{title}, #{writer}, #{con})
</insert>
<update id="deleteAnboard" parameterType="hashmap">
UPDATE ANBOARD SET DEL = 0
WHERE NO = #{no}
</update>
<update id="updateAnboard" parameterType="hashmap">
UPDATE ANBOARD SET TITLE = #{title},
WRITER = #{writer},
CON = #{con}
WHERE NO = #{no}
</update>
<select id="getAnboardCnt" parameterType="hashmap" resultType="Integer">
SELECT COUNT(*) AS CNT
FROM ANBOARD
WHERE DEL = 1
<if test="searchTxt != null and searchTxt != ''">
<choose>
<when test="searchGbn == 0"> <!-- searchGbn eq 0 -->
AND TITLE LIKE '%' || #{searchTxt} || '%'
</when>
<when test="searchGbn == 1">
AND WRITER LIKE '%' || #{searchTxt} || '%'
</when>
</choose>
</if>
</select>
<update id="updateHit" parameterType="hashmap" >
UPDATE ANBOARD SET HIT = HIT + 1
WHERE NO = #{no}
</update>
</mapper>
728x90
'TIL > academy' 카테고리의 다른 글
국비 TIL(Today I Learned) 20220818 스프링 ajax로 추가, 상세, 수정, 삭제, mem테이블 실습 (0) | 2022.08.18 |
---|---|
국비 TIL(Today I Learned) 20220816 로그인 후, 글삭제 수정/ Ajax 테이블 (0) | 2022.08.16 |
국비 TIL(Today I Learned) 20220811 anboard테이블 리뷰, mem테이블 실습 (0) | 2022.08.11 |
국비 TIL(Today I Learned) 20220810 검색하기, sell, manager, anboard테이블 (0) | 2022.08.10 |
국비 TIL(Today I Learned) 20220809 테이블 페이징 처리 (0) | 2022.08.09 |