2016년 10월 26일 수요일

[자바교육,JPA교육,스프링교육_탑크리에듀]#1.스프링부트,Spring Data JPA게시판(구현기술및기능)-오라클연동게시판소스

#1.스프링부트,Spring Data JPA게시판(구현기술및기능)-오라클연동게시판소스


질문하실 내용이 있으시면 Q/A에 올려주시면 성의껏 답변 드리겠습니다.
감사합니다.

구현 기술  기능

n  Spring Boot, MVC, Spring Data JPA, AngularJS 기반으로 게시판을 만들어 보자.
n  JPA로 게시판을 만든다는 것은 맞지 않을 수도 있지만 기능과 사용방법을 익힌다는 관점에서 간단히 만들어 보자본예제는 오라클 DB를 기준으로 작성되었으며  MySQL(MariaDB) 예제는 다음 URL에서 참조하면 된다.


n  구현기술
Spring Boot, Spring WEB MVC, RestController
Spring Data JPA(Hibernate)
기본 JpaRepository
Query Method
Oracle DataBase(DB는 편한걸로 사용가능)
UI : JSP, BootStrap, AngularJS, JSON
Logging: DriverSpy

n  기본기능
글리스트 보기글입력글읽기글수정글삭제답변글작성

n  테이블 및 시퀀스 DDL

ü  테이블 및 시퀀스는 엔티티 정의해서 자동 생성시킬 예정이니 DB쪽에 생성할 필요없다구조만 확인하자.
ü  Board 테이블의 PK(ID칼럼, Primary Key)는 오라클 시퀀스를 이용할 것이다. MySQL이라면 자동증분 칼럼을 사용하니 특별히 생성할 필요 없다.(본 예제는 오라클을 기준으로 한다.)
ü  엔티티를 만들 때 키 부분(ID칼럼)에 어노테이션 사용하는 것만 DB가 무엇이냐에 따라 좀 다르니 확인하면 된다.

JPA에서 자동 생성된 DDL 스크립트는 다음과 같다.

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교육,스프링교육_탑크리에듀][스프링JPA]Querydsl,오라클SQL,LIKE,BETWEEN예문

[스프링JPA]Querydsl,오라클SQL,LIKE,BETWEEN예문

Querydsl for Oracle(Like, Between)

public List<Tuple> getEnameSalBetweenLike(Long sal1, Long sal2, String namePattern) {
//////////////////////////////////////////////////////////////
// 급여가 sal1~sal2 사이이름이 namePattern으로 시작하는 사원이름급여추출 
// JPA에서 0.4 DB에서 직접쿼리하든지 0.3초 정도소요 
// (myemp1 1000만건, ename, sal 칼럼은 각각 인덱스 생성되어 있음)
//------------------------------------------------------------
// select MYEMP1.ENAME, MYEMP1.SAL
// from MYEMP1 MYEMP1
// where MYEMP1.SAL between 5999990 and 6000000
// and MYEMP1.ENAME like '%' escape '\'
/////////////////////////////////////////////////////////////
QMyemp1 myemp1 = QMyemp1.myemp1;

List<Tuple> rows = queryFactory.select(myemp1.ename, myemp1.sal)
.from(myemp1)
.where(myemp1.sal.between(sal1, sal2)
  .and(myemp1.ename.like(namePattern + "%")))
.fetch();
return rows;
}

-----------------------------------------------------------------------------
[실행 로그]

10. select MYEMP1.ENAME, MYEMP1.SAL
from MYEMP1 MYEMP1
where MYEMP1.SAL between 5999990 and 6000000 and MYEMP1.ENAME like '%' escape '\'

20160304 21:06:11.419 [http-nio-8080-exec-7] INFO j.sqltiming - select MYEMP1.ENAME, MYEMP1.SAL
from MYEMP1 MYEMP1
where MYEMP1.SAL between 5999990 and 6000000 and MYEMP1.ENAME like '%' escape '\'
 {executed in 406 msec}
20160304 21:06:11.420 [http-nio-8080-exec-7] INFO j.resultsettable -
|------------------|--------|
|ename         |sal    |
|------------------|--------|
|가길동5999993 |5999993 |
|가길동5999999 |5999999 |
|------------------|----------|

[자바교육,JPA교육,스프링교육_탑크리에듀][스프링JPA강좌]Querydsl,오라클SQLUNIONALL,WITH,COUNT

[스프링JPA강좌]Querydsl,오라클SQL,UNIONALL,WITH,COUNT

querydsl 4.0.9 이상에서 실행해야 한다.

Expression이라는 글씨 때문에 게시판이 깨져서 첨부파일로 올려드립니다.

감사합니다.

[자바교육,JPA교육,스프링교육_탑크리에듀][스프링JPA]Querydsl,오라클SQL,DISTINCT,IN,OR,예문

[스프링JPA]Querydsl,오라클SQL,DISTINCT,IN,OR예문입니다.


Querydsl for Oracle(Distinct, IN, OR)

@Override
public List<String> getJobDistinct(String deptno1, String deptno2) {
           //////////////////////////////////////////////////////////////
           // myemp1에서 '1'번부서 또는 '2'번부서원에 대해 중복제거 후 직무출력
           // DISTINCT, IN, OR 예문
           // JPA에서 실행하나 DB에서 직접쿼리하든지 8초정도소요(myemp1 1000만건)
           //------------------------------------------------------------
           // select distinct MYEMP1.JOB
           // from MYEMP1 MYEMP1
           // where MYEMP1.DEPTNO in ('1', '2')
           /////////////////////////////////////////////////////////////
           List<String> rows = queryFactory.select(myemp1.job)
                                .distinct().from(myemp1)
                                .where(myemp1.deptno.in(deptno1, deptno2))                                        //.where(myemp1.deptno.eq(deptno1).or(myemp1.deptno.eq(deptno2)))
                                .fetch();
                                         
           return rows;
}

--------------------------------------------------------------------------------------------------

[실행 로그]

select distinct MYEMP1.JOB
from MYEMP1 MYEMP1
where MYEMP1.DEPTNO in ('1', '2')

20160304 21:13:21.700 [http-nio-8080-exec-5] INFO j.sqltiming - select distinct MYEMP1.JOB
from MYEMP1 MYEMP1
where MYEMP1.DEPTNO in ('1', '2')
 {executed in 7691 msec}
20160304 21:13:21.700 [http-nio-8080-exec-5] INFO j.resultsettable -
|-----------|
|job        |
|-----------|
|null      |
|CLERK      |
|SALESMAN  |
|DESIGNER  |
|MANAGER    |
|PROGRAMMER |
|ANALYST    |
|-----------|

[자바교육,JPA교육,스프링교육_탑크리에듀][스프링JPA]Querydsl오라클SQLWITH,조인,GROUPBY구문예제

[스프링JPA]Querydsl오라클SQLWITH,조인,GROUPBY구문예제

첨부 파일에서 예문 확인 하세요~

n  오라클의 With 구문은 querydsl 4.0.9 이상에서 실행해야 한다이하 버전에서는 Querydls 버그로 인해 쿼리문이 이상하게 만들어 진다아래 URL에서 확인하자.