SlideShare une entreprise Scribd logo
1  sur  37
Spring Data JPA 게시판(1)
- 게시판 리스트 보기
- SPRING BOOT, ORACLE
TOPCREDU.CO.KR 이종철
1. 개요
 JPA로 게시판을 만든다는 것은 맞지 않을 수도 있지만 기능과 사용방법을 익힌다
는 관점에서 간단히 만들어 보자. 본예제는 오라클 DB를 기준으로 작성되었으며
MySQL(MariaDB) 예제는 다음 URL에서 참조하면 된다.
http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=244
 글리스트 보기
 구현기술
 Spring Boot, Spring WEB MVC, RestController
 Spring Data JPA(Hibernate)
 기본 JpaRepository
 Query Method
 Oracle DataBase
 UI : JSP, BootStrap, AngularJS, JSON
 Logging: DriverSpy www.topcredu.co.kr
2. TABLE 및 SEQUENCE - 1
 테이블 및 시퀀스는 엔티티를 정의해서 자동 생성시킬 예정이니 DB쪽에 생성할 필요
없다. 구조만 확인하자.
 Board 테이블의 PK(ID칼럼, Primary Key)는 오라클 시퀀스를 이용할 것이다. MySQL이
라면 자동증분 칼럼을 사용하니 특별히 생성할 필요 없다.(본 예제는 오라클을 기준으
로 한다.)
 엔티티를 만들 때 키 부분(ID칼럼)에 어노테이션 사용하는 것만 DB가 무엇이냐에 따
라 좀 다르니 확인하면 된다.
www.topcredu.co.kr
2. TABLE 및 SEQUENCE - 2
create table board (
id number(10,0) not null,
content varchar2(4000 char) not null,
name varchar2(20 char) not null,
passwd varchar2(20 char) not null,
readcount number(5) default 0 not null,
regdate date default sysdate not null,
-- 답변인경우 어느글의 답변인지 상위글 번
호,최상위글인 경우 자신의 글번호 동일,
-- 리스트보기에서 정렬시 우선 reply로 우
선하게 된다.
reply number(5) not null,
-- 하나의 글 아래에 생기는 모든 답변들에 대해
순차적으로 1씩 증가(reply_level과 관계없이)
replylevel number(5) default 0 not null,
-- 1차,2차 답글인지 여부, 글에 답변이 두개면
그 두답변은 reply_level이 같다.
-- 리스트보기에서 reply_level에 따라 들여쓰기
를 한다.
replystep number(5) default 0 not null,
title varchar2(500 char) not null,
primary key (id)
)
create sequence BOARD_SEQ;
 JPA에서 자동생성한 DDL 스크립트
www.topcredu.co.kr
3. 프로젝트 생성 및 메이븐 설정, 로깅,
오라클 설정 - 1
 STS -> Spring Starter Project
Name : jpaboard
Group : ojc.asia
Artifact : jpaboard
Description : Spring Data JPA Board
pckage : jpa.board 입력
 다음 창에서
Core : Lombok
SQL : JPA
Web : Web 선택
www.topcredu.co.kr
3. 프로젝트 생성 및 메이븐 설정, 로깅,
오라클 설정 - 2
www.topcredu.co.kr
www.topcredu.co.kr
4. pom.xml - 1
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ojc.asia</groupId>
<artifactId>jpaboard</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>jpaboard</name>
<description>Spring Data JPA Board</description>
<parent><groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository --
>
</parent>
<properties>
<project.build.sourceEncoding>UTF-
8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties> <dependencies><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-
jpa</artifactId>
</dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope></dependency>
www.topcredu.co.kr
4. pom.xml - 2
<!-- JSP, JSTL 사용위해 -->
<dependency><groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency> <dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope></dependency>
<!-- DriverSpy -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
<!-- for oracle -->
<dependency><groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.1.0.7.0</version></dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-
plugin</artifactId>
</plugin>
</plugins></build><repositories>
<repository><id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>https://maven.oracle.com</url>
</repository>
</repositories>
</project> www.topcredu.co.kr
5. application.properties
spring.datasource.platform=oracle
spring.datasource.sql-script-encoding=UTF-8
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@19
2.168.0.27:1521:onj
spring.datasource.username=test
spring.datasource.password=test
#spring.datasource.driver-class-
name=oracle.jdbc.driver.OracleDriver
spring.datasource.driver-class-name =
net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.ddl-auto=update
#hibernate config
spring.jpa.database-
platform=org.hibernate.dialect.Oracle10gDialect
logging.level.jpa=DEBUG
#view
spring.mvc.view.prefix=/jsp/
spring.mvc.view.suffix=.jsp
www.topcredu.co.kr
6. log4jdbc.log4j2.properties
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
www.topcredu.co.kr
7. logback.xml
<logger name="jdbc.resultsettable" level="DEBUG"
additivity="false">>
<appender-ref ref="STDOUT" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
www.topcredu.co.kr
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder> <pattern>%d{yyyyMMdd HH:mm:ss.SSS}
[%thread] %-3level %logger{5} - %msg %n</pattern>
</encoder></appender>
<logger name="jdbc" level="OFF"/>
<logger name="jdbc.sqlonly" level="DEBUG"
additivity="false">>
<appender-ref ref="STDOUT" />
</logger>
<logger name="jdbc.sqltiming" level="INFO"
additivity="false">> <appender-ref ref="STDOUT" />
</logger>
8. board.java - 1
@Column(length=20, nullable=false)
protected String name;
@Column(length=20, nullable=false)
protected String passwd;
@Column(length=500, nullable=false)
protected String title;
@Column(length=4000, nullable=false)
protected String content;
//날짜기본형식 time, day, month, year 형태저장
@Column(nullable=false, columnDefinition = "date default
sysdate")
@Temporal(TemporalType.TIMESTAMP)
protected Date regdate = new Date();
@Column(nullable=false, columnDefinition = "number(5)
default 0")
protected Integer readcount = 0;
package jpa.board.model;
@Entity @Getter @Setter
// 시퀀스의 시작값은 1
// 시퀀스의 기본 allocationSize는50, 번호가 50부터 생기므로
1로
@SequenceGenerator(name="BOARD_SEQ_GENERATOR",
sequenceName="BOARD_SEQ",
initialValue=1, allocationSize=1)
public class Board {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="BOARD_SEQ_GENERATOR") @Column(length=10)
protected Integer id;
8. board.java - 2
// 1차,2차 답글인지 여부
// 하나의 글에 답변이 두개면 그 두답변은 reply_level이
같다.
// 리스트보기에서 reply_level에 따라 들여쓰기를 한다.
@Column(nullable=false,columnDefinition =
"number(5) default 0", length=10)
protected Integer replylevel = 0;
}
// 답변인경우 어느글의 답변인지 상위글번호
// 최상위글인 경우 자신의 글번호 동일하다.
// 리스트보기에서 정렬시 우선적으로 reply로 정렬
@Column(nullable=false, columnDefinition =
"number(5)")
protected Integer reply = 0 ;
// 글아래 모든 답변들에 대해 reply_level과 관계없이 1
씩 증가
@Column(nullable=false, columnDefinition = "number(5)
default 0")
protected Integer replystep = 0;
프로젝트에서 마우스 우측버튼 -> Run As ->
Spring Boot App로 실행 후 오라클쪽에 테이
블이 생성되는 것을 확인하자.
www.topcredu.co.kr
9. 게시판리스트 보기 - 1
 Spring JDBC 또는 MyBatis로 만들 때 보다 쉽고
빠르게 작성할 수 있다.
 스프링 컨트롤러는 RestController를 적용 했으
며, 뷰 페이지에 Bootstrap 및 AngulerJS 적용했
다.
 프로젝트 전체 구조는 다음과 같다.
www.topcredu.co.kr
9. 게시판리스트 보기(BoardRepository.java) - 2
 기본적으로 제공하는 JpaRepository를 상속받아 만들면 된다.
 JpaRepository는 PagingAndSortingRepository를 상속받았고
PagingAndSortingRepository는 CrudRepository(기본적인 CRUD 기능을 제공한다)를
상속 받았으며 다시 CrudRepository는 Repository 인터페이스를 상속받았다.
 그러므로 JpaRepository는 모든 기능을 다 사용할 수 있고 추가적으로 영속성 컨텍스
트에 flush하거나 엔티티를 배치로 삭제할 수 있다.
 기본 기능만으로도 게시판 기능을 구현할 수 있으므로 JpaRepository를 상속 받자.
www.topcredu.co.kr
package jpa.board.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import jpa.board.model.Board;
public interface BoardRepository extends JpaRepository<Board, Integer> {
}
9. 게시판리스트 보기(BoardService.java) - 3
www.topcredu.co.kr
package jpa.board.service;
import org.springframework.data.domain.Page;
import jpa.board.model.Board;
public interface BoardService {
//게시판 리스트 보기
public Page<Board> findAll(Integer curPage);
}
9. 게시판리스트 보기(BoardServiceImpl.java) - 4
 JpaRepository의 findAll() 메소드를 호출만 하면 되는데 페이징 기능을 구현하기 위해
PageRequest를 만들고 이를 findAll() 메소드의 인자로 넣어주면 된다.
 Board 테이블에서 정렬한 칼럼이 두개 이상이므로 Sort 를 new하면서 Order를 필요
한 만큼 생성해주면 되고 ASC는 오름차순, DESC는 내림차순, 그뒤의 문자열은 Board
엔티티의 속성이다.
www.topcredu.co.kr
package jpa.board.service;
@Service
public class BoardServiceImpl implements
BoardService {
@Autowired
BoardRepository boardRepository;
@Override
//-----------------------------------------
// 게시판 리스트 보기, 한페이지에 3개씩
// curPage:요청하는 페이지, 첫페이지는 0
//-----------------------------------------
public Page<Board> findAll(Integer curPage) {
PageRequest pr = new PageRequest(curPage, 3,
new Sort(
new Order(Direction.DESC, "reply"),
new Order(Direction.ASC, "replystep")));
return boardRepository.findAll(pr);
}
}
10. 컨트롤러(BoardController.java)
www.topcredu.co.kr
package jpa.board.controller;
@RestController
@RequestMapping("/board")
public class BoardController {
@Autowired
BoardService boardService;
//---------------------------------------------
// 루트요청(localhost:8080/board/)시 리스트 보기
로
//---------------------------------------------
@RequestMapping(method = RequestMethod.GET)
public ModelAndView index() {
//jsp아래 board.jsp 호출
return new ModelAndView("board");
}
//---------------------------------------------
// 게시판 리스트 보기
//---------------------------------------------
@RequestMapping(value="/{curPage}", method =
RequestMethod.GET)
public ResponseEntity<Page<Board>> list(Model model,
Pageable pageable, @PathVariable Integer curPage) {
Page<Board> page = boardService.findAll(curPage);
return new ResponseEntity<Page<Board>>(page,
HttpStatus.OK);
}
}
12. src/main/webapp/js /app.js
www.topcredu.co.kr
'use strict';
var App = angular.module('myBoard',[]);
13. src/main/webapp/js/board_service.js
www.topcredu.co.kr
'use strict';
App.factory('BoardService', ['$http', '$q', function($http, $q){
return {
list: function(curPage) {
return $http.get('http://localhost:8080/board/' + curPage)
.then(
function(response){
console.log("[service:list]server call suceeded.");
return response.data;
},
function(errResponse){
console.error('Error while fetching contents');
return $q.reject(errResponse);
}
);
}
};
}]);
14. src/main/webapp/js/board_controller.js
www.topcredu.co.kr
'use strict';
App.controller('BoardController', ['$scope', 'BoardService',
function($scope, BoardService) {
var self = this;
self.board={id:null,name:'',passwd:'',title:'',content:''}; self.page=[];
//리스트 보기
self.list = function(curPage){
BoardService.list(curPage)
.then( function(data) {
self.page = data;
console.log("[controller:list]", self.page);
//alert("목록보기 성공!");
},
function(errResponse){
console.error('Error while fetching page...');
} ); };
self.list(0); }]);
15. webapp/jsp/board.jsp - 1
www.topcredu.co.kr
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html><head>
<title>Spring JPA 게시판</title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<style>
.name.ng-valid {
background-color: lightgreen;
}
.name.ng-dirty.ng-invalid-required {
background-color: red;
}
15. webapp/jsp/board.jsp - 2
www.topcredu.co.kr
.name.ng-dirty.ng-invalid-maxlength {
background-color: yellow;
}
.passwd.ng-valid {
background-color: lightgreen;
}
.passwd.ng-dirty.ng-invalid-required {
background-color: red;
}
.passwd.ng-dirty.ng-invalid-maxlength {
background-color: yellow;
}
.title.ng-valid {
background-color: lightgreen;
}
.title.ng-dirty.ng-invalid-required {
background-color: red;
}
.title.ng-dirty.ng-invalid-maxlength {
background-color: yellow;
}
body, #mainWrapper {
height: 70%;
background-color: rgb(245, 245, 245);
}
body, .form-control {
font-size: 12px !important;
}
.floatRight {
float: right;
margin-right: 18px;
}
.has-error {
color: red;
}
15. webapp/jsp/board.jsp - 3
www.topcredu.co.kr
.formcontainer {
background-color: #DAE8E8;
padding: 20px;
}
.tablecontainer {
padding-left: 20px;
}
.generic-container {
width: 80%;
margin-left: 20px;
margin-top: 20px;
margin-bottom: 20px;
padding: 20px;
background-color: #EAE7E7;
border: 1px solid #ddd;
border-radius: 4px;
box-shadow: 0 0 30px black;
}
.custom-width { width: 80px !important;}
.pointer { cursor: pointer;}
</style>
<!-- For AngularJS -->
<script
src="https://ajax.googleapis.com/ajax/libs/
angularjs/1.4.4/angular.js"></script>
<script src="<c:url value='/js/app.js'
/>"></script>
<script src="<c:url value='/js/board_service.js'
/>"></script>
<script src="<c:url
value='/js/board_controller.js' />"></script>
</head>
15. webapp/jsp/board.jsp - 4
www.topcredu.co.kr
<body ng-app="myBoard" class="ng-cloak"
ng-controller="BoardController as ctrl">
<div class="generic-container" ng-
controller="BoardController as ctrl"
style="width: 800px;">
<div class="panel panel-default">
<div class="panel-heading">
<span class="lead">Spring
Data JPA 게시판 글 쓰기 </span></div>
<div class="formcontainer">
<form ng-
submit="ctrl.submit()" name="myForm"
class="form-horizontal">
<input type="hidden"
ng-model="ctrl.board.id" />
<div class="row"><div class="form-group
col-md-6"> <label
class="col-md-2 control-lable"
for="name">Name : </label>
<div class="col-md-7">
<input type="text" ng-
model="ctrl.board.name" id="name"
class="name form-control input-
sm"placeholder="Enter your Name" required
ng-maxlength="20" /> <div
class="has-error" ng-
show="myForm.$dirty"><span ng-
show="myForm.name.$error.required">This is
a required field</span> <span ng-
show="myForm.name.$error.maxlength">Maxi
mum length is 20</span> <span ng-
show="myForm.name.$invalid">This
field is invalid </span>
15. webapp/jsp/board.jsp - 5
www.topcredu.co.kr
</div></div></div></div><div class="row">
<div class="form-
group col-md-6">
<label class="col-md-2 control-lable"
for="passwd">Password
:</label>
<div
class="col-md-7">
<input
type="password" ng-
model="ctrl.board.passwd" id="passwd"
class="passwd form-control input-sm"
placeholder="Enter your Password"
required ng-maxlength="20" />
<div class="has-error" ng-
show="myForm.$dirty"><span ng-
show="myForm.passwd.$error.required">This
is a required field</span> <span ng-
show="myForm.passwd.$error.maxlength">Ma
ximum
length is 20</span> <span ng-
show="myForm.passwd.$invalid">This
field is invalid </span>
</div>
</div>
</div>
</div>
15. webapp/jsp/board.jsp - 6
www.topcredu.co.kr
<div class="row">
<div class="form-
group col-md-6">
<label
class="col-md-2 control-lable"
for="title">Title :</label>
<div
class="col-md-7">
<input
type="text" ng-model="ctrl.board.title"
id="title"
class="title form-control input-sm"
placeholder="Enter your Title" required />
<div class="has-error" ng-
show="myForm.$dirty">
<span
ng-show="myForm.title.$error.required">This
is a
required field</span> <span ng-
show="myForm.title.$invalid">This
field is invalid </span>
</div>
</div>
</div>
</div>
15. webapp/jsp/board.jsp - 7
www.topcredu.co.kr
<div class="row"><div class="form-group col-
md-6"><label class="col-md-2 control-lable"
for="content">Contents
:</label><div class="col-md-7">
<textarea rows="4" ng-
model="ctrl.board.content" id="content"
class="content form-control input-sm"
placeholder="Enter your Contents"
required >
</textarea>
<div class="has-error" ng-
show="myForm.$dirty">
<span
ng-
show="myForm.content.$error.required">This
is a
required field</span> <span ng-
show="myForm.content.$invalid">This
field is invalid </span>
</div>
</div>
</div>
</div>
15. webapp/jsp/board.jsp - 8
www.topcredu.co.kr
<div class="row"><div class="form-actions
floatRight"><input
type="submit“ value="{{!ctrl.board.id ? 'Add' :
'Update'}}" class="btn btn-primary btn-sm"
ng-disabled="myForm.$invalid">
<button
type="button" ng-click="ctrl.reset()"
class="btn
btn-warning btn-sm" ng-
disabled="myForm.$pristine">Reset
Form</button>
</div>
</div>
</form>
</div>
</div>
<div class="panel panel-default" style="float:
center;"><div class="panel-heading"><span
class="lead">Spring Data JPA 게시판 리스트보
기 </span>
</div><h5> 총
{{ctrl.page.totalElements}}</span>건</h5>
<div class="tablecontainer">
<table width="600"
border="1" align="left" class="table table-
hover"> <tr align="left">
<th align="center">순번</th>
<th align="center">글번호</th>
<th align="center">제목</th>
<th align="center">글쓴이</th>
<th align="center">등록일</th>
<th align="center">조회수</th>
<th align="center">조회/삭제
</th>
</tr>
15. webapp/jsp/board.jsp - 9
www.topcredu.co.kr
<tr data-ng-repeat="board in
ctrl.page.content"> <td
align="center"><span ng-
bind="{{$index+1}}"></span></td><td
align="center"><span ng-
bind="board.id"></span></td><td
align="left"> <!-- 레벨의 수만큼 글을 뒤로 민
다 --> <span ng-repeat="n in
[].constructor(board.replylevel) track by
$index">
&nbsp;&nbsp; </span> <span ng-
bind="board.title"></span>
</td>
<td
align="center"><span ng-
bind="board.name"></span></td>
<td align="center">{{board.regdate |
date:"yy.MM.dd hh:mm"}}</td><td
align="center"><span ng-
bind="board.readcount"></span></td><td><
button type="button" ng-
click="ctrl.edit(board.id)“ class="btn btn-
success custom-width">Edit</button><button
type="button" ng-click="ctrl.remove(board.id)“
class="btn btn-danger custom-
width">Remove</button></td>
</tr></tbody>
</table>
15. webapp/jsp/board.jsp - 10
www.topcredu.co.kr
<div> <!-- 게시판 페이징 -->
<ul class="pagination">
<li ng-
class="{disabled: ctrl.page.number === 0}"><a
ng-
show="ctrl.page.number !== 0"
class="pointer"
ng-
click="ctrl.list(ctrl.page.number-1)">Prev</a>
<span ng-
show="ctrl.page.number ===
0">Prev</span></li>
<li ng-
class="{disabled: ctrl.page.number ===
ctrl.page.totalPages - 1}">
<a ng-show="ctrl.page.number !==
ctrl.page.totalPages - 1"
class="pointer"
ng-
click="ctrl.list(ctrl.page.number+1)">Next</a>
<span ng-
show="ctrl.page.number ===
ctrl.page.totalPages - 1">Next</span>
</li>
</ul>
</div>
</div>
</div>
</div>
</body>
</html>
16. 스프링부트 메인(JpaBoardApplication.java) - 1
www.topcredu.co.kr
package jpa.board;
@SpringBootApplication
public class JpaboardApplication implements
CommandLineRunner{
@Autowired
BoardRepository boardRepository;
public static void main(String[] args) {
SpringApplication.run(JpaboardApplication
.class, args);
}
public void run(String...args) {
//테스트를 위해 글9개 입력
Board b1 = new Board();
b1.setContent("JPA강좌 추천해 주세요
1~");
b1.setName("홍길동1");
b1.setPasswd("1111");
b1.setReadcount(0);
b1.setRegdate(new Date());
b1.setReply(1);
b1.setReplylevel(0);
b1.setReplystep(0);
b1.setTitle("강좌추천요망1");
boardRepository.save(b1);
17. 스프링부트 메인(JpaBoardApplication.java) - 2
www.topcredu.co.kr
Board b2 = new Board();
b2.setContent("JPA강좌 추천해 주세요
2~");
b2.setName("홍길동2");
b2.setPasswd("1111");
b2.setReadcount(0);
b2.setRegdate(new Date());
b2.setReply(2);
b2.setReplylevel(0);
b2.setReplystep(0);
b2.setTitle("강좌추천요망2");
boardRepository.save(b2);
Board b3 = new Board();
b3.setContent("JPA강좌 추천해 주세요
3~");
b3.setName("홍길동3");
b3.setPasswd("1111");
b3.setReadcount(0);
b3.setRegdate(new Date());
b3.setReply(3);
b3.setReplylevel(0);
b3.setReplystep(0);
b3.setTitle("강좌추천요망3");
boardRepository.save(b3);
Board b4 = new Board();
b4.setContent("OJC로 가세요...");
b4.setName("홍길동4");
b4.setPasswd("1111");
b4.setReadcount(0);
b4.setRegdate(new Date());
b4.setReply(6);
b4.setReplylevel(1);
b4.setReplystep(1);
b4.setTitle("[답변]강좌추천요망6");
17. 스프링부트 메인(JpaBoardApplication.java) - 3
www.topcredu.co.kr
boardRepository.save(b4);
Board b5 = new Board();
b5.setContent("OJC로 가세요...");
b5.setName("홍길동5");
b5.setPasswd("1111");
b5.setReadcount(0);
b5.setRegdate(new Date());
b5.setReply(2);
b5.setReplylevel(1);
b5.setReplystep(1);
b5.setTitle("[답변]강좌추천요망2");
boardRepository.save(b5);
Board b6 = new Board();
b6.setContent("JPA강좌 추천해 주세요
6~");
b6.setName("홍길동6");
b6.setPasswd("1111");
b6.setReadcount(0);
b6.setRegdate(new Date());
b6.setReply(6);
b6.setReplylevel(0);
b6.setReplystep(0);
b6.setTitle("강좌추천요망6");
boardRepository.save(b6);
17. 스프링부트 메인(JpaBoardApplication.java) - 4
www.topcredu.co.kr
Board b7 = new Board();
b7.setContent("JPA강좌 추천해 주세요
7~");
b7.setName("홍길동7");
b7.setPasswd("1111");
b7.setReadcount(0);
b7.setRegdate(new Date());
b7.setReply(7);
b7.setReplylevel(0);
b7.setReplystep(0);
b7.setTitle("강좌추천요망7");
boardRepository.save(b7);
Board b8 = new Board();
b8.setContent("OJC로 가세요...");
b8.setName("홍길동8");
b8.setPasswd("1111");
b8.setReadcount(0); b8.setRegdate(new
Date());
b8.setReply(7); b8.setReplylevel(1);
b8.setReplystep(1); b8.setTitle("[답변]
강좌추천요망7");
boardRepository.save(b8); Board b8 = new
Board();b8.setContent("OJC로 가세요...");
b8.setName("홍길동8");
b8.setPasswd("1111");
b8.setReadcount(0); b8.setRegdate(new
Date());
b8.setReply(7); b8.setReplylevel(1);
b8.setReplystep(1); b8.setTitle("[답변]
강좌추천요망7"); boardRepository.save(b8);
17. 스프링부트 메인(JpaBoardApplication.java) - 5
www.topcredu.co.kr
Board b9 = new Board();
b9.setContent("JPA강좌 추천해 주세요
9~");
b9.setName("홍길동9");
b9.setPasswd("1111");
b9.setReadcount(0);
b9.setRegdate(new Date());
b9.setReply(9);
b9.setReplylevel(0);
b9.setReplystep(0);
b9.setTitle("강좌추천요망9");
boardRepository.save(b9);
}
}
18. 결과화면
www.topcredu.co.kr

Contenu connexe

Tendances

#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)Hankyo
 

Tendances (20)

(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로 만들면서 비교해보자.
(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로  만들면서 비교해보자.(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로  만들면서 비교해보자.
(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로 만들면서 비교해보자.
 
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
 
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
 
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
 
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
 
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
 
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
 
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
 
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)
 

Similaire à (Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기

테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)SangIn Choung
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4Seok-joon Yun
 
Spring vs. spring boot
Spring vs. spring bootSpring vs. spring boot
Spring vs. spring bootChloeChoi23
 
Java9 특징 훑어보기
Java9 특징 훑어보기Java9 특징 훑어보기
Java9 특징 훑어보기duriepark 유현석
 
Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Jaesup Kwak
 
How to build a web server on Linux.
How to build a web server on Linux.How to build a web server on Linux.
How to build a web server on Linux.은석 김은석
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4Usys4u
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
ibatis_khhan
ibatis_khhanibatis_khhan
ibatis_khhanohgamja3
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodedpTablo
 
02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)Hankyo
 
Catalyst Framework 살펴보기
Catalyst Framework 살펴보기Catalyst Framework 살펴보기
Catalyst Framework 살펴보기corund
 
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)DK Lee
 
03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)Hankyo
 
04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)Hankyo
 

Similaire à (Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기 (20)

테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
 
Spring vs. spring boot
Spring vs. spring bootSpring vs. spring boot
Spring vs. spring boot
 
Springmvc
SpringmvcSpringmvc
Springmvc
 
okspring3x
okspring3xokspring3x
okspring3x
 
Java9 특징 훑어보기
Java9 특징 훑어보기Java9 특징 훑어보기
Java9 특징 훑어보기
 
Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)
 
How to build a web server on Linux.
How to build a web server on Linux.How to build a web server on Linux.
How to build a web server on Linux.
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4U
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
Oracle History #9
Oracle History #9Oracle History #9
Oracle History #9
 
Ibatis
IbatisIbatis
Ibatis
 
ibatis_khhan
ibatis_khhanibatis_khhan
ibatis_khhan
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 
3.Spring IoC&DI(spring ioc실습, XML기반)
3.Spring IoC&DI(spring ioc실습, XML기반)3.Spring IoC&DI(spring ioc실습, XML기반)
3.Spring IoC&DI(spring ioc실습, XML기반)
 
02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)02.실행환경 실습교재(데이터처리)
02.실행환경 실습교재(데이터처리)
 
Catalyst Framework 살펴보기
Catalyst Framework 살펴보기Catalyst Framework 살펴보기
Catalyst Framework 살펴보기
 
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
 
03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)03.실행환경 교육교재(배치처리)
03.실행환경 교육교재(배치처리)
 
04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)
 

Plus de 탑크리에듀(구로디지털단지역3번출구 2분거리)

[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]탑크리에듀(구로디지털단지역3번출구 2분거리)
 
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]탑크리에듀(구로디지털단지역3번출구 2분거리)
 

Plus de 탑크리에듀(구로디지털단지역3번출구 2분거리) (20)

자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
 
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
 
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
 
[IT교육/IT학원]Develope를 위한 IT실무교육
[IT교육/IT학원]Develope를 위한 IT실무교육[IT교육/IT학원]Develope를 위한 IT실무교육
[IT교육/IT학원]Develope를 위한 IT실무교육
 
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
 
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
 
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
 
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
 
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
 
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
 
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
 
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
 
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
 
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
 
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
 
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
 
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
 

(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기

  • 1. Spring Data JPA 게시판(1) - 게시판 리스트 보기 - SPRING BOOT, ORACLE TOPCREDU.CO.KR 이종철
  • 2. 1. 개요  JPA로 게시판을 만든다는 것은 맞지 않을 수도 있지만 기능과 사용방법을 익힌다 는 관점에서 간단히 만들어 보자. 본예제는 오라클 DB를 기준으로 작성되었으며 MySQL(MariaDB) 예제는 다음 URL에서 참조하면 된다. http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=244  글리스트 보기  구현기술  Spring Boot, Spring WEB MVC, RestController  Spring Data JPA(Hibernate)  기본 JpaRepository  Query Method  Oracle DataBase  UI : JSP, BootStrap, AngularJS, JSON  Logging: DriverSpy www.topcredu.co.kr
  • 3. 2. TABLE 및 SEQUENCE - 1  테이블 및 시퀀스는 엔티티를 정의해서 자동 생성시킬 예정이니 DB쪽에 생성할 필요 없다. 구조만 확인하자.  Board 테이블의 PK(ID칼럼, Primary Key)는 오라클 시퀀스를 이용할 것이다. MySQL이 라면 자동증분 칼럼을 사용하니 특별히 생성할 필요 없다.(본 예제는 오라클을 기준으 로 한다.)  엔티티를 만들 때 키 부분(ID칼럼)에 어노테이션 사용하는 것만 DB가 무엇이냐에 따 라 좀 다르니 확인하면 된다. www.topcredu.co.kr
  • 4. 2. TABLE 및 SEQUENCE - 2 create table board ( id number(10,0) not null, content varchar2(4000 char) not null, name varchar2(20 char) not null, passwd varchar2(20 char) not null, readcount number(5) default 0 not null, regdate date default sysdate not null, -- 답변인경우 어느글의 답변인지 상위글 번 호,최상위글인 경우 자신의 글번호 동일, -- 리스트보기에서 정렬시 우선 reply로 우 선하게 된다. reply number(5) not null, -- 하나의 글 아래에 생기는 모든 답변들에 대해 순차적으로 1씩 증가(reply_level과 관계없이) replylevel number(5) default 0 not null, -- 1차,2차 답글인지 여부, 글에 답변이 두개면 그 두답변은 reply_level이 같다. -- 리스트보기에서 reply_level에 따라 들여쓰기 를 한다. replystep number(5) default 0 not null, title varchar2(500 char) not null, primary key (id) ) create sequence BOARD_SEQ;  JPA에서 자동생성한 DDL 스크립트 www.topcredu.co.kr
  • 5. 3. 프로젝트 생성 및 메이븐 설정, 로깅, 오라클 설정 - 1  STS -> Spring Starter Project Name : jpaboard Group : ojc.asia Artifact : jpaboard Description : Spring Data JPA Board pckage : jpa.board 입력  다음 창에서 Core : Lombok SQL : JPA Web : Web 선택 www.topcredu.co.kr
  • 6. 3. 프로젝트 생성 및 메이븐 설정, 로깅, 오라클 설정 - 2 www.topcredu.co.kr www.topcredu.co.kr
  • 7. 4. pom.xml - 1 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ojc.asia</groupId> <artifactId>jpaboard</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>jpaboard</name> <description>Spring Data JPA Board</description> <parent><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository -- > </parent> <properties> <project.build.sourceEncoding>UTF- 8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data- jpa</artifactId> </dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency> www.topcredu.co.kr
  • 8. 4. pom.xml - 2 <!-- JSP, JSTL 사용위해 --> <dependency><groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope></dependency> <!-- DriverSpy --> <dependency> <groupId>org.bgee.log4jdbc-log4j2</groupId> <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId> <version>1.16</version> </dependency> <!-- for oracle --> <dependency><groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.1.0.7.0</version></dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven- plugin</artifactId> </plugin> </plugins></build><repositories> <repository><id>oracle</id> <name>ORACLE JDBC Repository</name> <url>https://maven.oracle.com</url> </repository> </repositories> </project> www.topcredu.co.kr
  • 11. 7. logback.xml <logger name="jdbc.resultsettable" level="DEBUG" additivity="false">> <appender-ref ref="STDOUT" /> </logger> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration> www.topcredu.co.kr <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern> </encoder></appender> <logger name="jdbc" level="OFF"/> <logger name="jdbc.sqlonly" level="DEBUG" additivity="false">> <appender-ref ref="STDOUT" /> </logger> <logger name="jdbc.sqltiming" level="INFO" additivity="false">> <appender-ref ref="STDOUT" /> </logger>
  • 12. 8. board.java - 1 @Column(length=20, nullable=false) protected String name; @Column(length=20, nullable=false) protected String passwd; @Column(length=500, nullable=false) protected String title; @Column(length=4000, nullable=false) protected String content; //날짜기본형식 time, day, month, year 형태저장 @Column(nullable=false, columnDefinition = "date default sysdate") @Temporal(TemporalType.TIMESTAMP) protected Date regdate = new Date(); @Column(nullable=false, columnDefinition = "number(5) default 0") protected Integer readcount = 0; package jpa.board.model; @Entity @Getter @Setter // 시퀀스의 시작값은 1 // 시퀀스의 기본 allocationSize는50, 번호가 50부터 생기므로 1로 @SequenceGenerator(name="BOARD_SEQ_GENERATOR", sequenceName="BOARD_SEQ", initialValue=1, allocationSize=1) public class Board { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="BOARD_SEQ_GENERATOR") @Column(length=10) protected Integer id;
  • 13. 8. board.java - 2 // 1차,2차 답글인지 여부 // 하나의 글에 답변이 두개면 그 두답변은 reply_level이 같다. // 리스트보기에서 reply_level에 따라 들여쓰기를 한다. @Column(nullable=false,columnDefinition = "number(5) default 0", length=10) protected Integer replylevel = 0; } // 답변인경우 어느글의 답변인지 상위글번호 // 최상위글인 경우 자신의 글번호 동일하다. // 리스트보기에서 정렬시 우선적으로 reply로 정렬 @Column(nullable=false, columnDefinition = "number(5)") protected Integer reply = 0 ; // 글아래 모든 답변들에 대해 reply_level과 관계없이 1 씩 증가 @Column(nullable=false, columnDefinition = "number(5) default 0") protected Integer replystep = 0; 프로젝트에서 마우스 우측버튼 -> Run As -> Spring Boot App로 실행 후 오라클쪽에 테이 블이 생성되는 것을 확인하자. www.topcredu.co.kr
  • 14. 9. 게시판리스트 보기 - 1  Spring JDBC 또는 MyBatis로 만들 때 보다 쉽고 빠르게 작성할 수 있다.  스프링 컨트롤러는 RestController를 적용 했으 며, 뷰 페이지에 Bootstrap 및 AngulerJS 적용했 다.  프로젝트 전체 구조는 다음과 같다. www.topcredu.co.kr
  • 15. 9. 게시판리스트 보기(BoardRepository.java) - 2  기본적으로 제공하는 JpaRepository를 상속받아 만들면 된다.  JpaRepository는 PagingAndSortingRepository를 상속받았고 PagingAndSortingRepository는 CrudRepository(기본적인 CRUD 기능을 제공한다)를 상속 받았으며 다시 CrudRepository는 Repository 인터페이스를 상속받았다.  그러므로 JpaRepository는 모든 기능을 다 사용할 수 있고 추가적으로 영속성 컨텍스 트에 flush하거나 엔티티를 배치로 삭제할 수 있다.  기본 기능만으로도 게시판 기능을 구현할 수 있으므로 JpaRepository를 상속 받자. www.topcredu.co.kr package jpa.board.repository; import org.springframework.data.jpa.repository.JpaRepository; import jpa.board.model.Board; public interface BoardRepository extends JpaRepository<Board, Integer> { }
  • 16. 9. 게시판리스트 보기(BoardService.java) - 3 www.topcredu.co.kr package jpa.board.service; import org.springframework.data.domain.Page; import jpa.board.model.Board; public interface BoardService { //게시판 리스트 보기 public Page<Board> findAll(Integer curPage); }
  • 17. 9. 게시판리스트 보기(BoardServiceImpl.java) - 4  JpaRepository의 findAll() 메소드를 호출만 하면 되는데 페이징 기능을 구현하기 위해 PageRequest를 만들고 이를 findAll() 메소드의 인자로 넣어주면 된다.  Board 테이블에서 정렬한 칼럼이 두개 이상이므로 Sort 를 new하면서 Order를 필요 한 만큼 생성해주면 되고 ASC는 오름차순, DESC는 내림차순, 그뒤의 문자열은 Board 엔티티의 속성이다. www.topcredu.co.kr package jpa.board.service; @Service public class BoardServiceImpl implements BoardService { @Autowired BoardRepository boardRepository; @Override //----------------------------------------- // 게시판 리스트 보기, 한페이지에 3개씩 // curPage:요청하는 페이지, 첫페이지는 0 //----------------------------------------- public Page<Board> findAll(Integer curPage) { PageRequest pr = new PageRequest(curPage, 3, new Sort( new Order(Direction.DESC, "reply"), new Order(Direction.ASC, "replystep"))); return boardRepository.findAll(pr); } }
  • 18. 10. 컨트롤러(BoardController.java) www.topcredu.co.kr package jpa.board.controller; @RestController @RequestMapping("/board") public class BoardController { @Autowired BoardService boardService; //--------------------------------------------- // 루트요청(localhost:8080/board/)시 리스트 보기 로 //--------------------------------------------- @RequestMapping(method = RequestMethod.GET) public ModelAndView index() { //jsp아래 board.jsp 호출 return new ModelAndView("board"); } //--------------------------------------------- // 게시판 리스트 보기 //--------------------------------------------- @RequestMapping(value="/{curPage}", method = RequestMethod.GET) public ResponseEntity<Page<Board>> list(Model model, Pageable pageable, @PathVariable Integer curPage) { Page<Board> page = boardService.findAll(curPage); return new ResponseEntity<Page<Board>>(page, HttpStatus.OK); } }
  • 19. 12. src/main/webapp/js /app.js www.topcredu.co.kr 'use strict'; var App = angular.module('myBoard',[]);
  • 20. 13. src/main/webapp/js/board_service.js www.topcredu.co.kr 'use strict'; App.factory('BoardService', ['$http', '$q', function($http, $q){ return { list: function(curPage) { return $http.get('http://localhost:8080/board/' + curPage) .then( function(response){ console.log("[service:list]server call suceeded."); return response.data; }, function(errResponse){ console.error('Error while fetching contents'); return $q.reject(errResponse); } ); } }; }]);
  • 21. 14. src/main/webapp/js/board_controller.js www.topcredu.co.kr 'use strict'; App.controller('BoardController', ['$scope', 'BoardService', function($scope, BoardService) { var self = this; self.board={id:null,name:'',passwd:'',title:'',content:''}; self.page=[]; //리스트 보기 self.list = function(curPage){ BoardService.list(curPage) .then( function(data) { self.page = data; console.log("[controller:list]", self.page); //alert("목록보기 성공!"); }, function(errResponse){ console.error('Error while fetching page...'); } ); }; self.list(0); }]);
  • 22. 15. webapp/jsp/board.jsp - 1 www.topcredu.co.kr <%@ page contentType="text/html; charset=utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <html><head> <title>Spring JPA 게시판</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <style> .name.ng-valid { background-color: lightgreen; } .name.ng-dirty.ng-invalid-required { background-color: red; }
  • 23. 15. webapp/jsp/board.jsp - 2 www.topcredu.co.kr .name.ng-dirty.ng-invalid-maxlength { background-color: yellow; } .passwd.ng-valid { background-color: lightgreen; } .passwd.ng-dirty.ng-invalid-required { background-color: red; } .passwd.ng-dirty.ng-invalid-maxlength { background-color: yellow; } .title.ng-valid { background-color: lightgreen; } .title.ng-dirty.ng-invalid-required { background-color: red; } .title.ng-dirty.ng-invalid-maxlength { background-color: yellow; } body, #mainWrapper { height: 70%; background-color: rgb(245, 245, 245); } body, .form-control { font-size: 12px !important; } .floatRight { float: right; margin-right: 18px; } .has-error { color: red; }
  • 24. 15. webapp/jsp/board.jsp - 3 www.topcredu.co.kr .formcontainer { background-color: #DAE8E8; padding: 20px; } .tablecontainer { padding-left: 20px; } .generic-container { width: 80%; margin-left: 20px; margin-top: 20px; margin-bottom: 20px; padding: 20px; background-color: #EAE7E7; border: 1px solid #ddd; border-radius: 4px; box-shadow: 0 0 30px black; } .custom-width { width: 80px !important;} .pointer { cursor: pointer;} </style> <!-- For AngularJS --> <script src="https://ajax.googleapis.com/ajax/libs/ angularjs/1.4.4/angular.js"></script> <script src="<c:url value='/js/app.js' />"></script> <script src="<c:url value='/js/board_service.js' />"></script> <script src="<c:url value='/js/board_controller.js' />"></script> </head>
  • 25. 15. webapp/jsp/board.jsp - 4 www.topcredu.co.kr <body ng-app="myBoard" class="ng-cloak" ng-controller="BoardController as ctrl"> <div class="generic-container" ng- controller="BoardController as ctrl" style="width: 800px;"> <div class="panel panel-default"> <div class="panel-heading"> <span class="lead">Spring Data JPA 게시판 글 쓰기 </span></div> <div class="formcontainer"> <form ng- submit="ctrl.submit()" name="myForm" class="form-horizontal"> <input type="hidden" ng-model="ctrl.board.id" /> <div class="row"><div class="form-group col-md-6"> <label class="col-md-2 control-lable" for="name">Name : </label> <div class="col-md-7"> <input type="text" ng- model="ctrl.board.name" id="name" class="name form-control input- sm"placeholder="Enter your Name" required ng-maxlength="20" /> <div class="has-error" ng- show="myForm.$dirty"><span ng- show="myForm.name.$error.required">This is a required field</span> <span ng- show="myForm.name.$error.maxlength">Maxi mum length is 20</span> <span ng- show="myForm.name.$invalid">This field is invalid </span>
  • 26. 15. webapp/jsp/board.jsp - 5 www.topcredu.co.kr </div></div></div></div><div class="row"> <div class="form- group col-md-6"> <label class="col-md-2 control-lable" for="passwd">Password :</label> <div class="col-md-7"> <input type="password" ng- model="ctrl.board.passwd" id="passwd" class="passwd form-control input-sm" placeholder="Enter your Password" required ng-maxlength="20" /> <div class="has-error" ng- show="myForm.$dirty"><span ng- show="myForm.passwd.$error.required">This is a required field</span> <span ng- show="myForm.passwd.$error.maxlength">Ma ximum length is 20</span> <span ng- show="myForm.passwd.$invalid">This field is invalid </span> </div> </div> </div> </div>
  • 27. 15. webapp/jsp/board.jsp - 6 www.topcredu.co.kr <div class="row"> <div class="form- group col-md-6"> <label class="col-md-2 control-lable" for="title">Title :</label> <div class="col-md-7"> <input type="text" ng-model="ctrl.board.title" id="title" class="title form-control input-sm" placeholder="Enter your Title" required /> <div class="has-error" ng- show="myForm.$dirty"> <span ng-show="myForm.title.$error.required">This is a required field</span> <span ng- show="myForm.title.$invalid">This field is invalid </span> </div> </div> </div> </div>
  • 28. 15. webapp/jsp/board.jsp - 7 www.topcredu.co.kr <div class="row"><div class="form-group col- md-6"><label class="col-md-2 control-lable" for="content">Contents :</label><div class="col-md-7"> <textarea rows="4" ng- model="ctrl.board.content" id="content" class="content form-control input-sm" placeholder="Enter your Contents" required > </textarea> <div class="has-error" ng- show="myForm.$dirty"> <span ng- show="myForm.content.$error.required">This is a required field</span> <span ng- show="myForm.content.$invalid">This field is invalid </span> </div> </div> </div> </div>
  • 29. 15. webapp/jsp/board.jsp - 8 www.topcredu.co.kr <div class="row"><div class="form-actions floatRight"><input type="submit“ value="{{!ctrl.board.id ? 'Add' : 'Update'}}" class="btn btn-primary btn-sm" ng-disabled="myForm.$invalid"> <button type="button" ng-click="ctrl.reset()" class="btn btn-warning btn-sm" ng- disabled="myForm.$pristine">Reset Form</button> </div> </div> </form> </div> </div> <div class="panel panel-default" style="float: center;"><div class="panel-heading"><span class="lead">Spring Data JPA 게시판 리스트보 기 </span> </div><h5> 총 {{ctrl.page.totalElements}}</span>건</h5> <div class="tablecontainer"> <table width="600" border="1" align="left" class="table table- hover"> <tr align="left"> <th align="center">순번</th> <th align="center">글번호</th> <th align="center">제목</th> <th align="center">글쓴이</th> <th align="center">등록일</th> <th align="center">조회수</th> <th align="center">조회/삭제 </th> </tr>
  • 30. 15. webapp/jsp/board.jsp - 9 www.topcredu.co.kr <tr data-ng-repeat="board in ctrl.page.content"> <td align="center"><span ng- bind="{{$index+1}}"></span></td><td align="center"><span ng- bind="board.id"></span></td><td align="left"> <!-- 레벨의 수만큼 글을 뒤로 민 다 --> <span ng-repeat="n in [].constructor(board.replylevel) track by $index"> &nbsp;&nbsp; </span> <span ng- bind="board.title"></span> </td> <td align="center"><span ng- bind="board.name"></span></td> <td align="center">{{board.regdate | date:"yy.MM.dd hh:mm"}}</td><td align="center"><span ng- bind="board.readcount"></span></td><td>< button type="button" ng- click="ctrl.edit(board.id)“ class="btn btn- success custom-width">Edit</button><button type="button" ng-click="ctrl.remove(board.id)“ class="btn btn-danger custom- width">Remove</button></td> </tr></tbody> </table>
  • 31. 15. webapp/jsp/board.jsp - 10 www.topcredu.co.kr <div> <!-- 게시판 페이징 --> <ul class="pagination"> <li ng- class="{disabled: ctrl.page.number === 0}"><a ng- show="ctrl.page.number !== 0" class="pointer" ng- click="ctrl.list(ctrl.page.number-1)">Prev</a> <span ng- show="ctrl.page.number === 0">Prev</span></li> <li ng- class="{disabled: ctrl.page.number === ctrl.page.totalPages - 1}"> <a ng-show="ctrl.page.number !== ctrl.page.totalPages - 1" class="pointer" ng- click="ctrl.list(ctrl.page.number+1)">Next</a> <span ng- show="ctrl.page.number === ctrl.page.totalPages - 1">Next</span> </li> </ul> </div> </div> </div> </div> </body> </html>
  • 32. 16. 스프링부트 메인(JpaBoardApplication.java) - 1 www.topcredu.co.kr package jpa.board; @SpringBootApplication public class JpaboardApplication implements CommandLineRunner{ @Autowired BoardRepository boardRepository; public static void main(String[] args) { SpringApplication.run(JpaboardApplication .class, args); } public void run(String...args) { //테스트를 위해 글9개 입력 Board b1 = new Board(); b1.setContent("JPA강좌 추천해 주세요 1~"); b1.setName("홍길동1"); b1.setPasswd("1111"); b1.setReadcount(0); b1.setRegdate(new Date()); b1.setReply(1); b1.setReplylevel(0); b1.setReplystep(0); b1.setTitle("강좌추천요망1"); boardRepository.save(b1);
  • 33. 17. 스프링부트 메인(JpaBoardApplication.java) - 2 www.topcredu.co.kr Board b2 = new Board(); b2.setContent("JPA강좌 추천해 주세요 2~"); b2.setName("홍길동2"); b2.setPasswd("1111"); b2.setReadcount(0); b2.setRegdate(new Date()); b2.setReply(2); b2.setReplylevel(0); b2.setReplystep(0); b2.setTitle("강좌추천요망2"); boardRepository.save(b2); Board b3 = new Board(); b3.setContent("JPA강좌 추천해 주세요 3~"); b3.setName("홍길동3"); b3.setPasswd("1111"); b3.setReadcount(0); b3.setRegdate(new Date()); b3.setReply(3); b3.setReplylevel(0); b3.setReplystep(0); b3.setTitle("강좌추천요망3"); boardRepository.save(b3); Board b4 = new Board(); b4.setContent("OJC로 가세요..."); b4.setName("홍길동4"); b4.setPasswd("1111"); b4.setReadcount(0); b4.setRegdate(new Date()); b4.setReply(6); b4.setReplylevel(1); b4.setReplystep(1); b4.setTitle("[답변]강좌추천요망6");
  • 34. 17. 스프링부트 메인(JpaBoardApplication.java) - 3 www.topcredu.co.kr boardRepository.save(b4); Board b5 = new Board(); b5.setContent("OJC로 가세요..."); b5.setName("홍길동5"); b5.setPasswd("1111"); b5.setReadcount(0); b5.setRegdate(new Date()); b5.setReply(2); b5.setReplylevel(1); b5.setReplystep(1); b5.setTitle("[답변]강좌추천요망2"); boardRepository.save(b5); Board b6 = new Board(); b6.setContent("JPA강좌 추천해 주세요 6~"); b6.setName("홍길동6"); b6.setPasswd("1111"); b6.setReadcount(0); b6.setRegdate(new Date()); b6.setReply(6); b6.setReplylevel(0); b6.setReplystep(0); b6.setTitle("강좌추천요망6"); boardRepository.save(b6);
  • 35. 17. 스프링부트 메인(JpaBoardApplication.java) - 4 www.topcredu.co.kr Board b7 = new Board(); b7.setContent("JPA강좌 추천해 주세요 7~"); b7.setName("홍길동7"); b7.setPasswd("1111"); b7.setReadcount(0); b7.setRegdate(new Date()); b7.setReply(7); b7.setReplylevel(0); b7.setReplystep(0); b7.setTitle("강좌추천요망7"); boardRepository.save(b7); Board b8 = new Board(); b8.setContent("OJC로 가세요..."); b8.setName("홍길동8"); b8.setPasswd("1111"); b8.setReadcount(0); b8.setRegdate(new Date()); b8.setReply(7); b8.setReplylevel(1); b8.setReplystep(1); b8.setTitle("[답변] 강좌추천요망7"); boardRepository.save(b8); Board b8 = new Board();b8.setContent("OJC로 가세요..."); b8.setName("홍길동8"); b8.setPasswd("1111"); b8.setReadcount(0); b8.setRegdate(new Date()); b8.setReply(7); b8.setReplylevel(1); b8.setReplystep(1); b8.setTitle("[답변] 강좌추천요망7"); boardRepository.save(b8);
  • 36. 17. 스프링부트 메인(JpaBoardApplication.java) - 5 www.topcredu.co.kr Board b9 = new Board(); b9.setContent("JPA강좌 추천해 주세요 9~"); b9.setName("홍길동9"); b9.setPasswd("1111"); b9.setReadcount(0); b9.setRegdate(new Date()); b9.setReply(9); b9.setReplylevel(0); b9.setReplystep(0); b9.setTitle("강좌추천요망9"); boardRepository.save(b9); } }