반응형

Issue

Maven 으로 build Spring boot war 파일을 tomcat 에서 실행시 아래와 같은 에러 발생

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
01-Jul-2019 11:28:09.100 정보 [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.23
01-Jul-2019 11:28:09.126 정보 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [{tomcat}/webapps/module.war]
01-Jul-2019 11:28:09.271 심각 [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/module]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:988)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1860)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@e5ca407]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
        at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4860)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4995)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 10 more
Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.JarResourceSet@6a8a7487]
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:113)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:140)
        at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:724)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 13 more
Caused by: java.lang.IllegalArgumentException: java.util.zip.ZipException: error in opening zip file
        at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:113)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
        ... 16 more
Caused by: java.util.zip.ZipException: error in opening zip file
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:225)
        at java.util.zip.ZipFile.<init>(ZipFile.java:155)
        at java.util.jar.JarFile.<init>(JarFile.java:166)
        at java.util.jar.JarFile.<init>(JarFile.java:103)
        at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:110)
        ... 17 more
 
01-Jul-2019 11:28:09.272 심각 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [{tomcat}/webapps/module.war]
 java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/module]]
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:756)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:988)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1860)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
 
01-Jul-2019 11:28:09.274 정보 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [{tomcat}/webapps/module.war] has finished in [148] ms
01-Jul-2019 11:28:09.276 정보 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-12200"]
01-Jul-2019 11:28:09.384 정보 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-12202"]
01-Jul-2019 11:28:09.386 정보 [main] org.apache.catalina.startup.Catalina.start Server startup in 307 ms
cs

 

원인

여러가지 원인이 있겠지만 일단 public respository 에서 받아온 jar 가 아닌 프로젝트 폴더내에 추가한 jar 파일을 war 로 빌드시 잘못들어간 것으로 보임.

원본 jar 와 war를 압축해제 하여 안에있는 jar 파일의 크기를 비교하니 다름.

pom.xml 에 아래와 같이 작성해서 빌드를 한것이 문제.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<project>
    ...
    <build>
        <finalName>module</finalName>
        <plugins>
            ...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
                <configuration>
                    <webResources>
                        <resource>
                            <directory>${project.basedir}/libs/${build.os}</directory>
                            <targetPath>WEB-INF/lib</targetPath>
                            <filtering>true</filtering>
                            <includes>
                                <include>*.*</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
cs

war 빌드시 특정 파일을 include 하는 방법을 무작정 검색해서 복붙한 결과.....

위 xml 에서 filtering, include 태그를 잘못 사용하고 있었다.

자세한 내용은 : https://maven.apache.org/plugins-archives/maven-war-plugin-2.5/examples/adding-filtering-webresources.html

 

Apache Maven WAR Plugin - Adding and Filtering External Web Resources

Adding and Filtering External Web Resources The default resource directory for all Maven projects is src/main/resources which will end up in target/classes and in WEB-INF/classes in the WAR. The directory structure will be preserved in the process. The WAR

maven.apache.org

pom.xml 을 아래와 같이 수정 후 원본 jar 와 용량체크를 한뒤 배포 하니 잘 구동된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<project>
    ...
    <build>
        <finalName>module</finalName>
        <plugins>
            ...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
                <configuration>
                    <webResources>
                        <resource>
                            <directory>${project.basedir}/libs/${build.os}</directory>
                            <targetPath>WEB-INF/lib</targetPath>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
cs
반응형

'IT > 언어' 카테고리의 다른 글

spring boot embedded tomcat letsencrypt ssl 적용  (0) 2019.02.08
import os  (0) 2015.11.25
[c#] 파일 출력  (0) 2014.08.19
페이징 처리용 소스(예제?)  (0) 2014.07.08
POI Excel 파일 쓰기  (0) 2014.06.26
반응형

출처 : https://dzone.com/articles/spring-boot-secured-by-lets-encrypt


1. Lets encrypt 설치

1
2
3
$ git clone https://github.com/certbot/certbot 
$ cd certbot
$ ./certbot-auto --help
cs


2. ssl 인증서 발급

1
2
$ ./certbot-auto certonly -a standalone \
     -d abc.com -d www.abc.com
cs


3. PKCS12 형식 파일로 변환 (linux openssl 사용)

1
2
3
4
5
6
$ openssl pkcs12 -export -in fullchain.pem \ 
                 -inkey privkey.pem \ 
                 -out keystore.p12 
                 -name tomcat \
                 -CAfile chain.pem \
                 -caname root

cs


3.1 local 에서 테스트 하기 위해 linux 에 생성된 keystore.p12 파일을 local 로 복사.

4. spring boot application.yml (spring boot version = 2.1.2.RELEASE)

1
2
3
4
5
6
7
8
9
server:
  port: 8443
  servlet:
    context-path: /
  ssl:
    key-store: c:\\www.abc.com\\keystore.p12
    key-store-password: <비밀번호>
    key-store-type: pkcs12
    key-alias: tomcat
cs


출처 : https://dzone.com/articles/spring-boot-secured-by-lets-encrypt

반응형

'IT > 언어' 카테고리의 다른 글

Caused by: java.util.zip.ZipException: error in opening zip file  (0) 2019.07.01
import os  (0) 2015.11.25
[c#] 파일 출력  (0) 2014.08.19
페이징 처리용 소스(예제?)  (0) 2014.07.08
POI Excel 파일 쓰기  (0) 2014.06.26
반응형
os.path.realpath(__file__)

파일의 실제 경로 + 파일명을 리턴한다.
os.path.realpath(__file__) 의 경우 현재 파일(.py 형식의 파일 안에 있는 내용이라면)의 절대 경로를 리턴한다.


realPath = os.path.realpath(__file__)

print realPath

======================

/home/username/Example/test.py



os.path.dirname   - 폴더 경로

파일의 경로만 리턴한다.

dirName = os.path.dirname(realPath)

print dirName

======================

/home/username/Example 


os.path.join   - 경로, 폴더명

경로를 add 한다.

joinPath = os.path.join(dirName, "addDir")

print joinPath

======================

/home/username/Example/addDir

joinPath = os.path.join(dirName, "addDir", "secondAddDir", "thirdAddDir")

print joinPath

======================

/home/username/Example/addDir/secondAddDir/thirdAddDir



반응형
반응형
반응형

'IT > 언어' 카테고리의 다른 글

spring boot embedded tomcat letsencrypt ssl 적용  (0) 2019.02.08
import os  (0) 2015.11.25
페이징 처리용 소스(예제?)  (0) 2014.07.08
POI Excel 파일 쓰기  (0) 2014.06.26
XStream 사용(_ 중복 출력 해결) & XML to JSON  (0) 2014.06.20
반응형

#object# 와 연산이 있는 곳은 <![CDATA[ 연산 ]]> 로 묶어줘야 함.

oracle

SELECT * FROM (
	SELECT ROWNUM rn, A.* FROM (
		SELECT board.BOARD_NO,board.BOARD_TYPE_NO, board.CONTENT, board.EMAIL, board.WRITE_DATE
		FROM TB_BOARD board 
		WHERE board.BOARD_TYPE_NO = #type#
		ORDER BY board.WRITE_DATE DESC
		)A
	)WHERE rn >= ((#page#-1)*10)+1 AND rn <= #page#*10
ORDER BY rn




mysql

SELECT T.* 
FROM(
	SELECT @RNUM := @RNUM + 1 AS rn , A.* 
	FROM(
		SELECT email, name, age, date 
		FROM exam.user
		WHERE no < 1020
		order by date desc
	)A,(SELECT @RNUM :=0)R
)T
WHERE rn>=((#page#-1)*10)+1 AND rn <= #page#*10
반응형

'IT > 언어' 카테고리의 다른 글

import os  (0) 2015.11.25
[c#] 파일 출력  (0) 2014.08.19
POI Excel 파일 쓰기  (0) 2014.06.26
XStream 사용(_ 중복 출력 해결) & XML to JSON  (0) 2014.06.20
Mybatis + java 연동 기초  (0) 2014.06.19
반응형

LIB : poi-3.10-FINAL-20140208.jar

ExcelUtils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package com.exam.common.util;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
 
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
 
import com.exam.domain.user.User;
 
public class ExcelUtils {
    private HSSFWorkbook workBook;
    private String filePath;
    private String excelFileName;
    
    /*
     * 호출 메소드
     * writeData(filePath, fileName, ObjectList);
     */
    public void writeData(String filePath, String fileName, List userList){
        this.filePath = filePath;
        excelFileName = fileName + ".xls";
        try {
            FileOutputStream fout = setFile(filePath, excelFileName);
            HSSFWorkbook workBook = createExcel(userList);
            workBook.write(fout);
            fout.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /*
     * 핵심 프로세스
     */
    public HSSFWorkbook createExcel(List userList){
        // Excel Write
        workBook = new HSSFWorkbook();
        HSSFSheet sheet = workBook.createSheet("UserList");
        
        // ## Font Setting
        // @HSSFFont : 폰트 설정
        //  - FONT_ARIAL : 기본
        HSSFFont font = workBook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);
        
        // ## Title Style Setting
        // @HSSFColor : 셀 배경색
        //  - GREY_$_PERCENT : 회색 $ 퍼센트
        // @HSSFCellStyle
        //  - ALIGN_$ : $ 쪽 정렬
        HSSFCellStyle titleStyle = workBook.createCellStyle();
        titleStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        titleStyle.setFillPattern(HSSFCellStyle.ALIGN_LEFT);
        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        titleStyle.setFont(font);
        
        // ## Row Create 
        // ? 가로열 생성
        HSSFRow row = sheet.createRow((short)0);
        
        // ## Title Cell Create
        // @row.createCell((short)n) : n번째 셀 설정
        // @setCellValue(String) : n 번째 셀의 내용 
        // @setCellStyle(style) : n 번째 셀의 스타일
        HSSFCell cell_0 = row.createCell((short)0);
        cell_0.setCellValue("번호");
        cell_0.setCellStyle(titleStyle);
        
        HSSFCell cell_1 = row.createCell((short)1);
        cell_1.setCellValue("E-Mail");
        cell_1.setCellStyle(titleStyle);
        
        HSSFCell cell_2 = row.createCell((short)2);
        cell_2.setCellValue("Password");
        cell_2.setCellStyle(titleStyle);
        
        HSSFCell cell_3 = row.createCell((short)3);
        cell_3.setCellValue("Name");
        cell_3.setCellStyle(titleStyle);
        
        HSSFCell cell_4 = row.createCell((short)4);
        cell_4.setCellValue("Age");
        cell_4.setCellStyle(titleStyle);
        
        HSSFCell cell_5 = row.createCell((short)5);
        cell_5.setCellValue("JoinDate");
        cell_5.setCellStyle(titleStyle);
        
        // ## Content Style Setting
        HSSFCellStyle contentStyle = workBook.createCellStyle();
        contentStyle.setFont(font);
        
        //  Content align : center
        HSSFCellStyle styleCenter = workBook.createCellStyle();
        styleCenter.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        styleCenter.setFont(font);
        
        //  ObjectList 가 비어있으면 제목만 출력 후 종료
        if(userList == nullreturn workBook;
        
        //  ObjectList 엑셀에 출력
        for(int i = 0; i < userList.size(); i++){
            // 1번째 행은 제목이니 건너 뜀
            row = sheet.createRow((short)(i+1));
            User user = userList.get(i);
            
            cell_0 = row.createCell((short)0);
            cell_0.setCellValue(user.getNo());
            cell_0.setCellStyle(styleCenter);
            
            cell_1 = row.createCell((short)1);
            cell_1.setCellValue(user.getEmail());
            cell_1.setCellStyle(styleCenter);
            
            cell_2 = row.createCell((short)2);
            cell_2.setCellValue(user.getPassword());
            cell_2.setCellStyle(styleCenter);
            
            cell_3 = row.createCell((short)3);
            cell_3.setCellValue(user.getName());
            cell_3.setCellStyle(styleCenter);
            
            cell_4 = row.createCell((short)4);
            cell_4.setCellValue(user.getAge());
            cell_4.setCellStyle(styleCenter);
            
            cell_5 = row.createCell((short)5);
            cell_5.setCellValue(user.getDate());
            cell_5.setCellStyle(styleCenter);
        }
        
        return workBook;
    }
    
    private FileOutputStream setFile(String filePath, String excelFileName)throws FileNotFoundException{
        File dir = new File(filePath);
        
        if(!dir.exists()) dir.mkdirs();
        
        FileOutputStream fout = new FileOutputStream(filePath+excelFileName);
        
        return fout;
    }
}
cs


반응형

'IT > 언어' 카테고리의 다른 글

[c#] 파일 출력  (0) 2014.08.19
페이징 처리용 소스(예제?)  (0) 2014.07.08
XStream 사용(_ 중복 출력 해결) & XML to JSON  (0) 2014.06.20
Mybatis + java 연동 기초  (0) 2014.06.19
JDBC 설정  (0) 2014.06.19
반응형

* 필요 jar File

XStreamReq&amp;xml2json.zip


TestMain.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import com.exam.domain.AuthKey;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;
 
import com.exam.domain.AuthKey;
import com.exam.util.xstream.Obj2Xml;
 
public class TestMain {
    public static void main(String[] args) throws JSONException{
        AuthKey authKey = new AuthKey();
        
        authKey.setPrimaryKey("key");
        authKey.setId("a001122334455");
        authKey.setProperty_1("pro1");
        authKey.setProperty_2("pro2");
        String xml = new Obj2Xml(authKey).toXml();
        System.out.println("===== XML OUT =====");
        System.out.println(xml);
        
        JSONObject jsonObj = XML.toJSONObject(xml);
        System.out.println("===== JSON OUT =====");
        System.out.println(jsonObj);
    }
}
cs

AuthKey.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.exam.domain;
 
public class AuthKey {
    private String primaryKey;
    private String id;
    private String property_1;
    private String property_2;
    public String getPrimaryKey() {
        return primaryKey;
    }
    public void setPrimaryKey(String primaryKey) {
        this.primaryKey = primaryKey;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getProperty_1() {
        return property_1;
    }
    public void setProperty_1(String property_1) {
        this.property_1 = property_1;
    }
    public String getProperty_2() {
        return property_2;
    }
    public void setProperty_2(String property_2) {
        this.property_2 = property_2;
    }
    @Override
    public String toString() {
        return "AuthKey [primaryKey=" + primaryKey + ", id=" + id
                + ", property_1=" + property_1 + ", property_2=" + property_2
                + "]";
    }
        
}
cs

Obj2Xml.java(Obj를 받아서 Xml(String)으로 변환)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.exam.util.xstream;
 
import com.exam.domain.AuthKey;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer;
 
public class Obj2Xml {
    private Object obj;
    
    public Obj2Xml(Object obj){
        this.obj = obj;
    }
    
    public String toXml(){
        String toXml;
        
        XmlFriendlyReplacer replacer = new XmlFriendlyReplacer("__","_");
        XStream xStream = new XStream(new DomDriver("UTF-8", replacer)){
            protected boolean useXStreamXmlFriendlyMapper() {
                return true;
            }
        };
        xStream.alias("AuthKey", AuthKey.class);
        toXml = xStream.toXML(obj);
        return toXml;
    }
    
}
cs

Result

1
2
3
4
5
6
7
8
9
===== XML OUT =====
 
  key
  a001122334455
  pro1
  pro2
 
===== JSON OUT =====
{"response":{"id":"a001122334455","property_1":"pro1","primaryKey":"key","property_2":"pro2"}}
cs

*****************************************************

*****************************************************

Xstream 을 사용할때 Obj 속성중 _ 가 있으면 __ 로 변환 되기 때문에 아래처럼 XmlStream을 선언하여 써야 한다.

참고

1
2
3
4
5
6
XmlFriendlyReplacer replacer = new XmlFriendlyReplacer("__","_");
        XStream xStream = new XStream(new DomDriver("UTF-8", replacer)){
            protected boolean useXStreamXmlFriendlyMapper() {
                return true;
            }
        };
cs


반응형

'IT > 언어' 카테고리의 다른 글

페이징 처리용 소스(예제?)  (0) 2014.07.08
POI Excel 파일 쓰기  (0) 2014.06.26
Mybatis + java 연동 기초  (0) 2014.06.19
JDBC 설정  (0) 2014.06.19
[MyBatis] SqlSessionFactory  (0) 2014.06.19
반응형

환경 : Win7, java7, Eclipse Kepler, Mysql 5.6, Mybatis 3.0.6

LIB : MyBatis + MysqlConnector

mybatis mysql.zip

1. 이클립스 Dynamic Web Project 생성

(프레임워크에 따라 다르기 때문에 Console까지만 구현)


2. 각 파일 생성


File Path<그림 1>


MyBatisConnectionFactory.java : SqlSessionFactory 를 생성, SqlMapConfig.xml 과 매핑

UserDAO.java : sqlSessionFactory를 통해 DB와 데이터 교환

User.java : User Bean

UserMapper.java : java 매핑용

UserMapper.xml : xml 매핑용

Test.java : Test용 main메소드(웹환경은 Servlet, Struts, Sping 알아서)

SqlMapConfig.xml : DB 정보, Mapper 정보 등록



3. 소스보기

test/Test.java

import com.exam.dao.UserDAO;
import com.exam.domain.user.User;

public class Test{

	public static void main(String[] args) {
		
			UserDAO dao = new UserDAO();
			User user = new User();
//			
//			user = dao.getUser(new String("kkk@digi.com"));
//			
//			System.out.println(user.toString());
			
			user.setEmail("kj@digi.com");
			user.setPassword("321321");
			user.setName("kj");
			user.setAge(27);
			
			dao.insert(user);
	}

}

com/exam/dao/MyBatisConnectionFactory.java

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.exam.mapper.user.UserMapper;

public class MyBatisConnectionFactory {
	private static SqlSessionFactory sqlSessionFactory;
	
	static{
		try{
			String resource = "SqlMapConfig.xml";
			Reader reader = Resources.getResourceAsReader(resource);
			if(sqlSessionFactory == null){
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, "development");
//				sqlSessionFactory.getConfiguration().addMapper(UserMapper.class);
			}
		}catch(FileNotFoundException e){
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionFactory;
	}
	
}


com/exam/dao/UserDAO.java

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.exam.domain.user.User;
import com.exam.mapper.user.UserMapper;

public class UserDAO {
	// UserMapper.xml 의 NameSpace
	private static final String NAMESPACE = "User.";
	
	// UserDAO가 호출될때 생성자를 통해 sqlSessionFactory 생성
	private SqlSessionFactory sqlSessionFactory;
	
	public UserDAO(){
		sqlSessionFactory = MyBatisConnectionFactory.getSqlSessionFactory();
	}
	
	// xml을 통한 매핑
	public void insert(User user){
		System.out.println("## UserDAO insert() 진입");
		// session Open
		SqlSession session = sqlSessionFactory.openSession();
		try{
			// UserMapper.xml => (NameSpace)User.(id)insert 에 user 객체 매칭 
			session.insert(NAMESPACE+"insert", user);
			// 커밋
			session.commit();
			System.out.println("## insert 성공");
		}catch(Exception e){
			session.rollback();
			e.printStackTrace();
			System.out.println("## insert 실패");
		}finally{
			// 사용후엔 닫아주자
			session.close();
		}
	}
	
	// java를 통한 매핑
	public User getUser(String email){
		SqlSession session = sqlSessionFactory.openSession();
		try{
			// 새로운 mapper를 생성
			UserMapper mapper = session.getMapper(UserMapper.class);
			User user = mapper.getUser(email);
			return user;
		}finally{
			session.close();
		}
	}
}

com/exam/domain/user/User.java

public class User {
	private Integer no;
	private String email;
	private String password;
	private String name;
	private Integer age;
	public Integer getNo() {
		return no;
	}
	public void setNo(Integer no) {
		this.no = no;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [no=" + no + ", email=" + email + ", password=" + password
				+ ", name=" + name + ", age=" + age + "]";
	}
	
	
}

com/exam/mapper/user/UserMapper.java

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.exam.domain.user.User;

public interface UserMapper {
	final String getUser = 
	"SELECT * FROM EXAM.USER " +
	"WHERE email = #{EMAIL}";
	
	// @Select(위의 String getUser 임)
	@Select(getUser)
	// property = User.java 의 속성, column = DB의 컬럼
	@Results(
			value={
					@Result(property="no", column="NO"),
					@Result(property="email", column="Email"),
					@Result(property="password", column="PASSWORD"),
					@Result(property="name", column="NAME"),
					@Result(property="age", column="AGE"),
			}
			)
	User getUser(String email); // email을 이용해 User 객체로 DB 결과값 리턴함
}


com/exam/mapper/user/UserMapper.xml

아래 xml 선언 포함 추가
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">


    
    
		INSERT INTO EXAM.USER
		(
			EMAIL
			,PASSWORD
			,NAME
			,AGE
		)values(
			#{email}
			,#{password}
			,#{name}
			,#{age}
		)
    



SqlMapConfig.xml

아래 xml 선언 포함 추가
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">


	
		
	
	
    
		
			
			
				
				
				
				
			
		
				
	
	
		
	




4. 대충의 순서



!!! XML 태그 대소문자 주의!!!(대문자가 소문자로 바뀌어있음...)

반응형

'IT > 언어' 카테고리의 다른 글

POI Excel 파일 쓰기  (0) 2014.06.26
XStream 사용(_ 중복 출력 해결) & XML to JSON  (0) 2014.06.20
JDBC 설정  (0) 2014.06.19
[MyBatis] SqlSessionFactory  (0) 2014.06.19
[LIB] ESAPI 로 XSS 방어  (0) 2014.05.30
반응형

Oracle

1
2
3
4
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@{ip}:1521:VSWUD" />
<property name="username" value="{id}" />
<property name="password" value="{password}" />
cs

MySQL

1
2
3
4
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:mysql://{ip}:3306/{dbName}"/>
<property name="JDBC.Username" value="{id}"/>
<property name="JDBC.Password" value="{password}"/>
cs



반응형

'IT > 언어' 카테고리의 다른 글

XStream 사용(_ 중복 출력 해결) & XML to JSON  (0) 2014.06.20
Mybatis + java 연동 기초  (0) 2014.06.19
[MyBatis] SqlSessionFactory  (0) 2014.06.19
[LIB] ESAPI 로 XSS 방어  (0) 2014.05.30
시큐어 코딩 가이드  (0) 2014.05.29
반응형
SqlSessionFactory

SqlSessionFactory 는 SqlSession 인스턴스를 생성하기 위해 사용할 수 있는 6개의 메소드를 가지고 있다.

6개의 메소드가 선택해서 사용하는 것들을 보자.

⊙ Transaction : 세션에서 트랜잭션 스코프 또는 자동 커밋을 사용하고 싶은가?

⊙ Connection : 설정된 DataSource 에서 Connection 을 획득하고 싶은가?

⊙ Excution : PreparedStatements 그리고/또는 배치(Insert, Delete 를 포함해서) 업데이트를 재사용 하고 싶은가?

오버로드된 메소드인 openSession()이 3가지를 적절히 혼합해서 사용할 수 있다.

SqlSession openSession();

SqlSession openSession(boolean autoCommit);

SqlSession openSession(Connection connection);

SqlSession openSession(TranseactionIsolationLevel level);

SqlSession openSession(ExecutorTye execType,);

SqlSession openSession(ExecutorTye execType, TranseactionIsolationLevel level);

SqlSession openSession(ExecutorTye execType, boolean autoCommit);

SqlSession openSession(ExecutorTye execType,Connection connection);

Configuration getConfiguration();


파라미터를 가지지 않는 디폴트 openSession() 메소드는 다음과 같은 성격을 가진 SqlSession을 만들것이다.

☞  트랜잭션 스코프는 시작될 것이다.

☞  Connection 객체는 활성화된 환경에 의해 설정된 DataSource 인스턴스를 획득 할 것이다.

☞  트랜잭션 격리 레벨은 드라이버나 데이터소스가 디폴트로 제공하는 옵션을 사용할 것이다.

☞  PreparedStatements는 재사용되지 않을 것이다. 그리고 update 또한 배치 처리 되지 않을 것이다.

메소드 대부분은 그 이름과 파라미터가 그 역할을 충분히 설명한다. 자동커밋을 활성화 하기 위해서, autoCommit 파라미터에 "true" 값을 셋팅하라. 자체적인 커넥션을 제공하기 위해서는 connection 파라미터에 Connection 인스턴스를 셋팅하라.

Connection 과 autoCommit 둘다 셋팅하는 것은 오버라이드 하지 않는다. 왜냐하면 MyBatis는 제공된 connection 객체를 셋팅할 때마다 현재 사용중인 것을 사용한다. MyBatis는 TransactionIsolationLevel 이라고 불리는 트랜잭션 격리 레벨을 위한 자바 enum 래퍼를 사용한다. JDBC를 5가지를 지우너한다(NONE, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE)

새롭게 보일수 있는 하나의 파라미터는 ExecutorType 이다. enum으로는 3개의 값을 정의한다.

ExecutorType.SIMPLE

이 타입의 실행자는 아무것도 하지 않는다. 구문은 실행마다 새로운 PreparedStatement 를 생성한다.

ExecutorType.REUSE

이 타입의 실행자는 PreparedStatement 를 재사용할 것이다.

ExecutorType.BATCH

이 실행자는 모든 update 구문을 배치처리하고 중간에 select 가 실행될 경우 필요하다면 경계를 표시한다. 이러한 과정은 행위를 좀더 이해하기 쉽게 하기 위함이다.

→NOTE : SqlSessionFactory 에서 언급하지 않는 한개 이상의 메소드가 있다. getConfiguration() 메소드 인데. 이 메소드는 런타임시 MyBatis 설정을 조사하는 Configuration 인스턴스를 리턴할 것이다.


반응형

'IT > 언어' 카테고리의 다른 글

Mybatis + java 연동 기초  (0) 2014.06.19
JDBC 설정  (0) 2014.06.19
[LIB] ESAPI 로 XSS 방어  (0) 2014.05.30
시큐어 코딩 가이드  (0) 2014.05.29
ByteUtil.java  (0) 2014.05.29

+ Recent posts