sun cloud

복습 키워드

javaSE(Standard Edition) image / javaEE(Enterprise Edition) image-20210906092859555 | jdk | compiler | jre | jvm | interpreter | gc | heap | local variable | stack | 자료구조 | Queue | static | metaspace | 객체지향 | inheritance | encaptulation | polymorphism | template method design pattern | abstract | interface | Collection | 객체 직렬화 | Stream | Thread | synchronized | extends Thread | implements Runnable | java.lang.Object | socket | String, StringBuilder, StringBuffer(thread safe) | sql | jdbc | DML | DDL | DCL | Driver loading | Connection | ComparedStatement | ResultSet | close | finally | order by | distinct |


오늘은 전에 배웠던 시퀀스를 이어서 더 공부하고 트랜잭션과 서브쿼리에 대해 알아보겠습니다.

목차

Sequence

전 글에서 이미 nextval에 대해 간단히 공부했습니다. 이번 글에서 다시 한 번 가볍게 살펴보고 이와 연관된 currval을 배워보도록 하겠습니다.


nextval예제

: 다음 시퀀스 값이 반환됩니다. 시퀀스명.nextval과 같이 사용할 수 있습니다.

ex) DAO 적용 예제 insert into guestbook(guestbook_no, title) values(guestbook_seq.nextval, ?)

이렇게 생성해주면 먼저 만들어둔 guestbookseq 시퀀스에 자동적으로 다음 값을 생성하게 됩니다.
(참고: 간혹 전에 생성한 번호와 간격이 생길 수 있는데, Cashe때문입니다. 시퀀스 번호를 미리 일정 크기만큼 메모리에 올려두고 작업을 하면 시퀀스를 생성하는 작업 속도가 빨라져서 캐시를 사용하는데, 이 상태에서 DB를 중지하고 재시작하면 메모리에 올려뒀던 시퀀스 번호가 사라지고 다음 번호부터 새롭게 생성되는 것입니다. 작업에 있어 번호의 연속성은 크게 중요치 않으니 수업 중에는 개의치 않고 진행하도록 하겠습니다.)_

currval

: 현재 시퀀스 값을 반환해줍니다. 시퀀스명.currval과 같이 사용합니다.

다만 주의해야할 점이 있는데, currval은 시퀀스를 nextval한 세션 내에서만 사용 가능합니다.

한 마디로 같은 커넥션 내에서만 사용이 가능하다는 것인데, 연결 시작부터 연결 종료 시까지 nextval한 커넥션 내에서만 currval를 사용할 수 있습니다.

왜 이런 식으로 currval을 사용하려는 걸까요?

db는 다양한 client들이 접속하고, 동시다발적으로 각자 sequence를 사용하게 됩니다. 그렇기 때문에 어떠한 시점 또는 값을 특정하지 않는다면 현재값을 알 수 없습니다. 단순히 현재 시퀀스를 달라고 하면 대상이 모호하다는 얘기죠. 그래서 자신이 nextval한 그 curval(current value)에 대해서만 값을 알 수 있도록 합니다.

(참고: session이란 사용자가 db에 접속한 시점부터 접속 종료 시까지 유지되는 정보를 말합니다)

바로 예제를 살펴보겠습니다.

currval예제

1
2
3
4
-- 시퀀스명.nextval
SELECT guestbook_seq.nextval from dual;
-- 시퀀스명.currval
SELECT guestbook_seq.currval from dual;

위의 sql문을 보시면 각 라인을 따로 실행할 경우 currval은 작동하지 않습니다.
currval은 단독으로 실행될 수 없고 nextval를 실행한 커넥션 내에서만 currval을 사용할 수 있기에 두 라인을 함께 영역지정해서 실행할 경우 정상적인 작동을 확인할 수 있습니다(동일한 세션 내에서만 실행 가능). 물론 guestbook 테이블과 guestbook_seq를 생성한 상태로 진행한 결과입니다.

(참고: 강사님께서 말씀하시기를 앞으로 웹 수업에서 로그인, 세션 등의 내용을 다루게 될텐데 현재 내용을 숙지해두면 보다 이해가 쉬울 거라고 하셨습니다.)



JAVA에서 SEQUENCE 활용

SQL 작성을 해봤으니 이제 본격적으로 java와 db를 연동해서 시퀀스를 사용해보도록 하겠습니다.

아래는 시퀀스를 자동으로 발급하고 글 등록을 업데이트 하는 예제입니다.
글 등록을 하고나면 DB에서 발급한 글 번호가 GuestBookDTO에 할당이 되어 있도록 registerVer2 메서드를 구현합니다.

currval

아래는 기능을 구현하는 registerVer2 메서드입니다.

currval

7번 라인에서 sql문을 저장하는데 gurest_no컬럼에 guestbook_seq.nextval을 할당합니다.

11번 라인에서 실행하고 12번 라인에서 pstmt를 닫아줍니다. 한 커넥션 안에서 다른 sql문을 사용하기 위해 이 작업이 반드시 필요합니다.

그리고 다시 새로운 sql문을 작성하고 실행시켜주면 currval값을 받아올 수 있습니다.


sun cloud


LIKE연산자

: 내용 중에 문자열의 일부가 포함되는 내용을 검색하는 연산자입니다. 웹의 검색 기능에서 많이 사용되고 있습니다.
다음과 같이 사용할 수 있습니다. WHERE 컬럼명 LIKE '%검색키워드%'(%: 0개 이상의 문자)

sql문을 살펴보겠습니다.

1
SELECT * FROM PRODUCT WHERE NAME LIKE '%면%';

위 LIKE를 적용한 SQL문을 PreparedStatement에 적용하는 방법은 아래와 같습니다.

1
String sql = "SELECT * FROM guestbook WHERE title LIKE '%' || ? || '%'";

JAVA에서 LIKE 활용

자바에서 적용해보도록 하겠습니다.

방명록 글제목(TITLE)을 이용해 정보를 조회하는 기능을 구현하겠습니다.

carbon

“즐”이 포함된 방명록을 list에 저장해서 출력하도록 합니다.

carbon

방명록 정보를 받아와서 출력해야하기 때문에 ArrayList를 활용합니다.
전에 배웠던 결과값을 반환하는 sql문을 활용한 코드들과 큰 차이점은 없고, sql 구문의 작성에 유의하시면 됩니다.


참고: for-each문

for loop는 콜론을 사용해서 간단히 표현할 수 있습니다.

콜론 뒤의 list에 있는 모든 요소를 순차적으로 콜론 앞의 dto에 할당하면서 반복하게 합니다.

1
2
3
for(GuestBookDTO dto:list){
    System.out.println(dto);
}

Database 카테고리 내 다른 글 보러가기

댓글남기기