JPA를 처음 공부하다가 

 

org.springframework.orm.jpa.JpaSystemException: could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement

...

Caused by: java.sql.SQLException: Incorrect string value: '\xEA\xB2\x8C\xEC\x8B\x9C...' for column 'title' at row 1

 

라는 에러가 발생하여 당황했는데 

알고보니 인코딩이 안맞아 발생한 문제였다.

JPA에서는 UTF-8을 사용하였지만 MySql에는 EUCKR로 지정되었다.

 

 

1. 먼저 Mysql의 현재 인코딩 방식을 조회해본다.

mysql> show variables like 'c%';

 

2. Client 인코딩 변경

mysql> set names utf8;

 

3. DB 인코딩 변경

mysql> ALTER DATABASE [스키마 이름] default character set utf8;

 

다시 인코딩을 조회해보면 변경된 것을 확인할 수 있다.

변경되지 않았다면 윈도우 서비스에서 MySQL을 재시작해보자.

 

 

다른 방법으로는 my.ini 파일을 메모장으로 수정하는 것인데 

메모장으로 설정을 건드리는 짓이라 별로 좋은 것 같지 않다. (실제로 시도해보다가 서비스 실행이 안됨..)

인프런에서 김영한님의 강의를 보며 처음 알게 된 H2.

DB하면 오라클 또는 MySQL처럼 설치하기 번거로운 것만 사용했는데 

H2처럼 이렇게 가볍게 사용할 수 있는 DB가 있어 매우 반가웠다.

임베디드용이라 그런지 설치해도 21.7MB 밖에 안된다. 

많은 기능이 있는지는 잘 모르겠으나, 스프링 공부하며 쓰기엔 충분해 보여

앞으로 JPA공부를 할 때 자주 사용할 것 같다.

 

* H2 설치 링크 (김영한님 강의에서는 1.4.200 버전을 사용하길 권장)

Archive Downloads (h2database.com)

 

Archive Downloads

 

www.h2database.com

 

설치파일을 다운로드 후 원하는 경로에 설치한다.

설치 후 H2 폴더가 생기며 bin 폴더 내에 h2.bat 파일을 실행하면 

이렇게 웹브라우저에서 로그인 화면이 나온다.

JDBC를 사용하므로 스프링에서 공부용으로 쓰기 매우 적절하다.

연결을 눌러보면

이렇게 깔끔하게 나온다.

URL에 192.168.0.9는 localhost로 변경해서 사용하자.

단, 절대 뒷부분은 건드리지 말자. (특히 jsessionid) 

http://192.168.0.9:8082/login.do?jsessionid=369def28a6acd6502bc09512a3afda41

http://localhost:8082/login.do?jsessionid=369def28a6acd6502bc09512a3afda41

 

 

마지막으로 간단한 쿼리 작성 후 [실행]을 누르면

깔끔하게 잘 조회된다.

 

※ 리눅스에서는 실행 방법이 좀 다르다.

chmod 755 h2.sh 명령으로 권한 부여 후 ./h2.sh 명령으로 실행해야 한다.

 

 

* H2 연동하기

프로젝트에서 jdbc, H2 관련 라이브러리 추가

인텔리J를 사용하면 이렇게 쓰자.

 

* build.gradle 에 추가

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2

 

*데이터베이스 연결용 prop 추가 (resources 폴더에 application.properties 파일 생성)

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa

 

MAVEN을 사용할 땐 여기를 찾아보자.

https://woopi1087.tistory.com/74

 

[Spring Boot] H2DB JDBC연동

● Spring boot에 H2DB Dependency 추가 1. 아래 링크로 h2db 사이트의 maven dependency 확인 http://h2database.com/html/build.html?highlight=maven&search=maven#maven2 Build Build Portability Environment..

woopi1087.tistory.com

 

** 더 자세한 것은 인프런에서 김영한님의 [스프링 입문] 강의 중 [스프링 DB 접근 기술] 부분을 다시 보자.

 

개발환경에서 배치를 돌리면서 테이블 하나를 두 번 UPDATE 해야 하는데

이 테이블의 변경 내역을 저장하기 위해 로그테이블을 만들어 트리거를 통해 저장되도록 하였었다.

여기서 개발환경이다 보니 데이터가 적어서 처리가 너무 빠르다 보니 SYSDATE로 지정한 PK가 중복되어

계속 실패하니 짜증나서 트리거 멈추는 방법을 찾아보았다.

 

1. 트리거 활성화

ALTER TRIGGER triggerName ENABLE;

 

2. 트리거 비활성화

ALTER TRIGGER triggerName DISABLE;

 

역시 찾아보면 뭐든지 다 있다.. 내가 몰랐을 뿐

 

'DB > ORACLE' 카테고리의 다른 글

ORACLE사용자 계정 추가/설정  (0) 2022.08.28
Oracle SQL 처리과정  (0) 2022.08.28
Oracle Server 구조  (0) 2022.08.28

 

SELECT DECODE(MIN(DID),1,YMD) YD
      ,MIN(DECODE(WID,1,DID)) W1
      ,MIN(DECODE(WID,2,DID)) W2
      ,MIN(DECODE(WID,3,DID)) W3
      ,MIN(DECODE(WID,4,DID)) W4
      ,MIN(DECODE(WID,5,DID)) W5
      ,MIN(DECODE(WID,6,DID)) W6
      ,MIN(DECODE(WID,7,DID)) W7  
FROM (      
      SELECT TO_CHAR(TO_DATE(:ARG_STYM,'YYYY-MM') + ROWNUM-1,'YYYY-MM') YMD  
            ,EXTRACT( DAY FROM TO_DATE(:ARG_STYM,'YYYY-MM') + ROWNUM-1) DID 
            ,TO_CHAR(TO_DATE(:ARG_STYM,'YYYY-MM') + ROWNUM-1,'D') WID 
            ,TRUNC(TO_DATE(:ARG_STYM,'YYYY-MM') + ROWNUM-1,'D')WKID
      FROM DUAL
      CONNECT BY LEVEL <= LAST_DAY(TO_DATE(:ARG_ETYM,'YYYYMM')) - TO_DATE(:ARG_STYM,'YYYYMM')+1  
     )
GROUP BY YMD,WKID     
ORDER BY YMD,WKID;
 
  • 흰 배경회색 가로줄 배경어두운 배경
  •  
  • 삭제

:ARG_STYM, :ARG_ETYM 은 바인딩 변수

 

 

* :ARG_STYM = 202006, :ARG_ETYM = 202007 넣어서 실행한 결과

대표사진 삭제

실행 결과

 

 

'DB > 구자료' 카테고리의 다른 글

SQL로 별찍기  (0) 2022.08.28
저장 함수 (FUNCTION)  (0) 2022.08.28
SQL 프로시저  (0) 2022.08.28
PL / SQL  (0) 2022.08.28
INDEX  (0) 2022.08.28

 

-- 별찍기 버전 1

SELECT RNUM SEQ
    ,LPAD('*',RNUM,'*')T1
    ,LPAD('A',RNUM,'B')T2
    ,DECODE(SIGN(RNUM-5),1,6-((RNUM-4)),RNUM) AS DSEQ
    ,LPAD('*',DECODE(SIGN(RNUM-5),1,6-((RNUM-4)),RNUM),'*') DFTST
    ,CASE WHEN RNUM -5 >= 1 THEN 6-((RNUM-4))
    ELSE RNUM
    END AS CSEQ
    ,LPAD('*',CASE WHEN RNUM -5 >= 1 THEN 6-((RNUM-4))
            ELSE RNUM
            END
            ,'*') CFTST
FROM(SELECT ROWNUM RNUM
        FROM USER_TAB_COLUMNS
        WHERE ROWNUM < 10
        ORDER BY RNUM ASC
        --ORDER BY RNUM DESC
        );
        
SELECT RPAD('A',3,'BCDEFGHIZKLMNOPQRSTUVWXYZ') FROM DUAL;
 
대표사진 삭제
  • 오른쪽 정렬왼쪽 정렬가운데 정렬
  •  
  • 사진 편집
  •  
  • 작게문서 너비옆트임
  •  
  • 삭제

실행결과

 

-- 별찍기 버전 2
SELECT RNUM SEQ
    ,LPAD('*',RNUM,'*') T1
    ,LPAD('A',RNUM,'B') T2
    ,DECODE(SIGN(RNUM -10),1,11-((RNUM-9)),RNUM) AS DSEQ
    ,LPAD('*',DECODE(SIGN(RNUM-10),1,11-((RNUM-9)),RNUM),'*') DFTST
    ,CASE WHEN RNUM -10 >= 1 THEN 11-((RNUM-9))
    ELSE RNUM
    END AS CSEQ
    ,LPAD('*',CASE WHEN RNUM -10 >= 1 THEN 11-((RNUM-9))
            ELSE RNUM
            END
        ,'*') CFTST
FROM(SELECT ROWNUM RNUM 
        FROM USER_TAB_COLUMNS
        WHERE ROWNUM < 20
        ORDER BY RNUM ASC
        );
 
대표사진 삭제

실행결과

 

 

'DB > 구자료' 카테고리의 다른 글

SQL로 달력만들기  (0) 2022.08.28
저장 함수 (FUNCTION)  (0) 2022.08.28
SQL 프로시저  (0) 2022.08.28
PL / SQL  (0) 2022.08.28
INDEX  (0) 2022.08.28

 

지난 포스팅에서 정리한 내용은 프로시저는 단독으로 실행할 수 있는 작업 단위를 말한다면,

저장 함수는 결과를 보기(SELECT) 위한 작업의 단위이다. 개념은 다르지만 사용하는 방법은 PL / SQL 이므로

상당히 유사하다.

 

저장 함수에 대해 정리하기 위해 전과 마찬가지로 HUMAN, CAR 테이블을 사용한다.

 

 

1. 저장 함수 생성 / 삭제하기

전과 마찬가지로 CREATE 를 통해 함수를 생성할 수 있다.

CREATE OR REPLACE FUNCTION SEL_HUMAN
(
    V_NAME IN HUMAN.H_NAME % TYPE
)
RETURN HUMAN.H_NAME % TYPE
IS 
    V_NUM HUMAN.H_NO % TYPE;
 BEGIN
    SELECT H_NO INTO V_NUM
    FROM HUMAN
    WHERE H_NAME = V_NAME;
    
    RETURN V_NUM;
    
END;
/
 

이번에 주목할 점은 프로시저에서 언급하지 않은 IS 부분이다.

IS 영역은 내부에서 사용할 지역 변수를 선언하는 영역이다. 따라서 V_NUM 은 HUMAN 테이블의 H_NO와 같이

NUMBER형으로 선언된 지역변수이다.

 

BEGIN의 쿼리를 보면 V_NAME 변수의 값과 사람의 이름이 같으면 H_NO 의 값을 V_NUM에 넣어 리턴을 한다.

여기서 리턴은 함수의 결과를 반환해주는 역활을 한다. 자바에서 사용한 RETURN과 동일하다.

 

삭제하는 방법은 마찬가지로 DROP 을 사용하여 삭제할 수 있다.

DROP FUNCTION SEL_HUMAN;
 

 

2. 함수 활용하기

함수를 활용하는 방법은 두 가지를 정리하고자 한다.

 

1) 전역 변수를 사용하여 출력하기

전역 변수는 다음과 같이 생성이 가능하다.

VAR H_NUMBER NUMBER;
 

이제 이 변수를 사용하여 PL / SQL 의 방식으로 출력하면 다음과 같다.

EXECUTE :H_NUMBER := SEL_HUMAN('박길동');
PRINT H_NUMBER;
 

여기서 주목할 점은 : (콜론)이 붙은 위치이다. 이건 문법이니 외워두도록 하자. (:= 은 대입 연산자이다.)

위의 세 문장을 실행하면 다음과 같이 출력된다.

대표사진 삭제

실행 결과

작성한 코드대로 박길동이란 사람의 번호가 나오게 된다.

 

2) WHERE 절을 사용하여 출력하기

이번에는 SELECT에서 WHERE를 사용하여 홍길동의 번호와 나이를 가져오고자 한다.

SELECT H_NO, H_NAME, H_AGE
FROM HUMAN
WHERE H_NO = SEL_HUMAN('홍길동');
 

쿼리는 흔히 사용하던 SELECT와 별 다른게 없지만 WHERE 절에서는 함수를 사용한 것을 볼 수 있다.

즉, SEL_HUMAN 이라는 함수의 리턴값과 H_NO 를 비교하여 조건을 완성하는 것을 볼 수 있다.

 

 

'DB > 구자료' 카테고리의 다른 글

SQL로 달력만들기  (0) 2022.08.28
SQL로 별찍기  (0) 2022.08.28
SQL 프로시저  (0) 2022.08.28
PL / SQL  (0) 2022.08.28
INDEX  (0) 2022.08.28

+ Recent posts