2024-03-04 안드로이드 앱 프로그래밍
메뉴바 활용 방법 (sidebar.jsp)
- active
- folder
- collapse
active 활용 시, 내가 클릭한 부분, 위치가 강조됨.
<li class="nav-item active">
관리자 페이지 - 게시글관리
AdminService.java (인터페이스)
AdminServiceImpl (클래스)
superclass=AbstractDAO / Interfaces=AdminService 선택 후 생성
board.jsp 생성
sidebar(menu)를 wrapper아래에 두기.
<body id="page-top">
<!-- Page Wrapper -->
<div id="wrapper">
<c:import url="sidebar.jsp" />
AdminController.java
리퀘스트매핑 추가 : @RequestMapping("/admin")
@Resource 추가
@Controller
@RequestMapping("/admin")
public class AdminController {
@Resource(name="adminService")
private AdminService adminService;
board 메소드
@GetMapping("/admin/board")
public String board(Model model) {
List<BoardDTO> list = adminService.boardList();
model.addAttribute("list", list);
return "/admin/board";
}
-> boardList() 생성 : 서비스, 서비스Impl, DAO
AdminService.java
@Service
public interface AdminService {
List<BoardDTO> boardList();
}
AdminServiceImpl.java
AdminServiceImpl에 오류 잡아주기 = add ~ @Override
@Service("adminService")
public class AdminServiceImpl extends AbstractDAO implements AdminService {
@Override
public List<BoardDTO> boardList() {
return null;
}
}
AdminDAO 생성
@Repository
public class AdminDAO extends AbstractDAO {
@Autowired
private SqlSession sqlSession;
}
AdminServiceImpl.java
@Service("adminService")
public class AdminServiceImpl extends AbstractDAO implements AdminService {
@Autowired
private AdminDAO adminDAO;
@Override
public List<BoardDTO> boardList() {
return adminDAO.boardList();
}
}
-> boardList()를 AdminDAO에 생성
AdminDAO.java
@Repository
public class AdminDAO extends AbstractDAO {
@Autowired
private SqlSession sqlSession;
public List<BoardDTO> boardList() {
return sqlSession.selectList("admin.boardList");
}
}
admin-mapper.xml
<mapper namespace="admin">
<select id="boardList" resultType="boardDTO">
SELECT board_no, board_title, mno, board_date, board_ip, board_del
FROM board
</select>
</mapper>
AdminController.java
// 2024-03-04
@GetMapping("/board")
public String board(@RequestParam("pageNo") String pageNo, Model model) {
// 페이징 + 검색 + 한 화면에 보이는 게시글 수 변경
// 전체 글 수
int totalRecordCount = adminService.totalRecordCount();
List<BoardDTO> list = adminService.boardList();
model.addAttribute("list", list);
return "/admin/board";
}
-> totalRecordCount 생성
AdminService.java
int totalRecordCount();
AdminServiceImpl.java
AdminServiceImpl 빨간줄 오류나는거 잡아주기 : 생성해주기 @Override
@Override
public int totalRecordCount() {
return adminDAO.totalRecordCount();
}
AdminDAO.java
public int totalRecordCount() {
return sqlSession.selectOne("admin.totalRecordCount");
}
admin-mapper.xml
<select id="totalRecordCount" resultType="Integer">
SELECT COUNT(*)
FROM board
</select>
board.jsp
화면에 게시판 글 띄우기
board_del은 BoardDTO int에 추가하기
<body id="page-top">
<!-- Page Wrapper -->
<div id="wrapper">
<c:import url="sidebar.jsp" />
<!-- Content Wrapper -->
<div id="content-wrapper" class="d-flex flex-column">
<!-- Main Content -->
<div id="content">
<!-- Begin Page Content -->
<div class="container-fluid">
<!-- Page Heading -->
<h1 class="h3 mb-4 text-gray-800">Blank Page</h1>
<table class="table table-hover">
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list }" var="row">
<tr>
<td onclick="detail(${row.board_no })">${row.board_no }</td>
<td class="title"><a href="./detail?no=${row.board_no }"> ${row.board_title } <c:if test="${row.comment gt 0}">
<span class="badge">${row.comment }</span>
</c:if>
</a></td>
<td>${row.mname }</td>
<td>${row.board_date }</td>
<td>${row.board_count }</td>
<td>${row.board_del }</td>
</tr>
</c:forEach>
</tbody>
</table>
AdminController.java
전자정부 페이징 코드추가
@GetMapping("/board")
public String board(@RequestParam("pageNo") String pageNo, Model model) {
// 페이징 + 검색 + 한 화면에 보이는 게시글 수 변경
// 전체 글 수
int totalRecordCount = adminService.totalRecordCount();
// 전자정부 페이징
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(util.str2Int(pageNo)); // 현재 페이지 번호: util 써서 int타입으로
paginationInfo.setRecordCountPerPage(10); // 한 페이지에 게시되는 게시물 수
paginationInfo.setPageSize(10); // 페이징 리스트의 사이즈 (페이징 숫자 수)
paginationInfo.setTotalRecordCount(totalRecordCount); // 전체 게시물 건 수
SearchDTO searchDTO = new SearchDTO();
searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());
List<BoardDTO> list = adminService.boardList(searchDTO); // 파라미터 추가
model.addAttribute("list", list);
return "/admin/board";
}
-> 파라미터 추가 (서비스, 서비스impl, DAO)
AdminService.java
boardList(SearchDTO searchDTO);
@Service
public interface AdminService {
List<BoardDTO> boardList(SearchDTO searchDTO);
int totalRecordCount();
}
AdminServiceImpl.java
@Service("adminService")
public class AdminServiceImpl extends AbstractDAO implements AdminService {
@Autowired
private AdminDAO adminDAO;
@Override
public List<BoardDTO> boardList(SearchDTO searchDTO) {
return adminDAO.boardList(searchDTO);
}
AdminDAO
public List<BoardDTO> boardList(SearchDTO searchDTO) {
return sqlSession.selectList("admin.boardList", searchDTO);
}
mybatis-config.xml
alias="search"였는데 "searchDTO"로 변경
이전의 search를 전부 다 바꿔줘야함.. 아 왜 도대체 !!!!
<typeAlias type="org.-----.dto.SearchDTO" alias="searchDTO"/>
-> board-mapper.xml도 바꿔주기
admin-mapper.xml
파라미터타입 searchDTO 추가, limit에 #{pageNo} 받아오기
<select id="boardList" parameterType="searchDTO" resultType="boardDTO">
SELECT board_no, board_title, mno, board_date, board_ip, board_del
FROM board
ORDER BY board_no DESC
LIMIT #{pageNo}, 10;
</select>
AdminController.java
@RequestParam(name="pageNo",defaultValue = "1") 추가
model.addAttribute("paginationInfo", paginationInfo); 추가
// 2024-03-04
@GetMapping("/board")
public String board(@RequestParam(name="pageNo",defaultValue = "1") String pageNo, Model model) {
// 페이징 + 검색 + 한 화면에 보이는 게시글 수 변경
// 전체 글 수
int totalRecordCount = adminService.totalRecordCount();
// 전자정부 페이징
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(util.str2Int(pageNo)); // 현재 페이지 번호: util 써서 int타입으로
paginationInfo.setRecordCountPerPage(10); // 한 페이지에 게시되는 게시물 수
paginationInfo.setPageSize(10); // 페이징 리스트의 사이즈 (페이징 숫자 수)
paginationInfo.setTotalRecordCount(totalRecordCount); // 전체 게시물 건 수
SearchDTO searchDTO = new SearchDTO();
searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());
List<BoardDTO> list = adminService.boardList(searchDTO); // 파라미터 추가
model.addAttribute("list", list);
return "/admin/board";
}
board.jsp
<%@ taglib uri="http://egovframework.gov/ctl/ui" prefix="ui"%>
<!-- 페이징 -->
<div class="m-2" style="text-align: center;">
<ui:pagination paginationInfo="${paginationInfo }" type="text" jsFunction="linkPage"/>
</div>
<head>에 function 추가
<jsp:include page="topbar.jsp"/>
<script type="text/javascript">
function linkPage(pageNo){
location.href="./board?pageNo="+pageNo;
}
</script>
이어서, 한 페이지 보이는 글 개수 옵션
<!-- Page Heading -->
<h1 class="h3 mb-4 text-gray-800">게시판 관리</h1>
<div class="">
<select name="perPage" id="perPage" class="form-control">
<option value="1">10</option>
<option value="2">20</option>
<option value="3">30</option>
<option value="4">40</option>
<option value="5">50</option>
<option value="10">100</option>
</select>
</div>
jQuery 추가
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
$(function(){
// alert("사용가능");
location.href="./board?pageNo=${pageNo }&perPage="+$('#perPage').val();
// ${pageNo } 임시로 적어놓음. 컨트롤러에서 보내주는게 편함.
// 게시판에서 20을 누르면 url 끝에 2라고 뜨고, 30을 누르면 3이라고 떠야함. (아래에서 잡아준 val)
});
});
AdminController.java
perPage 추가
@GetMapping("/board")
public String board(@RequestParam(name="pageNo",defaultValue = "1") String pageNo,
@RequestParam(name="perPage",defaultValue = "1", required = false) String perPage,
Model model) {
// 전자정부 페이징 perPage 변경
paginationInfo.setRecordCountPerPage(util.str2Int(perPage) * 10);
SearchDTO.java
recordCountPerPage 추가하기 -> 컨트롤러에서 추가하기
@Data
public class SearchDTO {
private int pageNo, recordCountPerPage;
private String search;
}
AdminController
DTO에서 추가해준 RecordCountPerPage
SearchDTO searchDTO = new SearchDTO();
searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());
searchDTO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
admin-mapper.xml
페이지 보여주는 개수 #{recordCountPerPage} 변경
<select id="boardList" parameterType="searchDTO" resultType="boardDTO">
SELECT board_no, board_title, mno, board_date, board_ip, board_del
FROM board
ORDER BY board_no DESC
LIMIT #{pageNo}, #{recordCountPerPage};
</select>
* 검색창 넣어주기
<div class="m-2 row">
<select name="perPage" id="perPage" class="form-control col-2">
<option value="1">10</option>
<option value="2">20</option>
<option value="3">30</option>
<option value="4">40</option>
<option value="5">50</option>
<option value="10">100</option>
</select>
<div class="input-group col-6">
<input type="text" name="search" id="search" class="form-control">
<button type="button" class="btn btn-secondary" id="searchBtn">검색</button>
</div>
<button class="btn btn-dark col-4">초기화</button>
</div>
-> 검색 버튼 누르면 작동하도록 #searchBtn
$(function(){
$('#perPage').change(function(){
location.href="./board?pageNo=${pageNo}&perPage="+$('#perPage').val();
// ${pageNo } 임시로 적어놓음. 컨트롤러에서 보내주는게 편함.
// 게시판에서 20을 누르면 url 끝에 2라고 뜨고, 30을 누르면 3이라고 떠야함. (아래에서 잡아준 val)
});
$('#searchBtn').click(function(){
location.href="./board?pageNo=${pageNo}&perPage=${perPage}&search="+$('#search').val();
})
});
</script>
AdminController.java
search 관련 코드 추가
@GetMapping("/board")
public String board(@RequestParam(name="pageNo", defaultValue = "1") String pageNo,
@RequestParam(name="perPage", defaultValue = "1", required = false) String perPage,
@RequestParam(name="search", required = false) String search,
Model model) {
// 전체 글 수
int totalRecordCount = adminService.totalRecordCount(search); // search 추가
-> totalRecordCount (add parameter로 서비스, 서비스impl, DAO에 추가)
AdminService.java
int totalRecordCount(String search);
AdminServiceImpl.java
@Override
public int totalRecordCount(String search) {
return adminDAO.totalRecordCount(search);
}
AdminDAO
public int totalRecordCount(String search) {
return sqlSession.selectOne("admin.totalRecordCount", search);
}
admin-mapper.xml
search 파라미터타입 String
<select id="totalRecordCount" parameterType="String" resultType="Integer">
SELECT COUNT(*)
FROM board
<where>
<if test="search != null">
board_title LIKE CONCAT('%',#{search},'%')
OR board_content LIKE CONCAT('%', #{search}, '%')
</if>
</where>
</select>
AdminController.java
searchDTO.setSearch(search); // 검색된 내용만 화면에 나오도록 추가
pageNo, perPage를 model로 추가
SearchDTO searchDTO = new SearchDTO();
searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());
searchDTO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
searchDTO.setSearch(search);
List<BoardDTO> list = adminService.boardList(searchDTO); // 파라미터 추가
model.addAttribute("list", list);
model.addAttribute("paginationInfo", paginationInfo);
model.addAttribute("pageNo", pageNo);
model.addAttribute("perPage", perPage);
admin-mapper.xml
search의 <where> 아까랑 똑같이 추가
<select id="boardList" parameterType="searchDTO" resultType="boardDTO">
SELECT board_no, board_title, mno, board_date, board_ip, board_del
FROM board
<where>
<if test="search != null">
board_title LIKE CONCAT('%',#{search},'%')
OR board_content LIKE CONCAT('%', #{search}, '%')
</if>
</where>
ORDER BY board_no DESC
LIMIT #{pageNo}, #{recordCountPerPage};
</select>
board.jsp
linkPage와 #perPage change에 perPage, search 추가
<script type="text/javascript">
function linkPage(pageNo){
location.href="./board?pageNo="+pageNo+"&perPage=${perPage}&search=${search}";
}
$(function(){
$('#perPage').change(function(){
location.href="./board?pageNo=${pageNo}&perPage="+$('#perPage').val()+&search=${search};
});
$('#searchBtn').click(function(){
location.href="./board?pageNo=${pageNo}&perPage=${perPage}&search="+$('#search').val();
})
});
</script>
* input value에 search 추가
<input type="text" name="search" id="search" class="form-control" value="${search }">
* 검색 select option 추가하기
<div class="input-group col-6">
<select name="searchTitle" id="searchTitle" class="form-control col-3">
<option value="1">제목 검색</option>
<option value="2">본문 검색</option>
<option value="3">작성자 검색</option>
</select>
<input type="text" name="search" id="search" class="form-control" value="${search }">
<button type="button" class="btn btn-secondary" id="searchBtn">검색</button>
</div>
<button class="btn btn-dark col-4">초기화</button>
</div>
* perPage에 selected 추가하기
<select name="perPage" id="perPage" class="form-control col-2">
<option value="1" <c:if test="${perPage eq 1 }">selected="selected"</c:if> > 10개씩 보기</option>
<option value="2" <c:if test="${perPage eq 2 }">selected="selected"</c:if> > 20개씩 보기</option>
<option value="3" <c:if test="${perPage eq 3 }">selected="selected"</c:if> > 30개씩 보기</option>
<option value="4" <c:if test="${perPage eq 4 }">selected="selected"</c:if> > 40개씩 보기</option>
<option value="5" <c:if test="${perPage eq 5 }">selected="selected"</c:if> > 50개씩 보기</option>
<option value="10" <c:if test="${perPage eq 10 }">selected="selected"</c:if> > 100개씩 보기</option>
</select>
클릭 function에 searchTitle="+$('#searchTitle').val()+" 추가
$('#searchBtn').click(function () {
location.href = "./board?pageNo=${pageNo}&perPage=${perPage}&searchTitle&search=" + $('#search').val();
})
db-context.xml
ref="dataSourceSpied" 변경
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceSpied"/>
<property name="mapperLocations" value="classpath:/mybatis/mappers/*-mapper.xml"/>
<property name="configLocation" value="classpath:/mybatis/config/mybatis-config.xml"/>
</bean>
AdminController.java
@getmapping에 searchTitle 추가
@RequestParam(name="searchTitle", required = false) String searchTitle,
SearchDTO
searchTitle 추가
@Data
public class SearchDTO {
private int pageNo, recordCountPerPage;
private String search, searchTitle;
}
AdminController.java
searchTitle 추가
searchDTO.setSearchTitle(searchTitle);
admin-mapper.xml
select문에 JOIN
<where>에는 제목, 본문, 작성자 검색 관련
<select id="boardList" parameterType="searchDTO" resultType="boardDTO">
SELECT b.board_no, b.board_title, m.mname, m.mid, b.board_date, b.board_ip, b.board_del
FROM board b JOIN member m ON b.mno=m.mno
<where>
<if test="searchTitle == 1">
b.board_title LIKE CONCAT('%',#{search},'%')
</if>
<if test="searchTitle == 2">
b.board_content LIKE CONCAT('%', #{search}, '%')
</if>
<if test="searchTitle == 3"> <!-- 작성자 -->
m.mname LIKE CONCAT('%', #{search}, '%')
</if>
</where>
ORDER BY b.board_no DESC
LIMIT #{pageNo}, #{recordCountPerPage};
</select>
AdminController.java
* searchDTO 위치 변경 (페이징 코드 기준으로)
- search, searchTitle 위로
- pageNo, perPage 아래로
* totalRecordCount 변수 변경 -> 서비스, 서비스Impl, DAO 모두 변경해줘야 함.
* model에 searchTitle, search 추가해주기.
@GetMapping("/board")
public String board(@RequestParam(name="pageNo", defaultValue = "1") String pageNo,
@RequestParam(name="perPage", defaultValue = "1", required = false) String perPage,
@RequestParam(name="search", required = false) String search,
@RequestParam(name="searchTitle", required = false) String searchTitle,
Model model) {
// 페이징 + 검색 + 한 화면에 보이는 게시글 수 변경
// 전체 글 수에도 DTO 보내기
SearchDTO searchDTO = new SearchDTO();
searchDTO.setSearch(search); // 검색된 내용만 화면에 나오도록
searchDTO.setSearchTitle(searchTitle);
// 전체 글 수 (변수 searchDTO로 변경, 인터페이스 메소드 변경 change method 선택)
int totalRecordCount = adminService.totalRecordCount(searchDTO);
// 전자정부 페이징
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(util.str2Int(pageNo)); // 현재 페이지 번호: util 써서 int타입으로
paginationInfo.setRecordCountPerPage(util.str2Int(perPage) * 10); // 한 페이지에 게시되는 게시물 수
paginationInfo.setPageSize(10); // 페이징 리스트의 사이즈 (페이징 숫자 수)
paginationInfo.setTotalRecordCount(totalRecordCount); // 전체 게시물 건 수
searchDTO.setPageNo(paginationInfo.getFirstRecordIndex());
searchDTO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
List<BoardDTO> list = adminService.boardList(searchDTO); // 파라미터 추가
model.addAttribute("list", list);
model.addAttribute("paginationInfo", paginationInfo);
model.addAttribute("pageNo", pageNo);
model.addAttribute("perPage", perPage);
model.addAttribute("searchTitle", searchTitle);
model.addAttribute("search", search);
return "/admin/board";
}
AdminService.java
int totalRecordCount(SearchDTO searchDTO); 변경됨
@Service
public interface AdminService {
List<BoardDTO> boardList(SearchDTO searchDTO);
int totalRecordCount(SearchDTO searchDTO);
}
AdminServiceImpl
@Override
public int totalRecordCount(SearchDTO searchDTO) {
return adminDAO.totalRecordCount(searchDTO);
}
AdminDAO
public int totalRecordCount(SearchDTO searchDTO) {
return sqlSession.selectOne("admin.totalRecordCount", searchDTO);
}
admin-mapper.xml
파라미터타입 변경 searchDTO
JOIN 후, 검색관련 코드 추가
<select id="totalRecordCount" parameterType="searchDTO" resultType="Integer">
SELECT COUNT(*)
FROM board b JOIN member m ON b.mno=m.mno
<where>
<if test="searchTitle == 1">
b.board_title LIKE CONCAT('%',#{search},'%')
</if>
<if test="searchTitle == 2">
b.board_content LIKE CONCAT('%', #{search}, '%')
</if>
<if test="searchTitle == 3">
m.mname LIKE CONCAT('%', #{search}, '%')
</if>
</where>
</select>
board.jsp
<select name="searchTitle" id="searchTitle" class="form-control col-3">
<option value="1" <c:if test="${searchTitle eq 1 }">selected="selected"</c:if>>>제목 검색</option>
<option value="2" <c:if test="${searchTitle eq 2 }">selected="selected"</c:if>>>본문 검색</option>
<option value="3" <c:if test="${searchTitle eq 3 }">selected="selected"</c:if>>>작성자 검색</option>
</select>
* 초기화 버튼 id 추가
<button type="button" id="reset" class="btn btn-dark col-4">초기화</button>
* reset 클릭 기능 만들기
$('#reset').click(function(){
location.href="./board";
});
* 삭제된 글이면 0 = 안보임
* onclick="postDel(${row.board_no })"
* postDel을 동시에 사용하면서 .....
<c:choose>
<c:when test="${row.board_del eq 1}">
<i class="fa fa-eye" aria-hidden="true" onclick="postDel(${row.board_no })"></i>
</c:when>
<c:otherwise>
<i class="fa fa-eye-slash" aria-hidden="true" onclick="postDel(${row.board_no })"></i>
</c:otherwise>
</c:choose>
* 글 리스트에서 아이콘 눌러서 삭제하기
function postDel(no){
location.href="./postDel?no="+no;
}
AdminController.java
@GetMapping("/postDel")
public String postDel(@RequestParam("no") int no) {
int result = adminService.postDel(no);
return "redirect:/admin/board";
}
-> postDel 생성 (서비스, 서비스Impl, DAO)
AdminService.java
int postDel(int no);
AdminServiceImpl.java
AdminServiceImpl에 오류난거 잡아주기 = add @Override
@Override
public int postDel(int no) {
return adminDAO.postDel(no);
}
AdminDAO
실제로 삭제하는게 아니기 때문에 삭제=업데이트
public int postDel(int no) {
return sqlSession.update("admin.postDel", no);
}
admin-mapper.xml
<update id="postDel" parameterType="int">
UPDATE board SET board_del='0'
WHERE board_no=#{no}
</update>
* 글 삭제 눈 아이콘 (보이게/안보이게)의 id를 postDel로 동시에 쓸 수 있도록 sql문 작성
<update id="postDel" parameterType="Integer">
Update board SET board_del= CASE WHEN board_del='0' THEN '1'
ELSE '0' END WHERE board_no=#{no}
</update>
board.jsp
<table class="table table-hover">
<thead>
<tr class="row">
<th class="col-1 text-center">번호</th>
<th class="col-4 text-center">제목</th>
<th class="col-2 text-center">글쓴이</th>
<th class="col-3 text-center">날짜</th>
<th class="col-1 text-center">읽음</th>
<th class="col-1 text-center">보기</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list }" var="row">
<tr class="row<c:if test="${row.board_del eq 0}"> bg-dark</c:if>">
<td class="col-1 text-center">${row.board_no }</td>
<td class="col-4">${row.board_title }</td>
<td class="col-2"><a href="./board?searchTitle=3&search=${row.mname }">${row.mname }</a></td>
<td class="col-3 text-center">${row.board_date }</td>
<td class="col-1 text-center">${row.board_count }</td>
<td class="col-1 text-center">
<c:choose>
<c:when test="${row.board_del eq 1 }">
<i class="fa fa-eye" aria-hidden="true" onclick="postDel(${row.board_no })"></i>
</c:when>
<c:otherwise>
<i class="fa fa-eye-slash" aria-hidden="true" onclick="postDel(${row.board_no })"></i>
</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</tbody>
</table>
'개발 공부 Today I Learned' 카테고리의 다른 글
[국비 71일차 TIL] 스프링 레거시 & 스프링 부트 설정, 타임리프 (0) | 2024.03.06 |
---|---|
[국비 70일차 TIL] 쿠키 & 세션, 게시판 ip 검색 (0) | 2024.03.05 |
[국비 68일차 TIL] ID 중복검사, 검색창 생성 (0) | 2024.02.29 |
[국비 67일차 TIL] 글 제목 앞에 new 붙이기, 비밀번호 암호화 (0) | 2024.02.28 |
[spring] 회원가입 비밀번호 일치 확인 (0) | 2024.02.28 |
댓글