회원가입1
ㄴ> service, daoimpl, controller 전부다 사용해 구현
1. member table 생성
create table tbl_member (
userid varchar(50) not null,
userpw varchar(50) not null,
username varchar(50) not null,
email varchar(100) default '',
regdate datetime default now(),
primary key(userid)
);
2. MemberVO --> domain에
package org.zerock.domain;
import lombok.Data;
@Data
public class MemberVO {
private String userid;
private String userpw;
private String username;
private String email;
private String regdate;
}
3. MemberDAO.java
package org.zerock.persistence;
import org.zerock.domain.MemberVO;
public interface MemberDAO {
public void create(MemberVO vo) throws Exception; //회원가입
}
4. MemberDAOImpl.java
package org.zerock.persistence;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import org.zerock.domain.MemberVO;
@Repository //MemberDAO를 스프링 구조에 인식 시키겠다고 선언
public class MemberDAOImpl implements MemberDAO{
@Inject
private SqlSession sqlSession;
private static final String namespace = "org.zerock.mapper.MemberMapper";
@Override
public void create(MemberVO vo) {
sqlSession.insert(namespace+".insertMember",vo);
}
}
5. memberMapper.xml --> resources 에
<?xml version="1.0" encoding="UTF-8"?>
<!-- db와 관련된 xml 파일임을 인식하기 위해 3줄 필요 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace : member table의 이름 임의로 정함 -->
<mapper namespace="org.zerock.mapper.MemberMapper">
<insert id="insertMember">
insert into tbl_member (userid, userpw, username, email, regdate) values (#{userid},#{userpw},#{username},#{email},#{regdate})
</insert>
</mapper>
6. MemberDAOTest.java --> test/java에
package org.zerock.controller;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.MemberVO;
import org.zerock.persistence.MemberDAO;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/root-context.xml" })
public class MemberDAOTest {
@Inject
private MemberDAO dao; //부모 클래스 타입으로 객체 선언
private static Logger logger = LoggerFactory.getLogger(MemberDAOTest.class);
@Test
public void testInsertMember() throws Exception{
MemberVO vo = new MemberVO();
vo.setUserid("1111");
vo.setUserpw("1111");
vo.setUsername("park");
vo.setEmail("1111@nate.com");
//vo.setRegdate("2023-03-23 10:45:35");
dao.create(vo);
}
}
7. MemberService.java
package org.zerock.service;
import org.zerock.domain.MemberVO;
public interface MemberService {
public void regist(MemberVO member) throws Exception;
}
8. MemberServiceImpl.java
package org.zerock.service;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import org.zerock.domain.MemberVO;
import org.zerock.persistence.MemberDAO;
@Service
public class MemberServiceImpl implements MemberService {
@Inject
private MemberDAO dao;
@Override
public void regist(MemberVO member) throws Exception {
dao.create(member);
}
}
9. MemberController.java
package org.zerock.controller;
import java.text.SimpleDateFormat;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.MemberVO;
import org.zerock.service.MemberService;
@Controller
@RequestMapping("/member/*")
public class MemberController {
private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
@Inject
private MemberService service;
@GetMapping("/join")
public void joinGET(MemberVO member) throws Exception {
logger.info("join get ...........");
}
@PostMapping("/join")
public String joinPOST(MemberVO member, RedirectAttributes rttr) throws Exception {
logger.info("join post ...........");
//오늘 날짜
java.util.Date today = new java.util.Date();
SimpleDateFormat cal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String signdate = cal.format(today);
member.setRegdate(signdate);
logger.info(member.toString());
service.regist(member);
return "redirect:/";
}
}
10. header.jsp
<a href="/member/login">[로그인]</a>
<a href="/member/join">[회원가입]</a>
11. join.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/include/header.jsp" %>
<center>
<h3>JOIN PAGE</h3>
<form method="post">
<table>
<tr>
<td>아이디</td>
<td><input name="userid"></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input name="userpw"></td>
</tr>
<tr>
<td>이름</td>
<td><input name="username"></td>
</tr>
<tr>
<td>메일</td>
<td><input type="email" name="email"></td>
</tr>
<tr>
<td></td>
<td><button type="submit">회원가입</button></td>
</tr>
</table>
</form>
</center>
<%@ include file="/WEB-INF/views/include/footer.jsp" %>
회원가입2
* 여태까지 한 건 controller --> serviceimpl --> daoimpl --> mapper의 순서임
1. serviceimpl 없이 하고자 하면 --> cotroller에서 daoimpl로 일 바로 던져줌
ㄴ> service의 inject 를 controller의 inject로 바꾸기
ㄴ> service.regist(member) 를 dao.create(member) 로 수정
MemberController.java
package org.zerock.controller;
import java.text.SimpleDateFormat;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.MemberVO;
import org.zerock.service.MemberService;
@Controller
@RequestMapping("/member/*")
public class MemberController {
private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
@Inject
private MemberDAO dao;
@GetMapping("/join")
public void joinGET(MemberVO member) throws Exception {
logger.info("join get ...........");
}
@PostMapping("/join")
public String joinPOST(MemberVO member, RedirectAttributes rttr) throws Exception {
logger.info("join post ...........");
//오늘 날짜
java.util.Date today = new java.util.Date();
SimpleDateFormat cal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String signdate = cal.format(today);
member.setRegdate(signdate);
logger.info(member.toString());
dao.create(member);
return "redirect:/";
}
}
2. controller에서 mapper(sqlsession)으로 바로 일시키기(serviceimpl, daoimpl 둘다 생략)
ㄴ> daoimpl inject랑 insert 구문 가져오기
MemberController.java
package org.zerock.controller;
import java.text.SimpleDateFormat;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.MemberVO;
import org.zerock.service.MemberService;
@Controller
@RequestMapping("/member/*")
public class MemberController {
@Inject
private SqlSession session;
private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
private static String namespace = "org.zerock.mapper.BoardMapper"; // 변수처리
@GetMapping("/join")
public void joinGET(MemberVO member) throws Exception {
logger.info("join get ...........");
}
@PostMapping("/join")
public String joinPOST(MemberVO member, RedirectAttributes rttr) throws Exception {
logger.info("join post ...........");
//오늘 날짜
java.util.Date today = new java.util.Date();
SimpleDateFormat cal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String signdate = cal.format(today);
member.setRegdate(signdate);
logger.info(member.toString());
sqlSession.insert(namespace+".insertMember",member);
return "redirect:/";
}
}
* inject 여러개 쓰려면 --> 각각 어노테이션 해줘야함
@Inject
private MemberService service;
@Inject
private MemberDAO dao;
@Inject
private SqlSession sqlSession;
로그인1 --> myweb project에서 구현 (db: myweb)
ㄴ> service, daoimpl, controller 전부다 사용해 구현
1. MemberDAO.java
package org.zerock.dao;
import org.zerock.dto.LoginDTO;
import org.zerock.model.MemberVO;
public interface MemberDAO {
public void create(MemberVO m) throws Exception; // 회원가입 insert
public MemberVO login(LoginDTO dto) throws Exception; // 회원 한명(select)
}
2. MemberDAOImpl.java
package org.zerock.dao;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import org.zerock.dto.LoginDTO;
import org.zerock.model.MemberVO;
@Repository
public class MemberDAOImpl implements MemberDAO{
@Inject
private SqlSession sqlSession;
private static final String namespace = "org.zerock.mapper.MemberMapper";
@Override
public void create(MemberVO m) throws Exception {
sqlSession.insert(namespace+".insertMember", m);
}
@Override
public MemberVO login(LoginDTO dto) throws Exception {
return sqlSession.selectOne(namespace+".login", dto);
}
}
3. memberMapper.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="org.zerock.mapper.MemberMapper">
<insert id="insertMember">
insert into member (userid, userpw, username, email, signdate) values (#{userid}, #{userpw}, #{username}, #{email}, #{signdate})
</insert>
<select id="login" resultType="MemberVO">
select * from member where userid = #{userid} and userpw = #{userpw}
</select>
</mapper>
4. MemberDAOTest.java
package org.zerock.controller;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.dao.MemberDAO;
import org.zerock.dto.LoginDTO;
import org.zerock.model.MemberVO;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/root-context.xml" })
public class MemberDAOTest {
@Inject
private MemberDAO dao;
private static Logger logger = LoggerFactory.getLogger(MemberDAOTest.class);
//@Test
public void testInsertMember() throws Exception {
MemberVO m = new MemberVO();
m.setUserid("2222");
m.setUserpw("2222");
m.setUsername("이돌이");
m.setEmail("2222@naver.com");
m.setSigndate("2023-05-03 10:05:30");
//logger.info(m.toString());
//logger.info("join_ok====");
//dao.create(m);
}
@Test
public void testlogin() throws Exception {
LoginDTO dto = new LoginDTO();
dto.setUserid("1111");
dto.setUserpw("1111");
logger.info(dao.login(dto).toString());
}
}
5. MemberService.java
package org.zerock.service;
import org.zerock.dto.LoginDTO;
import org.zerock.model.MemberVO;
public interface MemberService {
public void create(MemberVO m) throws Exception;
public MemberVO login(LoginDTO dto) throws Exception; // 회원 한명(select)
}
6. MemberServiceImpl.java
package org.zerock.service;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import org.zerock.dao.MemberDAO;
import org.zerock.dto.LoginDTO;
import org.zerock.model.MemberVO;
@Service
public class MemberSeriveImpl implements MemberService{
@Inject
private MemberDAO dao;
@Override
public void create(MemberVO m) throws Exception {
dao.create(m);
}
@Override
public MemberVO login(LoginDTO dto) throws Exception {
return dao.login(dto);
}
}
7. MemberController.java
package org.zerock.controller;
import java.text.SimpleDateFormat;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
import javax.xml.stream.events.Namespace;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.dto.LoginDTO;
import org.zerock.model.MemberVO;
import org.zerock.service.MemberService;
@Controller
@RequestMapping("/member/*")
public class MemberController {
private Logger logger = LoggerFactory.getLogger(MemberController.class);
@Inject
private MemberService service;
@GetMapping("/join")
public void joinGET(MemberVO m) throws Exception {
//logger.info("join get=====");
}
@PostMapping("/join")
public String joinPOST(MemberVO m, RedirectAttributes rttr) throws Exception {
logger.info("join post=====");
// 오늘날짜
java.util.Date today = new java.util.Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String signdate = sf.format(today);
m.setSigndate(signdate);
logger.info(m.toString());
service.create(m);
return "redirect:/";
}
@GetMapping("/login")
public void loginGET() throws Exception {
logger.info("login get===");
}
@PostMapping("/login")
public String loginPOST(LoginDTO dto, HttpSession session) throws Exception {
logger.info("login post====");
logger.info(dto.toString());
MemberVO m = service.login(dto);
if(m != null) {
session.setAttribute("id", m.getUserid());
session.setAttribute("name", m.getUsername());
}
return "redirect:/";
}
}
8. login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/include/header.jsp" %>
<center>
<h3>로그인</h3>
<form method="post">
<table>
<tr>
<td>아이디</td>
<td><input name="userid"></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input name="userpw"></td>
</tr>
<tr>
<td></td>
<td><button type="submit">로그인</button></td>
</tr>
</table>
</form>
</center>
<%@ include file="/WEB-INF/views/include/footer.jsp" %>
로그인2 --> service, daoimpl 제외하고 controller만으로 구현
ㄴ> model 2에서는 아이디, 비밀번호 변수 두개를 전달했지만
mybatis를 사용하고, xml인 경우에는 변수 하나밖에 전달못함 그러므로 객체로 전달할 것
1. org.zerock.dto 패키지 생성 --> src/main/java에
2. LoginDTO.java
package org.zerock.dto;
import lombok.Data;
@Data
public class LoginDTO {
private String userid;
private String userpw;
}
3. MemberController.java --> 추가
@GetMapping("/login")
public void loginGET() throws Exception {
logger.info("login get ...........");
}
@PostMapping("/login")
public String loginPOST(LoginDTO dto, HttpSession session) throws Exception {
logger.info("login post ...........");
logger.info(dto.toString());
MemberVO vo = sqlSession.selectOne(namespace+".login",dto);
if(vo != null) {
session.setAttribute("id", vo.getUserid());
session.setAttribute("name", vo.getUsername());
}
return "redirect:/";
}
* dto와 m 둘다 사용한다면 --> 두개 다에 아이디와 비밀번호가 담김(아래 사진 참고)
@GetMapping("/login")
public void loginGET() throws Exception {
logger.info("login get ...........");
}
@PostMapping("/login")
public String loginPOST(LoginDTO dto, MemberVO m, HttpSession session) throws Exception {
logger.info("login post ...........");
logger.info(dto.toString());
logger.info(m.toString());
MemberVO vo = sqlSession.selectOne(namespace+".login",dto);
if(vo != null) {
session.setAttribute("id", vo.getUserid());
session.setAttribute("name", vo.getUsername());
}
return "redirect:/";
}
4. memberMapper.xml --> 추가
<select id="login" resultType="MemberVO">
select * from tbl_member where userid = #{userid} and userpw = #{userpw}
</select>
5. login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/include/header.jsp" %>
<center>
<h3>LOGIN PAGE</h3>
<form method="post">
<table>
<tr>
<td>아이디</td>
<td><input name="userid"></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input name="userpw"></td>
</tr>
<tr>
<td></td>
<td><button type="submit">로그인</button></td>
</tr>
</table>
</form>
</center>
<%@ include file="/WEB-INF/views/include/footer.jsp" %>
6. header.jsp
id : ${sessionScope.id}<br>
name : ${sessionScope.name}<br>
<td align=right>
<c:choose>
<c:when test="${sessionScope.id != null }">
<a href="/member2/logout">[로그아웃]</a>
<a href="/member2/joinup">[회원수정]</a>
</c:when>
<c:otherwise>
<a href="/member2/login">[로그인]</a>
<a href="/member2/join">[회원가입]</a>
</c:otherwise>
</c:choose>
</td>
7. MemberController.java --> 수정(else 추가)
@PostMapping("/login")
public String loginPOST(LoginDTO dto, HttpSession session, RedirectAttributes rttr) throws Exception {
logger.info("login post ...........");
logger.info(dto.toString());
MemberVO vo = sqlSession.selectOne(namespace+".login",dto);
if(vo != null) {
session.setAttribute("id", vo.getUserid());
session.setAttribute("name", vo.getUsername());
return "redirect:/";
} else {
rttr.addFlashAttribute("msg", "아이디나 비밀번호가 올바르지않습니다.");
return "redirect:login";
}
}
8. login.jsp --> 추가
<script>
var msg = "${msg}"; //로그인 정보가 틀릴 경우
if(msg != ""){
alert(msg);
}
</script>
로그아웃
1. MemberController.java --> 추가
@RequestMapping(value = "/logout", method = RequestMethod.GET)
public String logout(HttpSession session) throws Exception {
session.invalidate();
return "redirect:/";
}
회원수정1
ㄴ> service, daoimpl, controller 전부다 사용해 구현
ㄴ> 전달할 땐 String 변수로, 리턴할땐 MemberVO m 객체로
1. MemberController.java --> 추가
@GetMapping("/joinup")
public void joinupGET(MemberVO m, HttpSession session, Model model) throws Exception {
//logger.info("joinup get====");
String session_id = (String)session.getAttribute("id");
//logger.info(session_id);
m = service.joinup(session_id); // m이라는 객체에 다시 담기(리턴 단계에서)
model.addAttribute("modify", m); // 객체로 전달(jsp에서 modify.~~~ 로 사용)
}
@PostMapping("/joinup")
public String joinupPOST(MemberVO m, RedirectAttributes rttr) throws Exception {
logger.info("joinup post======");
logger.info(m.toString());
service.update(m);
rttr.addFlashAttribute("msg", "modify"); // 수정 성공했다면 modify 전달
return "redirect:joinup";
}
2. MemberDAO.java --> 추가
public MemberVO joinup(String m) throws Exception; // 회원 수정 회원 한명
public void update(MemberVO m) throws Exception; // 회원수정
3. MemberDAOImpl.java --> 추가
@Override
public MemberVO joinup(String m) throws Exception {
return sqlSession.selectOne(namespace+".join", m);
}
@Override
public void update(MemberVO m) throws Exception {
sqlSession.update(namespace+".updateMember", m);
}
4. MemberDAOTest.java --> 추가
@Test
public void testjoinup() throws Exception {
MemberVO m = new MemberVO();
m.setUserid("1111");
m.setUserpw("1111");
m.setUsername("일순이22");
m.setEmail("1111@naver.com");
dao.update(m);
logger.info("수정완료==");
}
5. MemberService.java --> 추가
public MemberVO joinup(String m) throws Exception; // 회원 수정 회원 한명
public void update(MemberVO m) throws Exception; // 회원수정
6. MemberServiceImpl.java--> 추가
@Override
public MemberVO joinup(String m) throws Exception {
return dao.joinup(m);
}
@Override
public void update(MemberVO m) throws Exception {
dao.update(m);
}
7. memberMapper.xml --> 추가
<select id="join" resultType="MemberVO">
select * from member where userid = #{session_id}
</select>
<update id="updateMember">
update member set userpw = #{userpw}, username = #{username}, email = #{email} where userid = #{userid}
</update>
8. joinup.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/include/header.jsp" %>
<script>
var msg = "${msg}";
if(msg == "modify"){
alert("수정 되었습니다.");
}
</script>
<center>
<h3>JOINUP PAGE</h3>
<form method="post">
<table>
<tr>
<td>아이디</td>
<td><input name="userid" value="${modify.userid }" readonly></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input name="userpw" value="${modify.userpw }"></td>
</tr>
<tr>
<td>이름</td>
<td><input name="username" value="${modify.username }"></td>
</tr>
<tr>
<td>메일</td>
<td><input name="email" value="${modify.email }"></td>
</tr>
<tr>
<td></td>
<td><button type="submit">회원수정</button></td>
</tr>
</table>
</form>
</center>
<%@ include file="/WEB-INF/views/include/footer.jsp" %>
회원수정2 --> service, daoimpl 제외하고 controller만으로 구현
1. MemberController.java --> 추가
@GetMapping("/joinup")
public void joinupGET(MemberVO member, HttpSession session, Model model) throws Exception {
logger.info("joinup get ...........");
String session_id = (String)session.getAttribute("id");
member = sqlSession.selectOne(namespace+".join",session_id);
model.addAttribute("modify", member);
}
@PostMapping("/joinup")
public String joinupPOST(MemberVO member, RedirectAttributes rttr) throws Exception {
logger.info("joinup post ...........");
logger.info(member.toString());
sqlSession.update(namespace+".updateMember",member);
rttr.addFlashAttribute("msg","modify");
return "redirect:joinup";
}
2. memberMapper.xml --> 추가
<select id="join" resultType="MemberVO"> <!-- 한건의 회원데이터 가져오기 -->
select * from tbl_member where userid = #{session_id}
</select>
<update id="updateMember"> <!-- 회원수정 -->
update tbl_member set userpw = #{userpw}, username = #{username}, email = #{email} where userid = #{userid}
</update>
3. joinup.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/include/header.jsp" %>
<script>
var msg = "${msg}";
if(msg == "modify"){
alert("수정 되었습니다.");
}
</script>
<center>
<h3>JOINUP PAGE</h3>
<form method="post">
<table>
<tr>
<td>아이디</td>
<td><input name="userid" value="${modify.userid }" readonly></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input name="userpw" value="${modify.userpw }"></td>
</tr>
<tr>
<td>이름</td>
<td><input name="username" value="${modify.username }"></td>
</tr>
<tr>
<td>메일</td>
<td><input name="email" value="${modify.email }"></td>
</tr>
<tr>
<td></td>
<td><button type="submit">회원수정</button></td>
</tr>
</table>
</form>
</center>
<%@ include file="/WEB-INF/views/include/footer.jsp" %>
'JAVA > spring' 카테고리의 다른 글
스프링 첨부파일 구현 (0) | 2023.05.08 |
---|---|
스프링 댓글 구현 (0) | 2023.05.04 |
스프링 Board 구현_넘버링, 검색 (0) | 2023.05.03 |
스프링 Board 구현_예외처리, 페이징 (1) | 2023.05.02 |
스프링 Board 구현 (0) | 2023.04.28 |