-
2022-03-14 스프링 부트 : DB 연동, 간단한 게시판, My Batis학원/Spring 2022. 3. 14. 15:42
데이터 베이스 연동하기
프로젝트 생성시 JDBC API를 추가로 선택
프로젝트 우클릭 properties -> Java Build Path
ojdbc6.jar 추가
↓application.properties에 추가로 적어줄 것
#oracle set spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.url=jdbc.oracle.thin:@localhost:1521:xe spring.datasource.username=scott spring.datasource.password=tiger
(작성 후 refresh)
test용으로 간단한 테이블 생성
Dto 파일 생성
@Data public class UserDto { private String id; private String name; }
Controller
@Controller public class UserController { @Autowired UserDao udao; @RequestMapping("/") public String userListPage(Model model) { List<UserDto> list = udao.list(); model.addAttribute("users", list); return "userlist"; } }
Dao
@Repository public class UserDao { @Autowired private JdbcTemplate template; //servlet-context.xml에 bean으로 넣거나 할 필요 x public List<UserDto> list() { String sql = "select * from myuser"; List<UserDto> list = template.query(sql, new BeanPropertyRowMapper<UserDto>(UserDto.class)); //ResultSet 사용 없이 검색 결과 레코드의 필드를 Dto 변수에 넣고 list에 add 동작을 실행 return list; } }
userlist.jsp
<body> <h1><% out.println("JdbcTemplate : UserList"); %></h1> <c:forEach var ="dto" items="${users}"> <h1>${dto.id} / ${dto.name}</h1> </c:forEach> </body>
실행 결과
-> 이 방법을 사용시 refres gradle 하게되면 ojdbc6.jar가 사라지게 되어 계속 다시 추가해줘야 함
프로젝트 생성 할 때 oracle Driver 를 추가한다
프로젝트를 생성하고 나면 ojdbc8 이 추가되어있다
-> 원래는 6을 사용하는데 8을 사용해도 크게 문제 없기 때문에 그냥 사용
aplication.properties는 위에서 작성했던 대로 #Server port, #about JSP, #oracle set 까지 작성
간단한 게시판 만들기
sql
create table bbs( id number(3), writer varchar2(30), title varchar2(30), content varchar2(1000) ); create sequence bbs_seq start with 1; insert into bbs values(bbs_seq.nextVal, 'Gildong', '반갑습니다', '반갑습니다 여러분'); insert into bbs values(bbs_seq.nextVal, 'Gilnam', '안녕하세요', '안녕하세요 여러분'); insert into bbs values(bbs_seq.nextVal, 'Gilbook', '어서오세요', '어서오세요 여러분'); select * from bbs
dto
@Data public class BbsDto { private int id; private String writer; private String title; private String content; }
Interface
public interface IBbsDao { public List<BbsDto> list(); //게시물 전체 조회 public int write(BbsDto bdto); //쓰기 public int update(BbsDto bdto); //수정 public int delete(int id); //삭제 public BbsDto veiw(int id); //게시물 하나 보기 }
Controller
package com.ezen.spg10; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.ezen.spg10.dao.BbsDao; @Controller public class BbsController { @Autowired BbsDao bdao; //메인페이지 @RequestMapping("/") public String root(Model model) { model.addAttribute("list", bdao.list()); return "list"; } //글 작성 폼으로 이동 @RequestMapping("/writeForm") public String writeFrom(Model model) { return "writeForm"; } //insert @RequestMapping("write") public String write(BbsDto bbsdto) { //매개변수명은 클래스이름을 소문자로 적는다 bdao.write(bbsdto); return "redirect:/"; } //상세보기 @RequestMapping("view") public String view(Model model, @RequestParam("id") int id) { model.addAttribute("dto",bdao.view(id)); return "view"; } //삭제 @RequestMapping("delete") public String delete(@RequestParam("id") int id) { bdao.delete(id); return "redirect:/"; } }
Dao
package com.ezen.spg10.dao; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import com.ezen.spg10.BbsDto; @Repository public class BbsDao implements IBbsDao{ @Autowired private JdbcTemplate template; //전체 조회 @Override public List<BbsDto> list() { String sql = "select * from bbs"; List<BbsDto> list = template.query(sql, new BeanPropertyRowMapper<BbsDto>(BbsDto.class)); return list; } //작성 @Override public int write(BbsDto bdto) { String sql = "insert into bbs values(bbs_seq.nextVal, ?,?,?)"; int result = template.update(sql, bdto.getWriter(), bdto.getTitle(), bdto.getContent()); return result; } //수정 @Override public int update(BbsDto bdto) { return 0; } //삭제 @Override public int delete(int id) { String sql = "delete from bbs where id = ?"; return template.update(sql, id); } //상세보기 @Override public BbsDto view(int id) { String sql = "select * from bbs where id=?"; BbsDto dto = template.queryForObject(sql, new BeanPropertyRowMapper<BbsDto>(BbsDto.class), id); return dto; } }
list.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>게시물 목록</title> </head> <body> <table width="500" cellpadding="0" cellspacing="0" border="1"> <tr align="center"> <td>번호</td><td>작성자</td><td>제목</td><td>삭제</td> </tr> <c:forEach items="${list}" var="dto"> <tr align="center"> <td>${dto.id}</td> <td>${dto.writer}</td> <td><a href="view?id=${dto.id}">${dto.title}</a></td> <td><a href="delete?id=${dto.id}"> X </a></td> </tr> </c:forEach> </table> <p><a href="writeForm"> 글 작성</a> </body> </html>
writeForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>글쓰기</title> </head> <body> <table widht="500" cellpadding="0" cellspacing="0" border="1"> <form action="write" method="post"> <tr> <td> 작성자 </td> <td> <input type="text" name="writer" size="50"></td> </tr> <tr> <td> 제목 </td> <td> <input type="text" name="title" size="50"></td> </tr> <tr> <td> 내용 </td> <td> <input type="text" name="content" size="50"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="입력"> <a href="/"> 목록 보기 </a> </td> </tr> </form> </table> </body> </html>
View.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>상세보기</title> </head> <body> 내용보기 <br> <hr> 작성자 : ${dto.writer }<br> 제목 : ${dto.title }<br> 내용 : ${dto.content }<br> <hr> <br> <p> <a href="/"> 목록보기</a> </p> </body> </html>
실행 결과
전체 조회 글쓰기를 완료하면 list 페이지로 돌아간다 (에러가 한번 나서 4번이 빠졌다) 글 제목을 클릭하면 상세보기로 이동 x 버튼을 누르면 글을 삭제하고 리스트를 보여준다
MyBatis
프로젝트 생성시에 MyBatis Framework 를 추가 생성
Application.properties에는 myBatis classpath를 추가하여 아래와 같이 작성
#Server port server.port=8070 #about JSP spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp #oracle set spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe spring.datasource.username=scott spring.datasource.password=tiger #mybatis mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
사진 위치에 mybatis.mapper 패키지를 만들고 ~~Dao.xml 을 만든다
classpath에 /**/**.xml의 ** 은 지정되지 않은 모종의 이름을 의미한다
/**/ -> 상위 폴더가 있을 수 도있고 없을 수도 있음
**.xml -> 이름은 모르겠지만 xml을 찾아주세요
src/main/java에 controller, dto, dao 패키지를 만들고 파일을 생성한다
Controller
@Controller public class UserController { @Autowired IUserDao udao; @RequestMapping("/") public String root(Model model) { List<UserDto> list = udao.list(); //인터페이스의 추상메서드를 호출하면, 인터페이스가 해당 메서드를 xml에서 실행 model.addAttribute("users", list); return "userlist"; } }
IUserDao (interface)
-> mybatis 사용시에는 @Mapper 어노테이션을 사용
@Mapper public interface IUserDao { public List<UserDto> list(); // }
-> 이 인터페이스는 UserDao.xml가 mapping하여 사용한다.
UserDao.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="com.ezen.spg11.dao.IUserDao"> <select id="list" resultType="com.ezen.spg11.dto.UserDto"> <!-- id = "메서드이름" resultType="리턴 될 타입 경로"--> select * from myuser </select> </mapper>
* 실행 순서
-> xml 파일 내 namespace 검색 -> 안쪽 태그들중 select id="메서드이름"에 해당하는 id(메서드이름)을 찾는다
-> <select></select> 내부의 sql문 실행
-> resultType에 맞는 자료형 형태로 리턴
실행결과
'학원 > Spring' 카테고리의 다른 글
스프링 부트 : 게시판 만들기 #2 게시판 출력(paging)/회원 정보 수정/글쓰기/댓글 작성 (0) 2022.03.16 2022-03-15 스프링 부트 : MyBatis db연동, 트랜잭션, 게시판 (0) 2022.03.15 스프링 부트 : jsp 사용 설정 / form 데이터 받기 / Lombok / validation (0) 2022.03.11 스프링부트 프로젝트 생성 (0) 2022.03.10 2022-03-10 spring 쇼핑몰 #admin2 (0) 2022.03.10