Translate

2019년 11월 17일 일요일

[Spring Boot] Writing a File Using Thymeleaf (HTML 파일로 저장하기)



부제: Thymeleaf 이용해서 HTML 파일 저장하기



HTML 파일 형식의 보고서(Report)를 만들어야 해서
Spring Boot 에서 Thymeleaf 를 이용하여 HTML 파일을 저장하려 한다.

아래와 같이 작업을 했다.





디렉토리 구조




pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>kr.co._1004lucifer.test.tymeleaf</groupId>
    <artifactId>savefile</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Save HTML File</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>





Java 소스

package kr.co._1004lucifer.test.tymeleaf.savefile;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

@SpringBootTest
class ThymeleafFileWriterTest {

    @Autowired
    TemplateEngine templateEngine;

    /**
     * Thymeleaf를 이용해서 HTML 파일을 저장시키는 테스트
     */
    @Test
    public void writeThymeleaf2HtmlFile() throws IOException {
        String filepath = System.getProperty("user.home") + "/hello-thymeleaf.html";

        Context context = new Context();
        context.setVariable("title", "User Page");
        context.setVariable("name", "John Doe");
        Writer writer = new FileWriter(filepath);
        writer.write(templateEngine.process("sample.html", context));
        writer.close();

        File file = new File(filepath);
        Assertions.assertTrue(file.length() > 0);
        Assertions.assertTrue(file.delete());
    }
}





HTML 템플릿 파일

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.thymeleaf.org ">
<head>
    <title th:text="${title}">title</title>
</head>
<body>
Hello <span th:text="${name}">name</span>!
</body>
</html>



위의 테스트 코드는 github 저장소에 올려놓았다.
https://github.com/1004lucifer/Test_SpringBoot-Thymeleaf-Save-File

save, write, file
타임리프

참고
https://jgalacambra.wordpress.com/2016/06/08/writing-a-file-using-thymeleaf/

2019년 11월 13일 수요일

[H2DB] Unable to read the page at position 오류





사용 툴: IntelliJ 2019


증상


 애플리케이션에서 H2 DB를 생성된 상태에서
 IntelliJ Database로 해당 H2 파일에 접근하여 DB작업 후
 다시 애플리케이션 수행 시 아래와 같은 에러가 발생하며 DB가 깨진것 처럼 보여진다.




  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.1.RELEASE)

2019-11-12 15:31:18.172  INFO 21368 --- [           main] .c.d.s.1004luciferApplicationTests : Starting 1004luciferApplicationTests on 1004lucifer-H58 with PID 21368 (started by 1004lucifer in D:\source\1004lucifer)
2019-11-12 15:31:18.174  INFO 21368 --- [           main] .c.d.s.1004luciferApplicationTests : No active profile set, falling back to default profiles: default
2019-11-12 15:31:19.946  INFO 21368 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-11-12 15:31:20.136  WARN 21368 --- [           main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
2019-11-12 15:31:20.200  INFO 21368 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-11-12 15:31:20.349 ERROR 21368 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.

org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: Unable to read the page at position 127268470925123 [1.4.200/6]" [50000-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:505) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.get(DbException.java:194) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.convert(DbException.java:347) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.openDatabase(Database.java:333) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.<init>(Database.java:301) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.openSession(Engine.java:74) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.openSession(Engine.java:192) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200]
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200]
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200]
at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:353) ~[HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473) [HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:562) [HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) [HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) [HikariCP-3.4.1.jar:na]
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$h2Console$0(H2ConsoleAutoConfiguration.java:73) [spring-boot-autoconfigure-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.beans.factory.ObjectProvider.ifAvailable(ObjectProvider.java:93) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.h2Console(H2ConsoleAutoConfiguration.java:72) [spring-boot-autoconfigure-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_221]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_221]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_221]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_221]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:640) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:625) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:125) ~[spring-boot-test-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123) ~[spring-test-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) ~[spring-test-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) ~[spring-test-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) ~[spring-test-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:98) ~[spring-test-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$5(ClassBasedTestDescriptor.java:337) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:342) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassBasedTestDescriptor.java:337) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_221]
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) ~[na:1.8.0_221]
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) ~[na:1.8.0_221]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[na:1.8.0_221]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) ~[na:1.8.0_221]
at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312) ~[na:1.8.0_221]
at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743) ~[na:1.8.0_221]
at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:742) ~[na:1.8.0_221]
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) ~[na:1.8.0_221]
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:336) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:259) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:252) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at java.util.Optional.orElseGet(Optional.java:267) ~[na:1.8.0_221]
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:251) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:29) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:106) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:105) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:107) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:107) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:75) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_221]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_221]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69) ~[junit5-rt.jar:na]
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) ~[junit-rt.jar:na]
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) ~[junit-rt.jar:na]
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) ~[junit-rt.jar:na]
Caused by: java.lang.IllegalStateException: Unable to read the page at position 127268470925123 [1.4.200/6]
at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.readPage(MVStore.java:2213) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVMap.readPage(MVMap.java:672) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVMap.readOrCreateRootPage(MVMap.java:688) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVMap.setRootPos(MVMap.java:682) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.openMap(MVStore.java:576) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.openMap(MVStore.java:535) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.openMap(MVStore.java:516) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.removeMap(MVStore.java:2742) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.handleUpgradeIssues(Database.java:866) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.open(Database.java:742) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.openDatabase(Database.java:307) ~[h2-1.4.200.jar:1.4.200]
... 107 common frames omitted
Caused by: java.lang.IllegalStateException: Unsupported type 17 [1.4.200/3]
at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.type.ObjectDataType.newType(ObjectDataType.java:165) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:229) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:114) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.Page.read(Page.java:605) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.Page.read(Page.java:239) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.readPage(MVStore.java:2211) ~[h2-1.4.200.jar:1.4.200]
... 117 common frames omitted

2019-11-12 15:31:20.481  INFO 21368 --- [           main] .c.d.s.1004luciferApplicationTests : Started 1004luciferApplicationTests in 2.591 seconds (JVM running for 3.769)

kr.co._1004lucifer.sample.TestService@22048bd6
2019-11-12 15:31:20.686  INFO 21368 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-11-12 15:31:20.700 ERROR 21368 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.

org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: Unable to read the page at position 127268470925123 [1.4.200/6]" [50000-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:505) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.get(DbException.java:194) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.convert(DbException.java:347) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.openDatabase(Database.java:333) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.<init>(Database.java:301) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.openSession(Engine.java:74) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.openSession(Engine.java:192) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200]
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200]
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200]
at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:353) ~[HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473) [HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:562) [HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) [HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) [HikariCP-3.4.1.jar:na]
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:263) [spring-jdbc-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:376) [spring-tx-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:572) [spring-tx-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:360) [spring-tx-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99) [spring-tx-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) [spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) [spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) [spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at kr.co._1004lucifer.sample.TestService$$EnhancerBySpringCGLIB$$5aa5b4fe.getSample(<generated>) [classes/:na]
at kr.co._1004lucifer.1004luciferApplicationTests.contextLoads(1004luciferApplicationTests.java:18) [test-classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_221]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_221]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_221]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_221]
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675) [junit-platform-commons-1.5.2.jar:1.5.2]
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) [junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125) [junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132) [junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124) [junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:74) [junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_221]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_221]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69) ~[junit5-rt.jar:na]
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) ~[junit-rt.jar:na]
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) ~[junit-rt.jar:na]
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) ~[junit-rt.jar:na]
Caused by: java.lang.IllegalStateException: Unable to read the page at position 127268470925123 [1.4.200/6]
at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.readPage(MVStore.java:2213) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVMap.readPage(MVMap.java:672) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVMap.readOrCreateRootPage(MVMap.java:688) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVMap.setRootPos(MVMap.java:682) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.openMap(MVStore.java:576) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.openMap(MVStore.java:535) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.openMap(MVStore.java:516) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.removeMap(MVStore.java:2742) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.handleUpgradeIssues(Database.java:866) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.open(Database.java:742) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Database.openDatabase(Database.java:307) ~[h2-1.4.200.jar:1.4.200]
... 90 common frames omitted
Caused by: java.lang.IllegalStateException: Unsupported type 17 [1.4.200/3]
at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.type.ObjectDataType.newType(ObjectDataType.java:165) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:229) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:114) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.Page.read(Page.java:605) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.Page.read(Page.java:239) ~[h2-1.4.200.jar:1.4.200]
at org.h2.mvstore.MVStore.readPage(MVStore.java:2211) ~[h2-1.4.200.jar:1.4.200]
... 100 common frames omitted



org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: Unable to read the page at position 127268470925123 [1.4.200/6]" [50000-200]

at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:307)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:376)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:572)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:360)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
at kr.co._1004lucifer.sample.TestService$$EnhancerBySpringCGLIB$$5aa5b4fe.getSample(<generated>)
at kr.co._1004lucifer.1004luciferApplicationTests.contextLoads(1004luciferApplicationTests.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:74)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: Unable to read the page at position 127268470925123 [1.4.200/6]" [50000-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:505)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
at org.h2.message.DbException.get(DbException.java:194)
at org.h2.message.DbException.convert(DbException.java:347)
at org.h2.engine.Database.openDatabase(Database.java:333)
at org.h2.engine.Database.<init>(Database.java:301)
at org.h2.engine.Engine.openSession(Engine.java:74)
at org.h2.engine.Engine.openSession(Engine.java:192)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171)
at org.h2.engine.Engine.createSession(Engine.java:166)
at org.h2.engine.Engine.createSession(Engine.java:29)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152)
at org.h2.Driver.connect(Driver.java:69)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:353)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:562)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:263)
... 72 more
Caused by: java.lang.IllegalStateException: Unable to read the page at position 127268470925123 [1.4.200/6]
at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950)
at org.h2.mvstore.MVStore.readPage(MVStore.java:2213)
at org.h2.mvstore.MVMap.readPage(MVMap.java:672)
at org.h2.mvstore.MVMap.readOrCreateRootPage(MVMap.java:688)
at org.h2.mvstore.MVMap.setRootPos(MVMap.java:682)
at org.h2.mvstore.MVStore.openMap(MVStore.java:576)
at org.h2.mvstore.MVStore.openMap(MVStore.java:535)
at org.h2.mvstore.MVStore.openMap(MVStore.java:516)
at org.h2.mvstore.MVStore.removeMap(MVStore.java:2742)
at org.h2.engine.Database.handleUpgradeIssues(Database.java:866)
at org.h2.engine.Database.open(Database.java:742)
at org.h2.engine.Database.openDatabase(Database.java:307)
... 90 more
Caused by: java.lang.IllegalStateException: Unsupported type 17 [1.4.200/3]
at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950)
at org.h2.mvstore.type.ObjectDataType.newType(ObjectDataType.java:165)
at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:229)
at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:114)
at org.h2.mvstore.Page.read(Page.java:605)
at org.h2.mvstore.Page.read(Page.java:239)
at org.h2.mvstore.MVStore.readPage(MVStore.java:2211)
... 100 more


2019-11-12 15:31:20.725  INFO 21368 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
Disconnected from the target VM, address: '127.0.0.1:63066', transport: 'socket'

Process finished with exit code -1







원인 및 해결방법


 H2 버그로 의심됨

 - h2-1.4.196 으로 DB를 접근 후 h2-1.4.200으로 다시 접근 시 오류가 발생
 - h2-1.4.200 으로 열기전에 h2-1.4.199로 열면 오류가 발생하지 않음.









IntelliJ 에서의 상황

IntelliJ 의 Database 항목에서 H2 가 1.4.196 버전을 사용한다는 것을 확인했다.





조치사항
 - 아래와 같이 pom.xml 파일에 1.4.196 버전을 지정함으로 Application 에서 똑같은 버전의 H2 드라이버 버전으로 변경 후 문제 없음


<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.196</version>
    <scope>runtime</scope>
</dependency>








참고
https://github.com/h2database/h2database/issues/2204


[Maven] 에러 원인 - Failed to execute goal org.apache.maven.plugins:maven-clean-plugin (Failed to clean project: Failed to delete)





증상

메이븐 clean 수행 시 아래와 같은 오류가 발생하며 clean 이 정상적으로 동작하지 않았다.


Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:3.1.0:clean (default-clean) on project 1004lucifer: Failed to clean project: Failed to delete D:\source\1004lucifer\target





그냥 무시하고 target 디렉토리를 직접 지우려 했는데 아래와 같이 윈도우 탐색기에서도 삭제 되지 않았다.






원인 및 해결방법


해당 target 디렉토리가 사용중인(열려있는) 상태라 삭제가 되지 않았다.
만일 cmd 가 아니라면 탐색기에서 해당 디렉토리를 열어놓고 있는지 확인을 해보길 바란다.
(못찾겠는경우 컴퓨터 재부팅이 가장 쉬운 방법이 되겠다.)



[Docker] 개발DB Oracle 환경을 로컬에 그대로 구축하는 방법




포스팅 작성날짜: 2019.11.13


서문

이 글은 회사에서 진행하는 프로젝트의 개발DB서버가 외부에서 접속이 되지 않는 상황에 사용하기 위해 작성이 되었다.

외부에서 개발DB로 접속은 되지 않지만 프로젝트 내부에서 인터넷이 되거나 외부에서 접속 가능한 SVN/GIT 같은 환경이 있다면 사용해볼만 하다.

사내 개발DB와 같은 환경(스키마,데이터)를 어디서나 이용할 수 있다는데 장점이 있다.


PS.
단순히 깨끗한 오라클 개발DB가 필요한 경우라는 다음 링크를 참고하길 바란다.
링크 - [Docker] Oracle 12c 구성 및 사용하기 (Oracle 공식 배포버전)

이 글은 위 링크의 글에서 확장된 개념으로 생각하면 좋을 듯 싶다.
따라서 위 링크의 내용을 따라하지 않더라도 한번 훓어보고 어떤식으로 진행되는지 알고 있어야 한다.




작업 순서

1. 하려는 것
2. 준비해야 할 것
2. 작업 개념 설명
3. 작업 방법
4. 작업 실행
5. 주의사항




하려는 것

- 기본적으로 오라클 개발DB와 동일한 환경을 로컬에 구성
1. 접속정보 동일 (SID, id, pw, port)
2. 테이블 및 데이터 동일
 (아래 준비사항에서 설명하듯 개발DB의 백업 sql 파일이 필요한다.)





준비해야 할 것

- 오라클 개발DB의 백업 sql 파일 필요

1. 스키마 파일 (create 구문)
ex)
create table API_ACCESS
(
    ACCESS_DT   DATE               not null,
    ACCESS_CODE VARCHAR2(200 char) not null,
    EXPIRE_IN   NUMBER(10)         not null
)
/

2. 데이터 파일 (insert 구문)
ex)
INSERT INTO API_ACCESS (ACCESS_DT, ACCESS_CODE, EXPIRE_IN) VALUES (TO_DATE('2019-07-26 14:35:33', 'YYYY-MM-DD HH24:MI:SS'), '123456', 86400);
INSERT INTO API_ACCESS (ACCESS_DT, ACCESS_CODE, EXPIRE_IN) VALUES (TO_DATE('2019-07-25 14:21:47', 'YYYY-MM-DD HH24:MI:SS'), '123456', 86400);
INSERT INTO API_ACCESS (ACCESS_DT, ACCESS_CODE, EXPIRE_IN) VALUES (TO_DATE('2019-07-09 11:47:58', 'YYYY-MM-DD HH24:MI:SS'), '123456', 86400);
INSERT INTO API_ACCESS (ACCESS_DT, ACCESS_CODE, EXPIRE_IN) VALUES (TO_DATE('2019-07-10 11:48:22', 'YYYY-MM-DD HH24:MI:SS'), '123456', 86400);
INSERT INTO API_ACCESS (ACCESS_DT, ACCESS_CODE, EXPIRE_IN) VALUES (TO_DATE('2019-07-11 12:06:58', 'YYYY-MM-DD HH24:MI:SS'), '123456', 86400);
INSERT INTO API_ACCESS (ACCESS_DT, ACCESS_CODE, EXPIRE_IN) VALUES (TO_DATE('2019-07-12 15:53:32', 'YYYY-MM-DD HH24:MI:SS'), '123456', 86400);





작업 개념

- Oracle에서 배포한 Oracle 12C 이미지를 Docker 컨테이너 구동 시
초기에 내부적으로 Oracle 셋팅을 하게되는데
컨테이너 구동 전 Oracle 셋팅파일 커스텀한 파일로 교체하여
원하는대로 Oracle 셋팅을 할 수 있게 작업한다.
(도커 컨테이너 구동 후 setup 디렉토리의 파일들을 모두 내려받아 스크립트 분석 하게되면 본인의 입맞에 맞게 다른 커스텀이 가능하다.)


D:\source\1004lucifer\src\main\docker>dockerSsh.bat

D:\source\1004lucifer\src\main\docker>docker exec -it local_db bash
[oracle@c1c7c5acbca2 ~]$
[oracle@c1c7c5acbca2 ~]$ ll
total 8
drwxr-xr-x 1 oracle oinstall 4096 Nov 13 00:35 initSql
drwxr-xr-x 1 oracle oinstall 4096 Nov 13 00:40 setup
[oracle@c1c7c5acbca2 ~]$
# 컨테이너 구동 전 테이블, 데이터 파일을 미리 복사 (/home/oracle/initSql/*.sql)
[oracle@c1c7c5acbca2 ~]$ ll initSql/
total 8
-rwxr-xr-x 1 oracle oinstall 851 Nov 12 23:55 API_ACCESS.sql
-rwxr-xr-x 1 oracle oinstall 171 Nov 12 23:31 SCHEME.sql
[oracle@c1c7c5acbca2 ~]$
# configDB.sh, configDBora.sh 기본 셋팅파일을 커스텀 파일로 교체
[oracle@c1c7c5acbca2 ~]$ ll setup/
total 60
-rw-r--r-- 1 oracle oinstall  157 Nov 13 00:40 DB_ENV
-rwxr-xr-x 1 oracle oinstall 1591 Nov 13 00:22 configDB.sh
-rwxr-xr-x 1 oracle oinstall 7434 Nov 13 00:01 configDBora.sh
-rwxr-xr-- 1 oracle oinstall 2165 Aug 18  2017 dockerInit.sh
-rwxr-xr-- 1 oracle oinstall  763 Aug 18  2017 healthcheck.sh
drwxr-xr-- 1 oracle oinstall 4096 Nov 13 00:38 log
-rwxr-xr-- 1 oracle oinstall 1782 Aug 18  2017 paramChk.sh
-rwxr-xr-- 1 oracle oinstall   18 Aug 18  2017 patchDB.dat
-rwxr-xr-- 1 oracle oinstall 1229 Aug 18  2017 patchDB.sh
-rwxr-xr-- 1 oracle oinstall 3019 Aug 18  2017 setupDB.sh
-rwxr-xr-- 1 oracle oinstall 1298 Aug 18  2017 shutDB.sh
-rwxr-xr-- 1 oracle oinstall 1361 Aug 18  2017 startupDB.sh
-rwxr-xr-- 1 oracle oinstall 1708 Aug 18  2017 tnsentry.sh
-rwxr-xr-- 1 oracle oinstall 1340 Aug 18  2017 untarDB.sh
[oracle@c1c7c5acbca2 ~]$






작업 방법

- 디렉토리 구조는 Java 프로젝트 기준으로 다음과 같다.
(서로에 대해 상대경로로 의존을 하기 때문에 본 내용의 내용과 똑같이 하려면 구조를 맞춰줘야 한다.)


1. SCHEME.sql, API_ACCESS.sql 파일은 위에 준비해야 할것의 create, insert 파일



2. ORACLE 셋팅 설정 값

- ora_sample.conf 파일 (샘플파일)

DB_SID=             # default: ORCLCDB
DB_PDB=             # default: ORCLPDB1
DB_MEMORY=          # default: 2GB
DB_DOMAIN=          # default: localdomain


- ora.conf (실제 사용하는 파일)

DB_SID=LUCIFER




3. Dockerfile (이미지 구성 파일)


FROM store/oracle/database-enterprise:12.2.0.1-slim

WORKDIR /home/oracle

RUN mkdir -p initSql
COPY --chown=oracle:oinstall sql/SCHEME.sql initSql/
COPY --chown=oracle:oinstall sql/API_ACCESS.sql initSql/

COPY --chown=oracle:oinstall dockerInit/configDB.sh setup/configDB.sh
COPY --chown=oracle:oinstall dockerInit/configDBora.sh setup/configDBora.sh




4. Oracle 커스텀 셋팅 파일

- configDB.sh

#!/bin/sh
#
# $Header: dbaas/docker/build/dbsetup/setup/configDB.sh rduraisa_docker_122_image/2 2017/03/02 13:26:06 rduraisa Exp $
#
# configDB.sh
#
# Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
#
#    NAME
#      configDB.sh - configure database as root
#
#    DESCRIPTION
#      rename the DB to customized name
#
#    NOTES
#      run as root and call renameDBora.sh inside
#
#    MODIFIED   (MM/DD/YY)
#    rduraisa    03/02/17 - Modify scripts to build for 12102 and 12201
#    xihzhang    10/25/16 - Remove EE bundles
#    xihzhang    08/08/16 - Remove privilege mode
#    xihzhang    05/23/16 - Creation
#

echo `date`
echo "Start Docker DB configuration"

# basic parameters
ENV_FILE=/home/oracle/setup/DB_ENV
BASH_RC=/home/oracle/.bashrc
ORA_TAB=/etc/oratab

# set env
source $ENV_FILE

ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1

# set env for oracle user
echo "export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1" >> $BASH_RC
echo "export OH=$ORACLE_HOME" >> $BASH_RC
echo "export PATH=$PATH:$ORACLE_HOME/bin" >> $BASH_RC
echo "export TNS_ADMIN=$ORACLE_HOME/admin/${DB_SID}" >> $BASH_RC
echo "export ORACLE_SID=$DB_SID;" >> $BASH_RC

# set env - 1004lucifer
# 시간대역을 설정해 준다.
echo "export TZ='Asia/Seoul'" >> /home/oracle/.bashrc

source $BASH_RC

# configure database
echo "Call configDBora.sh to configure database"
/bin/bash /home/oracle/setup/configDBora.sh

# remove passwd info
echo "Remove password info"
sed -i '/DB_PASSWD/d' $ENV_FILE
unset DB_PASSWD

echo "Docker DB configuration is complete !"

# end


- configDBora.sh

#!/bin/sh
#
# $Header: dbaas/docker/build/dbsetup/setup/configDBora.sh rduraisa_docker_122_image/6 2017/04/02 06:29:55 rduraisa Exp $
#
# configDBora.sh
#
# Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
#
#    NAME
#      configDBora.sh - configure database as oracle user
#
#    DESCRIPTION
#      rename the DB to customized name
#
#    NOTES
#      run as oracle
#
#    MODIFIED   (MM/DD/YY)
#    rduraisa    03/02/17 - Modify scripts to build for 12102 and 12201
#    xihzhang    10/25/16 - Remove EE bundles
#    xihzhang    08/08/16 - Remove privilege mode
#    xihzhang    05/23/16 - Creation
#

echo `date`
echo "Configure DB as oracle user"

# basic parameters
SETUP_DIR=/home/oracle/setup

IFS='.' read -r -a dbrelarr <<< 12.2.0

if [[ ${dbrelarr[0]} == 12 && ${dbrelarr[1]} == 1 ]];
then
    PATCH_LOG=${SETUP_DIR}/log/patchDB.log
    # unpatch opc features
    echo "Patching Database ...."
    /bin/bash ${SETUP_DIR}/patchDB.sh 2>&1 >> ${PATCH_LOG}

    $ORACLE_HOME/bin/relink as_installed
fi

#setup directories and soft links
echo "Setup Database directories ..."
mkdir -p /ORCL/u01/app/oracle/diag /u01/app/oracle /u02/app/oracle /u03/app/oracle /u04/app/oracle
mkdir -p $TNS_ADMIN
ln -s /ORCL/$ORACLE_HOME/dbs $ORACLE_HOME/dbs
ln -s /ORCL/u01/app/oracle/diag /u01/app/oracle/diag
ln -s /ORCL/u02/app/oracle/audit /u02/app/oracle/audit
ln -s /ORCL/u02/app/oracle/oradata /u02/app/oracle/oradata
ln -s /ORCL/u03/app/oracle/fast_recovery_area /u03/app/oracle/fast_recovery_area
ln -s /ORCL/u04/app/oracle/redo /u04/app/oracle/redo

if [[ $EXISTING_DB = false ]];
then
  cd /u01/app/oracle/product/12.2.0/dbhome_1/dbs/
  # set domain
  echo "*.db_domain='$DB_DOMAIN'" >> initORCLCDB.ora
  # set sga & pga
  MEMORY=${DB_MEMORY//[!0-9]/}
  SGA_MEM=$(($MEMORY * 640))M
  PGA_MEM=$(($MEMORY * 384))M
  echo "*.sga_target=$SGA_MEM" >> initORCLCDB.ora
  echo "*.pga_aggregate_target=$PGA_MEM" >> initORCLCDB.ora

  # create the diag directory to avoid errors with the below mv command
  mkdir -p /u01/app/oracle/diag/rdbms/orclcdb/ORCLCDB

  if [ "$DB_SID" != "ORCLCDB" ]
  then
  # mount db
      sqlplus / as sysdba 2>&1 <<EOF
      startup mount pfile=/u01/app/oracle/product/12.2.0/dbhome_1/dbs/initORCLCDB.ora;
      exit;
EOF

  # nid change name
      echo "NID change db name"
      echo "Y" | nid target=/ dbname=$DB_SID

  # update init.ora
      rm -f init$DB_SID.ora
      cp initORCLCDB.ora init$DB_SID.ora

  # change sid
      sed -i -- "s#ORCLCDB#$DB_SID#g" init$DB_SID.ora

  # rename all the dirs/files
      mv /u01/app/oracle/diag/rdbms/orclcdb/ORCLCDB /u01/app/oracle/diag/rdbms/orclcdb/$DB_SID
      mv /u01/app/oracle/diag/rdbms/orclcdb /u01/app/oracle/diag/rdbms/${DB_SID,,}
      mv /u02/app/oracle/audit/ORCLCDB /u02/app/oracle/audit/$DB_SID
      mv /u02/app/oracle/oradata/ORCLCDB /u02/app/oracle/oradata/$DB_SID   # cp -R
      mv /u03/app/oracle/fast_recovery_area/ORCLCDB /u03/app/oracle/fast_recovery_area/$DB_SID
      mv /u02/app/oracle/oradata/$DB_SID/cntrlORCLCDB.dbf /u02/app/oracle/oradata/$DB_SID/cntrl${DB_SID}.dbf
      mv /u03/app/oracle/fast_recovery_area/$DB_SID/cntrlORCLCDB2.dbf /u03/app/oracle/fast_recovery_area/$DB_SID/cntrl${DB_SID}2.dbf

  # make links
      cd /u02/app/oracle/oradata/
      ln -s $DB_SID ORCLCDB

  # change SID
      export ORACLE_SID=$DB_SID

  # db setup
  # enable archivelog + change global name + create spfile
      NEW_ORA=/u01/app/oracle/product/12.2.0/dbhome_1/dbs/init$DB_SID.ora
      sqlplus / as sysdba 2>&1 <<EOF
      create spfile from pfile='$NEW_ORA';
      startup mount;
      alter database open resetlogs;
      alter database rename global_name to $DB_SID.$DB_DOMAIN;
      show parameter spfile;
      show parameter encrypt_new_tablespaces;
      alter user sys identified by "$DB_PASSWD";
      alter user system identified by "$DB_PASSWD";
      exit;
EOF

  else
  # db setup
  # enable archivelog + change global name + create spfile
      NEW_ORA=/u01/app/oracle/product/12.2.0/dbhome_1/dbs/init$DB_SID.ora
      sqlplus / as sysdba 2>&1 <<EOF
      create spfile from pfile='$NEW_ORA';
      startup;
      alter database rename global_name to $DB_SID.$DB_DOMAIN;
      show parameter spfile;
      show parameter encrypt_new_tablespaces;
      alter user sys identified by "$DB_PASSWD";
      alter user system identified by "$DB_PASSWD";
      exit;
EOF
  fi

  # create orapw
  echo "update password"
  echo "$DB_PASSWD" | orapwd file=/u01/app/oracle/product/12.2.0/dbhome_1/dbs/orapw$DB_SID

  # create pdb
  echo "create pdb : $DB_PDB"
  sqlplus / as sysdba 2>&1 <<EOF
    create pluggable database $DB_PDB ADMIN USER sys1 identified by "$DB_PASSWD"
    default tablespace users
      datafile '/u02/app/oracle/oradata/ORCLCDB/orclpdb1/users01.dbf'
      size 10M reuse autoextend on maxsize unlimited
      file_name_convert=('/u02/app/oracle/oradata/ORCL/pdbseed','/u02/app/oracle/oradata/ORCLCDB/orclpdb1');
    alter pluggable database $DB_PDB open;
    alter pluggable database all save state;
    exit;
EOF

  # config charset - 1004lucifer
  # 한글 사용을 위해 셋팅 (개발DB 설정에 따라 바뀔 수 있음)
  echo "update language, charset"
  sqlplus / as sysdba 2>&1 <<EOF
    update sys.props$ set value$='KOREAN_KOREA.UTF8' where name='NLS_LANGUAGE';
    update sys.props$ set value$='UTF8' where name='NLS_CHARACTERSET';
    update sys.props$ set value$='UTF8' where name='NLS_NCHAR_CHARACTERSET';
    commit;
    shutdown;
    startup;
    exit;
EOF

  # create lucifer user - 1004lucifer
  # 개발 DB에서 사용하던 계정 생성
  echo "create user : lucifer"
  sqlplus / as sysdba 2>&1 <<EOF
    alter session set "_ORACLE_SCRIPT"=true;
    create user lucifer identified by 1234;
    grant connect, resource, dba to lucifer;
    exit;
EOF

  # init DB - 1004lucifer
  # 개발DB의 테이블,데이터를 구성한다.
  echo "init DB"
  export NLS_LANG=KOREAN_KOREA.UTF8
  sqlplus lucifer/1234 2>&1 <<EOF
    @/home/oracle/initSql/SCHEME.sql;
    @/home/oracle/initSql/API_ACCESS.sql;
    exit;
EOF

  if [[ ${dbrelarr[0]} == 12 && ${dbrelarr[1]} > 1 ]] || [[ ${dbrelarr[0]} > 12 ]];
  then
    echo "Reset Database parameters"
    sqlplus / as sysdba 2>&1 <<EOF
      alter system set encrypt_new_tablespaces=ddl scope=both;
      exit;
EOF
  fi
else
  echo "startup database instance"
  sqlplus / as sysdba 2>&1 <<EOF
    startup;
    exit;
EOF
fi

## db network set
# sqlnet.ora
SQLNET_ORA=$TNS_ADMIN/sqlnet.ora
echo "NAME.DIRECTORY_PATH= {TNSNAMES, EZCONNECT, HOSTNAME}" >> $SQLNET_ORA
echo "SQLNET.EXPIRE_TIME = 10" >> $SQLNET_ORA
echo "SSL_VERSION = 1.0" >> $SQLNET_ORA
# listener.ora
LSNR_ORA=$TNS_ADMIN/listener.ora
echo "LISTENER = \
  (DESCRIPTION_LIST = \
    (DESCRIPTION = \
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) \
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) \
    ) \
  ) \
\
" >> $LSNR_ORA
echo "DIAG_ADR_ENABLED = off"  >> $LSNR_ORA
echo "SSL_VERSION = 1.0"  >> $LSNR_ORA
# tnsnames.ora
TNS_ORA=$TNS_ADMIN/tnsnames.ora
echo "$DB_SID = \
  (DESCRIPTION = \
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) \
    (CONNECT_DATA = \
      (SERVER = DEDICATED) \
      (SERVICE_NAME = $DB_SID.$DB_DOMAIN) \
    ) \
  ) \
" >> $TNS_ORA
echo "$DB_PDB = \
  (DESCRIPTION = \
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) \
    (CONNECT_DATA = \
      (SERVER = DEDICATED) \
      (SERVICE_NAME = $DB_PDB.$DB_DOMAIN) \
    ) \
  ) \
" >> $TNS_ORA

# start listener
lsnrctl start

# clean
unset DB_PASSWD
history -w
history -c

echo ""
echo "DONE!"

# end




5. 도커 명령어 (배치)실행 파일

- dockerBuild.bat

docker build --tag local_db:1.0 .


- dockerRun.bat  (접속포트 수정 => 외부접속포트:1521)

docker run -dit --name local_db -p 1521:1521 --env-file dockerInit/ora.conf local_db:1.0


- dockerSsh.bat

docker exec -it local_db bash






작업 실행

- 도커 (배치)실행파일 수행


Microsoft Windows [Version 10.0.18362.418]
(c) 2019 Microsoft Corporation. All rights reserved.

D:\source\1004lucifer\src\main\docker>dockerBuild.bat

D:\source\1004lucifer\src\main\docker>docker build --tag local_db:1.0 .
Sending build context to Docker daemon  23.55kB
Step 1/7 : FROM store/oracle/database-enterprise:12.2.0.1-slim
12.2.0.1-slim: Pulling from store/oracle/database-enterprise
4ce27fe12c04: Pull complete
9d3556e8e792: Pull complete
fc60a1a28025: Pull complete
0c32e4ed872e: Pull complete
be0a1f1e8dfd: Pull complete
Digest: sha256:dbd87ae4cc3425dea7ba3d3f34e062cbd0afa89aed2c3f3d47ceb5213cc0359a
Status: Downloaded newer image for store/oracle/database-enterprise:12.2.0.1-slim
 ---> 27c9559d36ec
Step 2/7 : WORKDIR /home/oracle
 ---> Running in d28905860446
Removing intermediate container d28905860446
 ---> 85483b9a765c
Step 3/7 : RUN mkdir -p initSql
 ---> Running in a0bce3911848
Removing intermediate container a0bce3911848
 ---> 32291109be05
Step 4/7 : COPY --chown=oracle:oinstall sql/SCHEME.sql initSql/
 ---> 0f42f6808349
Step 5/7 : COPY --chown=oracle:oinstall sql/API_ACCESS.sql initSql/
 ---> 6d7cc0d3d8eb
Step 6/7 : COPY --chown=oracle:oinstall dockerInit/configDB.sh setup/configDB.sh
 ---> f508c8847763
Step 7/7 : COPY --chown=oracle:oinstall dockerInit/configDBora.sh setup/configDBora.sh
 ---> b369d71bdf7b
Successfully built b369d71bdf7b
Successfully tagged local_db:1.0
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

D:\source\1004lucifer\src\main\docker>
D:\source\1004lucifer\src\main\docker>
D:\source\1004lucifer\src\main\docker>
D:\source\1004lucifer\src\main\docker>dockerRun.bat

D:\source\1004lucifer\src\main\docker>docker run -dit --name local_db -p 1521:1521 --env-file dockerInit/ora.conf local_db:1.0
c1c7c5acbca239124ca3946c3cb3d2fe8983e45352f749a93cd44979921288d1

D:\source\1004lucifer\src\main\docker>




위와같이 도커를 띄운 후 잠시 후 Oracle 접속하면 정상적으로 테이블과 데이터가 들어가 있는것을 확인 할 수 있다.






주의사항

다음의 상황에서 문제가 발생할 수 있다.

1. insert 쿼리가 들어있는 sql 파일이 바로 실행할 수 없는 내용이 있다.

 예를들어 한줄의 insert 쿼리가 아니라 아래와 같은 경우에는 모든 데이터가 올바르게 들어가지 않을 수도있다. (게시판 컨텐츠의 경우 이와 같이 나올 수 있다.)

insert 구문이 모두 한줄로 나올 수 있도록 수정을 해야 한다.
(나의 경우에는 에디터에서 정규표현식을 이용해 일괄적으로 수정했다.)


insert into TABLE_NAME values (1, '게시판 내용 입니다.', sysdate);
insert into TABLE_NAME values (2, '일반 게시판
내용 입니다', sysdate);
insert into TABLE_NAME values (3, '게시판 내용', sysdate);




2. 로컬 오라클에 접속 되지 않는다.

- 도커 컨테이너 내부에서 오라클 셋팅이 끝나고 리스너까지 올라오는데 시간이 걸린다. 잘못된 설정이 없더라도 컨테이너를 띄우고 어느정도 시간이 지나기 까지 접속이 되지 않는다.



* 아래와 같이 docker 로그 확인이 가능하며 로그 확인 시 어느부분이 문제가 되는지 대부분 찾을 수 있다.


D:\source\1004lucifer\src\main\docker>docker logs local_db
Setup Oracle Database
Oracle Database 12.2.0.1 Setup
Tue Nov 12 15:36:32 UTC 2019

Check parameters ......
log file is : /home/oracle/setup/log/paramChk.log
paramChk.sh is done at 0 sec

untar DB bits ......
log file is : /home/oracle/setup/log/untarDB.log
untarDB.sh is done at 94 sec

config DB ......
log file is : /home/oracle/setup/log/configDB.log

DBNEWID: Release 12.2.0.1.0 - Production on Wed Nov 13 00:38:21 2019

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

Connected to database ORCLCDB (DBID=2722599211)

Connected to server version 12.2.0

Control Files in database:
    /u02/app/oracle/oradata/ORCLCDB/cntrlORCLCDB.dbf
    /u03/app/oracle/fast_recovery_area/ORCLCDB/cntrlORCLCDB2.dbf

Change database ID and database name ORCLCDB to LUCIFER? (Y/[N]) =>
Proceeding with operation
Changing database ID from 2722599211 to 1882728639
Changing database name from ORCLCDB to LUCIFER
    Control File /u02/app/oracle/oradata/ORCLCDB/cntrlORCLCDB.dbf - modified
    Control File /u03/app/oracle/fast_recovery_area/ORCLCDB/cntrlORCLCDB2.dbf - modified
    Datafile /u02/app/oracle/oradata/ORCL/system01.db - dbid changed, wrote new name
    Datafile /u02/app/oracle/oradata/ORCL/undotbs01.db - dbid changed, wrote new name
    Datafile /u02/app/oracle/oradata/ORCL/sysaux01.db - dbid changed, wrote new name
    Datafile /u02/app/oracle/oradata/ORCL/pdbseed/system01.db - dbid changed, wrote new name
    Datafile /u02/app/oracle/oradata/ORCL/pdbseed/sysaux01.db - dbid changed, wrote new name
    Datafile /u02/app/oracle/oradata/ORCL/xdb01.db - dbid changed, wrote new name
    Datafile /u02/app/oracle/oradata/ORCL/pdbseed/xdb01.db - dbid changed, wrote new name
    Datafile /u02/app/oracle/oradata/ORCL/pdbseed/temp01.db - dbid changed, wrote new name
    Datafile /u02/app/oracle/oradata/ORCL/temp01.db - dbid changed, wrote new name
    Control File /u02/app/oracle/oradata/ORCLCDB/cntrlORCLCDB.dbf - dbid changed, wrote new name
    Control File /u03/app/oracle/fast_recovery_area/ORCLCDB/cntrlORCLCDB2.dbf - dbid changed, wrote new name
    Instance shut down

Database name changed to LUCIFER.
Modify parameter file and generate a new password file before restarting.
Database ID for database LUCIFER changed to 1882728639.
All previous backups and archived redo logs for this database are unusable.
Database is not aware of previous backups and archived logs in Recovery Area.
Database has been shutdown, open database with RESETLOGS option.
Succesfully changed database name and ID.
DBNEWID - Completed succesfully.

Tue Nov 12 15:38:06 UTC 2019
Start Docker DB configuration
Call configDBora.sh to configure database
Wed Nov 13 00:38:06 KST 2019
Configure DB as oracle user
Setup Database directories ...

SQL*Plus: Release 12.2.0.1.0 Production on Wed Nov 13 00:38:07 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> ORACLE instance started.

Total System Global Area 1342177280 bytes
Fixed Size                  8792536 bytes
Variable Size             352323112 bytes
Database Buffers          973078528 bytes
Redo Buffers                7983104 bytes
Database mounted.
SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
NID change db name

SQL*Plus: Release 12.2.0.1.0 Production on Wed Nov 13 00:38:39 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL>
File created.

SQL> ORACLE instance started.

Total System Global Area 1342177280 bytes
Fixed Size                  8792536 bytes
Variable Size             352323112 bytes
Database Buffers          973078528 bytes
Redo Buffers                7983104 bytes
Database mounted.
SQL>
Database altered.

SQL>
Database altered.

SQL>
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/12.2.0
                                                 /dbhome_1/dbs/spfileLUCIFER.ora
SQL>
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
encrypt_new_tablespaces              string      CLOUD_ONLY
SQL>
User altered.

SQL>
User altered.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
update password

Enter password for SYS:
create pdb : ORCLPDB1

SQL*Plus: Release 12.2.0.1.0 Production on Wed Nov 13 00:38:53 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>   2    3    4    5
Pluggable database created.

SQL>
Pluggable database altered.

SQL>
Pluggable database altered.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
update language, charset

SQL*Plus: Release 12.2.0.1.0 Production on Wed Nov 13 00:39:15 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>
1 row updated.

SQL>
1 row updated.

SQL>
1 row updated.

SQL>
Commit complete.

SQL> Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> ORACLE instance started.

Total System Global Area 1342177280 bytes
Fixed Size                  8792536 bytes
Variable Size             352323112 bytes
Database Buffers          973078528 bytes
Redo Buffers                7983104 bytes
Database mounted.
Database opened.
SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
create user : lucifer

SQL*Plus: Release 12.2.0.1.0 Production on Wed Nov 13 00:40:33 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>
Session altered.

SQL>
User created.

SQL>
Grant succeeded.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
init DB

SQL*Plus: Release 12.2.0.1.0 Production on 수 11월 13 00:40:34 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


다음에 접속됨:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>
테이블이 생성되었습니다.

SQL>
1 개의 행이 만들어졌습니다.


1 개의 행이 만들어졌습니다.


1 개의 행이 만들어졌습니다.


1 개의 행이 만들어졌습니다.


1 개의 행이 만들어졌습니다.


1 개의 행이 만들어졌습니다.

SQL> Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production에서 분리되었습니다.
Reset Database parameters

SQL*Plus: Release 12.2.0.1.0 Production on 수 11월 13 00:40:35 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


다음에 접속됨:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>
시스템이 변경되었습니다.

SQL> Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production에서 분리되었습니다.

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 13-11월-2019 00:40:35

Copyright (c) 1991, 2016, Oracle.  All rights reserved.

시작 /u01/app/oracle/product/12.2.0/dbhome_1/bin/tnslsnr: 잠시만 기다리세요...

TNSLSNR for Linux: Version 12.2.0.1.0 - Production
시스템 매개변수 파일은 /u01/app/oracle/product/12.2.0/dbhome_1/admin/LUCIFER/listener.ora 입니다
/u01/app/oracle/diag/tnslsnr/c1c7c5acbca2/listener/alert/log.xml (으)로 로그 메시지를 기록했습니다
리스닝이: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
리스닝이: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))에 연결되었습니다
리스너의 상태
------------------------
별칭                     LISTENER
버전                     TNSLSNR for Linux: Version 12.2.0.1.0 - Production
시작 날짜                 13-11월-2019 00:40:36
업타임                   0 일 0 시간. 0 분. 0 초
트레이스 수준            off
보안                     ON: Local OS Authentication
SNMP                     OFF리스너 매개변수 파일   /u01/app/oracle/product/12.2.0/dbhome_1/admin/LUCIFER/listener.ora
리스너 로그 파일         /u01/app/oracle/diag/tnslsnr/c1c7c5acbca2/listener/alert/log.xml
끝점 요약 청취 중...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
리스너는 서비스를 지원하지 않습니다
명령이 성공적으로 수행되었습니다

DONE!
Remove password info
Docker DB configuration is complete !
configDB.sh is done at 244 sec

Done ! The database is ready for use .
# ===========================================================================
# == Add below entries to your tnsnames.ora to access this database server ==
# ====================== from external host =================================
LUCIFER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip-address>)(PORT=<port>))
    (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=LUCIFER.localdomain)))
ORCLPDB1=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip-address>)(PORT=<port>))
    (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLPDB1.localdomain)))
#
#ip-address : IP address of the host where the container is running.
#port       : Host Port that is mapped to the port 1521 of the container.
#
# The mapped port can be obtained from running "docker port <container-id>"
# ===========================================================================
===========================================================
2019-11-13T00:40:34.972296+09:00
Resize operation completed for file# 1, old size 833688K, new size 833704K
2019-11-13T00:40:35.293824+09:00
ALTER SYSTEM SET encrypt_new_tablespaces='DDL' SCOPE=BOTH;
2019-11-13T00:40:35.539180+09:00
db_recovery_file_dest_size of 17814 MB is 0.00% used. This is a
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
2019-11-13T00:40:37.099015+09:00
Errors in file /u01/app/oracle/diag/rdbms/LUCIFER/LUCIFER/trace/LUCIFER_m001_569.trc:

D:\source\1004lucifer\src\main\docker>






참고
https://www.it-note.kr/180
http://databaseindex.blogspot.com/2018/04/oracle-12c-docker-windows-ocr.html