오늘은 공지사항 프론트 부분을 작성하고자 합니다 ~
타일즈로 만든 웹사이트라서 타일즈 부분 먼저 보여드리겠습니다 ~

service-tiles.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<!-- 고객센터 추가 -->
<!-- 공지사항 -->
<definition name="service_notice" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/cs_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_notice.jsp"></put-attribute>
</definition>
<definition name="service_noticeread" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/cs_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_noticeread.jsp"></put-attribute>
</definition>
<!-- 1:1 문의하기 -->
<definition name="service_insert" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/cs_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_insert.jsp"></put-attribute>
</definition>
<!-- faq -->
<definition name="service_faq" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/cs_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_faq.jsp"></put-attribute>
</definition>
<definition name="faq_search" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/cs_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_faqlist.jsp"></put-attribute>
</definition>
<!-- 공지사항 글작성 -->
<!-- 글등록성공 -->
<definition name="insertok" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/cs_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_insertok.jsp"></put-attribute>
</definition>
</tiles-definitions>
admin_tiles.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<!-- 충전소 관리-->
<definition name="station/list" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/admin/stationList.jsp"></put-attribute>
</definition>
<definition name="station/insert" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/admin/stationInsert.jsp"></put-attribute>
</definition>
<definition name="station/read" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/admin/stationRead.jsp"></put-attribute>
</definition>
<definition name="station/update" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/admin/stationUpdate.jsp"></put-attribute>
</definition>
<!-- 충전소 관리 끝 -->
<definition name="adminRegister" extends="admin">
<put-attribute name="content" value="/WEB-INF/admin/admin_register.jsp"></put-attribute>
</definition>
<definition name="adminList" extends="admin">
<put-attribute name="content" value="/WEB-INF/admin/list.jsp"></put-attribute>
</definition>
<definition name="adminRead" extends="admin">
<put-attribute name="content" value="/WEB-INF/admin/admin_read.jsp"></put-attribute>
</definition>
<definition name="adminUpdate" extends="admin">
<put-attribute name="content" value="/WEB-INF/admin/admin_update.jsp"></put-attribute>
</definition>
<!-- 관리자페이지 추가 -->
<!-- 문의사항 리스트확인 -->
<definition name="admin_service" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/admin/admin_service.jsp"></put-attribute>
</definition>
<!-- 문의사항 제목눌러서 상세보기 -->
<definition name="admin_service_read" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/admin/admin_service_read.jsp"></put-attribute>
</definition>
<!-- 답변하기 -->
<definition name="admin_service_reply" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/admin/admin_service_reply.jsp"></put-attribute>
</definition>
<!-- 답변내용보기 -->
<definition name="admin_service_reply_read" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/admin/admin_service_reply_read.jsp"></put-attribute>
</definition>
<definition name="admin_customer_read" extends="admin">
<put-attribute name="content" value="/WEB-INF/admin/admin_customer_read.jsp"></put-attribute>
</definition>
<definition name="admin_customer_update" extends="admin">
<put-attribute name="content" value="/WEB-INF/admin/admin_customer_update.jsp"></put-attribute>
</definition>
<!-- 공지사항 -->
<definition name="admin_noticelist" extends="admin">
<put-attribute name="content" value="/WEB-INF/service/service_notice2.jsp"></put-attribute>
</definition>
<definition name="service_noticeinsert" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_noticeinsert.jsp"></put-attribute>
</definition>
<definition name="service_noticeupdate" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_noticeupdate.jsp"></put-attribute>
</definition>
<definition name="service_noticereadadmin" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_noticereadadmin.jsp"></put-attribute>
</definition>
<!-- FAQ -->
<definition name="admin_faqlist" extends="admin">
<put-attribute name="content" value="/WEB-INF/service/service_faq2.jsp"></put-attribute>
</definition>
<definition name="service_faqread" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_faqreadadmin.jsp"></put-attribute>
</definition>
<definition name="service_faqinsert" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_faqinsert.jsp"></put-attribute>
</definition>
<definition name="service_faqupdate" extends="subTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/admin_menu.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/service/service_faqupdate.jsp"></put-attribute>
</definition>
</tiles-definitions>
FAQ 부분에서는 타일즈를 생략해도 되겠어오 .. o(*^@^*)o
공지사항의 경우 어드민은 글을 작성 / 수정 할 수 있도록하였고,
유저의 경우 글을 열람 / 첨부 파일 다운로드만 할 수 있도록하였습니다.
제일 먼저 service_notice(유저 화면)입니다. 공지사항 list를 볼 수 있도록 하였고요,
특별히 페이징이나 서치 기능은 넣지 않았습니다. 개발할 시간은 적고 FAQ/몽고DB 게시판도 만들 예정인데
몽고DB로 페이징하는 게 더 간단해서 하나만 넣었습니다 ~
forEach를 사용하여 notice_fix 값에 y가 있을 경우 우선으로 정렬하고
n일 경우 뒤에서 정렬하도록하였습니다.
<%@ 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">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>service</title>
</head>
<body>
<!-- User View -->
<div>
<h1 class="pagetitle">공지사항</h1>
<br />
<!-- 본문 시작 -->
<table class="table table-hover">
<thead>
<tr bgcolor="#FFFFFF">
<th>제목</th>
<th></th>
</tr>
<c:forEach var="notice" items="${noticelist }">
<c:choose>
<c:when test="${notice.notice_fix eq 'y'}">
<tr>
<td> 📌 <a
href="/evweb/notice/read.do?notice_no=${notice.notice_no }&state=READ">${notice.notice_title }</a></td>
<td scope="col" style="width: 200px">${notice.notice_writedate }</td>
</tr>
</c:when>
</c:choose>
</c:forEach>
<c:forEach var="notice" items="${noticelist }">
<c:choose>
<c:when test="${notice.notice_fix eq 'n'}">
<tr>
<td><a
href="/evweb/notice/read.do?notice_no=${notice.notice_no }&state=READ">${notice.notice_title }</a></td>
<td scope="col" style="width: 200px">${notice.notice_writedate }</td>
</tr>
</c:when>
</c:choose>
</c:forEach>
</thead>
</table>
</div>
</body>
</html>
service_notice2입니다. 동일하게 공지사항 리스트 화면이지만, 관리자가 보는 화면이라 글쓰기 버튼도 있습니다 ~
<%@ 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">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>service</title>
</head>
<body>
<!-- Admin View -->
<div>
<h1 class="pagetitle">공지사항</h1>
<br />
<!-- 본문 시작 -->
<table class="table table-hover">
<thead>
<tr bgcolor="#FFFFFF">
<th>제목</th>
<th></th>
</tr>
<c:forEach var="notice" items="${noticelist }">
<c:choose>
<c:when test="${notice.notice_fix eq 'y'}">
<tr>
<td>📌 <a
href="/evweb/notice/readadmin.do?notice_no=${notice.notice_no }&state=READ">${notice.notice_title }</a></td>
<td scope="col" style="width: 200px">${notice.notice_writedate }</td>
</tr>
</c:when>
</c:choose>
</c:forEach>
<c:forEach var="notice" items="${noticelist }">
<c:choose>
<c:when test="${notice.notice_fix eq 'n'}">
<tr>
<td><a
href="/evweb/notice/readadmin.do?notice_no=${notice.notice_no }&state=READ">${notice.notice_title }</a></td>
<td scope="col" style="width: 200px">${notice.notice_writedate }</td>
</tr>
</c:when>
</c:choose>
</c:forEach>
<!-- ```````````````````````````````````````````````````````````````````````` -->
</thead>
</table>
</div>
<div class="nav navbar-nav">
<button type="button" onclick="location.href='/evweb/service/noticeinsert'" style="margin-left: auto;" class="btn btn-primary"><i class="bi bi-pencil-square"></i> 등록</button>
<!-- <a href="/evweb/service/noticeinsert" style="text-align: right;">글쓰기</a> -->
</div>
</body>
</html>
service_noticeinsert입니다. sql문은 .. 중간에 한 번 수정되어서 공유하고자 넣었습니다.
처음에는 작성자 아이디를 수기로 입력했었는데요, 나중에는 아이디를 받아오게 변경하였고요 ~
내용에는 기본적으로 '안녕하세요, 차지모양입니다'를 적도록 하였습니다.
첨부파일을 업로드 할 수 있게 하였고, 하단에 라디오 버튼을 통해서 고정하기 O / X 를 구현하였습니다.
등록할 경우 글 등록이 완료되고, 취소할 경우 어드민 공지사항 리스트로 넘어오도록 하였습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- <link href="/erp/common/css/font-awesome.css" rel="stylesheet" /> -->
<!-- Custom styles for this template -->
</head>
<body>
<!-- CREATE SEQUENCE notice_tb_seq
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 9999
NOCYCLE
NOCACHE
NOORDER; -->
<div class="col-lg-8">
<!-- 가로범위 -->
<div>
<h5 class="card-title">
<strong>공지사항 작성하기</strong>
</h5>
<hr>
<form action="/evweb/service/noticeinsert" method="POST"
enctype="multipart/form-data">
<div class="row mb-3">
<label for="inputId" class="col-sm-2 col-form-label">작성자</label>
<div class="col-sm-10">
<p class="form-control-static">${user.manager_id }</p>
<input type="hidden" name="manager_id" value="${user.manager_id }">
<!-- 숨길 거면 -->
</div>
</div>
<div class="row mb-3">
<label for="inputEmail" class="col-sm-2 col-form-label">제목</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="notice_title">
</div>
</div>
<div class="row mb-3">
<label for="inputPassword" class="col-sm-2 col-form-label">내용</label>
<div class="col-sm-10">
<textarea class="form-control" style="height: 300px"
name="notice_content">안녕하세요, 차지모양입니다.</textarea>
</div>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label">파일첨부</label>
<div class="col-sm-10">
<input class="form-control" type="file" id="files" name="files"
multiple="multiple">
</div>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label">고정하기</label>
<fieldset>
X <input type="radio" name="notice_fix" value="n" checked /> O <input
type="radio" name="notice_fix" value="y" />
</fieldset>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<button type="submit" class="btn btn-primary">등록</button>
<input type="button"
onclick="location.href='/evweb/admin_notice.do'" value="취소"
class="btn btn-primary">
</div>
</div>
</form>
</div>
</div>
</body>
</html>
service_noticeread고, 일반 유저들이 보는 화면입니다.
공지사항 번호와 제목 / 내용 / 첨부파일이 보입니다.
<%@page import="com.project.file.BoardFileDTO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE>
<html>
<head>
<title>Insert title here</title>
<meta name="viewport"
content="wmanager_idth=device-wmanager_idth, initial-scale=1">
</head>
<body>
<!-- User View -->
<form class="form-horizontal"
action="/evweb/notice/read.do?state=UPDATE¬ice_no=${notice.notice_no }"
method="post">
<div class="col-lg-8">
<!-- 가로범위 -->
<div class="card-body">
<h3 class="card-title">
<br> <strong>공지사항 No. ${notice.notice_no }</strong>
</h3>
${notice.notice_writedate }
<hr />
<br>
<h4 class="row mb-3">
<label class="col-form-label"><strong>[
${notice.notice_title } ]</strong></label>
</h4>
<% List<BoardFileDTO> list = (List<BoardFileDTO>) request.getAttribute("boardfiledtolist");
int size = list.size();
if (size > 0) { %>
<div class="row mb-3">
<div class="col-sm-6">
<label class="col-sm-3 col-form-label">첨부파일</label>
<c:forEach var="file" items="${boardfiledtolist}">
<a
href="/evweb/notice/download/${notice.manager_id}/${notice.notice_no}/${file.file_no}">${file.originalFilename}</a>
</c:forEach>
</div>
</div>
<%} %>
<div class="row mb-3">
<div class="col-sm-10">
<div class="card">
<div class="card-body" style="height: 300px">
${notice.notice_content}</div>
</div>
</div>
</div>
<br> <br>
<div class="row mb-3">
<div class="col-sm-10" style="text-align: right;">
<%-- <button type="submit" class="btn btn-primary"
onclick="location.href='/evweb/reply/write.do?board_no=${list.board_no}'">수정</button> --%>
<button type="button" class="btn btn-primary"
onclick="location.href='/evweb/Notice/list.do'">목록</button>
<%-- <button type="button" class="btn btn-primary"
onclick="location.href='/evweb/notice/delete.do?notice_no=${notice.notice_no }'">삭제</button> --%>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
service_noticereadadmin입니다. 위와 동일한 내용이지만, 수정 / 삭제 버튼을 통해서 수정과 삭제할 수 있도록하였습니다.
<%@page import="com.project.file.BoardFileDTO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE>
<html>
<head>
<title>Insert title here</title>
<meta name="viewport" content="wmanager_idth=device-wmanager_idth, initial-scale=1">
</head>
<body>
<!-- Admin View -->
<form class="form-horizontal"
action="/evweb/notice/read.do?state=UPDATE¬ice_no=${notice.notice_no }"
method="post">
<div class="col-lg-8">
<!-- 가로범위 -->
<div class="card-body">
<h3 class="card-title">
<br>
<strong>공지사항 No. ${notice.notice_no }</strong>
</h3>
${notice.notice_writedate }
<hr />
<br>
<h4 class="row mb-3">
<label class="col-form-label"><strong>[ ${notice.notice_title } ]</strong></label>
</h4>
<% List<BoardFileDTO> list = (List<BoardFileDTO>) request.getAttribute("boardfiledtolist");
int size = list.size();
if (size > 0) { %>
<div class="row mb-3">
<div class="col-sm-6">
<label class="col-sm-3 col-form-label">첨부파일</label>
<c:forEach var="file" items="${boardfiledtolist}">
<a
href="/evweb/notice/download/${notice.manager_id}/${notice.notice_no}/${file.file_no}">${file.originalFilename}</a>
</c:forEach>
</div>
</div>
<%} %>
<div class="row mb-3">
<div class="col-sm-10">
<div class="card">
<div class="card-body" style="height: 300px">
${notice.notice_content}</div>
</div>
</div>
</div>
<br>
<br>
<div class="row mb-3">
<div class="col-sm-10" style="text-align: right;">
<button type="submit" class="btn btn-primary"
onclick="location.href='/evweb/reply/write.do?board_no=${list.board_no}'">수정</button>
<button type="button" class="btn btn-primary"
onclick="location.href='/evweb/admin_notice.do'">목록</button>
<button type="button" class="btn btn-primary"
onclick="location.href='/evweb/notice/delete.do?notice_no=${notice.notice_no }'">삭제</button>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
service_noticeupdate 수정하는 화면입니다.
기본적인 틀은 글 작성하는 화면에서 가져왔습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page import="com.project.notice.NoticeDTO"%>
<!DOCTYPE>
<html>
<head>
<title>Insert title here</title>
<link rel="stylesheet"
href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script
src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript">
</script>
<style type="text/css">
.btn-primary {
background-color: #F37321;
border-color: #F37321;
}
</style>
</head>
<body>
<div>
<h1 class="pagetitle">공지사항 수정하기</h1>
<br />
<form class="form-horizontal" action="/evweb/notice/update.do"
method="post">
<div class="form-group">
<div class="col-md-2 text-right">
<label id="notice_no" class="control-label">번호</label>
</div>
<div class="col-md-8">${notice.notice_no}</div>
</div>
<input type="hidden" name="notice_no" value="${notice.notice_no }">
<div class="form-group" style="">
<label class="col-sm-2 col-sm-2 control-label">작성자</label>
<div class="col-sm-10">
<p class="form-control-static">${notice.manager_id }</p>
<input type="hidden" name="manager_id"
value="${notice.manager_id }">
</div>
<!-- <div class="form-group"> -->
<label class="col-sm-2 col-sm-2 control-label">제목</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="notice_title"
value="${notice.notice_title }"> <span class="help-block">게시글
유형에 맞는 내용으로 작성 부탁드립니다. </span>
<!-- </div> -->
</div>
<!-- <div class="form-group">
<div class="col-md-2 text-right">
<label for="title" class="control-label">첨부파일</label>
</div> -->
<%-- <div class="col-md-8">
<!-- 디비에 저장된 파일명을 출력(클라이언트가 선택한 파일명) : JSTL -->
<c:forEach var="file" items="">
<h5><a href="/erp/board/download/${notice.manager_id}/${notice.notice_no}/${file.boardFileno}">${file.originalFilename}</a></h5>
</c:forEach>
</div> --%>
</div>
<div class="form-group">
<div class="col-md-2 text-right">
<label for="notice_writedate" class="control-label">최초 작성날짜</label>
</div>
<div class="col-md-8">${notice.notice_writedate }</div>
<input type="hidden" name="notice_writedate"
value="${notice.notice_writedate }">
</div>
<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">내용</label>
<div class="col-sm-8">
<textarea id="notice_content"
style="width: 100%; border: 1; overflow: visible; text-overflow: ellipsis;"
rows=15 name="notice_content">${notice.notice_content } </textarea>
</div>
</div>
<div class="form-group">
<div class="col-md-2 text-right">
<label for="notice_writedate" class="control-label">고정 여부</label>
</div>
<fieldset>
<c:choose>
<c:when test="${notice.notice_fix eq 'y'}">
X <input type="radio" name="notice_fix" value="n" />
O <input type="radio" name="notice_fix" value="y" checked />
</c:when>
</c:choose>
<c:choose>
<c:when test="${notice.notice_fix eq 'n'}">
X <input type="radio" name="notice_fix" value="n" checked />
O <input type="radio" name="notice_fix" value="y" />
</c:when>
</c:choose>
</fieldset>
</div>
</div>
<div class="row mb-3">
<div class="col-sm-10" style="text-align: right;">
<button type="submit" class="btn btn-primary">수정</button>
<button type="button" class="btn btn-primary"
onclick="location.href='/evweb/admin_notice.do'">취소</button>
</div>
</div>
</form>
</div>
</body>
</html>
내일은 FAQ의 백엔드 부분 보여드리겠습니다 ~ (*^▽^*)
'coding > Java' 카테고리의 다른 글
| 웹서비스 백엔드 개발자 과정 수료 후기 - 6 (API/미세먼지A) (0) | 2023.02.06 |
|---|---|
| 웹서비스 백엔드 개발자 과정 수료 후기 - 5 (게시판/FAQ B) (0) | 2023.02.05 |
| 웹서비스 백엔드 개발자 과정 수료 후기 - 4 (게시판/FAQ A) (0) | 2023.02.04 |
| 웹서비스 백엔드 개발자 과정 수료 후기 - 2 (게시판/공지사항A) (0) | 2023.02.02 |
| 웹서비스 백엔드 개발자 과정 수료 후기 - 1 (후기) (1) | 2023.02.01 |