문제상황
프로젝트에서 teacher이 회원가입 할 때 class가 null 이면 회원가입이 안되는 오류가 있어, class에서 기본적으로 '무소속' 값을 하나 가지고 있어야 했다. 그런데, 클래스를 생성하려면 선생님이 로그인을 해야하는 상황이다.
여기서 문제가 발생했다.
만약 선생님이 한명도 없고, 클래스도 한명도 없는 초기 상황에서 선생님은 어떻게 회원가입을 할 것인가?
회의에서는 ...
- 실행하자마자 선생님을 한명 넣자 (관리자)
- 실행하자마자 클래스를 하나 넣자
- class가 null이 가능하도록 하자.
회의 결과는 2번이었다. 무소속을 처음부터 집어넣고 시작하자고 했다.
Teacher table의 classnum은 다음과 같은 방식으로 입력하였다.
https://skylarcoding.tistory.com/113
[HTML/JSP] Select Box 에 DB값 가져오기, 선택한 값을 DB에 저장하기
select box에 DB에 있는 값을 꺼내와 보여주고, 선택한 select box 의 값을 DB에 넣어 저장하기. 먼말인지 알쥬...? db 값을 select box 의 옵션으로 가져오기 왼쪽이 DB. DB값을 오른쪽의 셀렉트 박스로 가져
skylarcoding.tistory.com
1. SQL 문 동작 확인하기
sql문을 만들어서 다음과같이 동작하는지 확인하였다.
2. sql 파일 만들기.
Spring 의 maven, war 프로젝트 기준으로 static 이 기본경로여서 static 밑에 sql 파일을 생성해주었다.
Database server type 은 Oracle 11로 설정해주었다. 생성하면 오른쪽 사진과 같은 경로가 된다.
3. sql 파일 안에 sql 의 insert 문 넣어주기
아까 1번에서 실행했던 insert 문을 넣어주면 된다.
4. application.properties 수정하기
참고했던 블로그는 gradle 이어서 적용방식이 다를까봐 걱정했는데, 아래와 같이 작성하면 된다. 자동완성이 있어 큰 어려움은 없었다.
# sql
spring.sql.init.mode=always
spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode = always
기존에는 spring.datasource.initialization-mode 로 사용되었었고, 현재는 spring.sql.init.mode 로 사용해야한다.
always : 모든 데이터베이스에 sql 스크립트를 동작시킨다.
embedded : 데이터베이스만 sql 스크립트를 동작시킨다.
never : 모든 데이터베이스에 sql 스크립트를 동작시키지 않는다.
spring.jpa.defer-datasource-initialization = true
hibernate 기반의 초기화와 script 기반의 초기화가 함께 사용될 경우에 작성해야한다고 한다.
오류해결) 시퀀스만 다른 같은 데이터가 반복적으로 들어감
그런데 저런 방식으로 작성하면 시퀀스만 다른 같은 데이터가 계속 들어간다는 단점이 있다. (오른쪽 사진 참고)
해결방법
1. 시퀀스가 다르니 다르니 계속 데이터가 들어감
시퀀스 수정. 공통된 데이터 하나로 정했다.
insert into irangclass values (0,'무소속');
2. 같은 시퀀스가 있으니 재실행하면 삽입이 불가하다는 문제가 발생한다.
이와 관련된 해결방안이 있을 것 같아 찾아봤다.
spring.datasource.continue-on-error=true.
To disable the fail-fast you can set spring.datasource.continue-on-error=true. This can be useful once an application has matured and been deployed a few times, since the scripts can act as ‘poor man’s migrations’ — inserts that fail mean that the data is already there, so there would be no need to prevent the application from running, for instance.
스프링(Spring) 애플리케이션에서 "fail-fast" 기능을 비활성화하는 방법
"fail-fast"는 데이터베이스 스크립트 실행 중에 오류가 발생하면 애플리케이션을 중단하는 기능을 말한다.
설정 spring.datasource.continue-on-error=true를 사용하면 "fail-fast" 기능을 비활성화할 수 있습니다. 이 설정을 사용하면 애플리케이션이 중단되지 않고 실행됩니다. 이는 애플리케이션이 이미 배포되어 몇 차례 실행된 후에 유용할 수 있습니다. 스크립트에서 발생한 삽입(insert) 오류는 해당 데이터가 이미 존재하기 때문에 애플리케이션 실행을 방해할 필요가 없기 때문입니다. 이를 "poor man's migrations"라고 표현하는데, 데이터베이스 마이그레이션(migration)과 유사한 효과를 가질 수 있다는 의미입니다.
참고 자료
wildeveloperetrain님 블로그 jupiter님 블로그 developer-yeony님 블로그
https://amagrammer91.tistory.com/172
https://stackoverflow.com/questions/47278924/only-once-data-sql-file-has-to-be-execute
https://stackoverflow.com/questions/47278924/only-once-data-sql-file-has-to-be-execute