728x90
300x250

[GNU - 리눅스(Linux)] 우분투 서버 20.04 그리고 한글 지원팩, 아파치 톰캣9, SSL적용(OpenSSL)

이번에 소개할 내용은 우분투 서버 20.04(Ubuntu Server 20.04)를 설치한 후에 한글 언어팩, 아파치 톰캣9, SSL을 적용하는 방법에 대해서 소개하고자 한다.


1. 우분투 라이선싱(ubuntu Licensing)

우분투 공식사이트에서 제공하는 라이선싱에 대한 사항이다.

http://ubuntu.com/licensings

 

Licensing | Ubuntu

Ubuntu is a collection of thousands of computer programs and documents created by a range of individuals, teams and companies.

ubuntu.com

그림 1. 우분투 라이선싱 소개

 

그림 2. 우분투 라이선싱 소개

 

그림 3. 우분투 라이선싱 소개

 

그림 4. 우분투 라이선싱 소개

 

그림 5. 우분투 라이선싱 소개


2. 우분투 소개

우분투 공식사이트에서 제공하는 라이선싱에 대한 사항이다.

 

그림 6. 우분투 소개


2. 우분투 서버 배포판 내려받기

이번에 소개하는 우분투 배포판 서버를 내려받는 방법에 대해서 소개하고자 한다.

https://www.ubuntu.com

그림 7. 우분투 웹 사이트 (2021-02-21)

그림 8. 우분투 웹 사이트 (2021-02-21)

 

 

그림 9. 우분투 웹 사이트 (2021-02-21)

 

그림 10. 우분투 웹 사이트 (2021-02-21)

 

그림 10. 우분투 웹 사이트 (2021-02-21)

 


2. 설치

USB 또는 DVD로 굽는다.

부팅을 한다.

 

그림 11. 우분투 서버 20.04 설치 모습

English를 엔터를 누른다.

 

그림 12. 우분투 서버 20.04 설치 모습

 

그림 12. 우분투 서버 20.04 설치 모습

 

그림에는 English(잉글리시 / 영어) (US)가 되어 있으나, Korean(한국어) 키보드 배열로 방향키와 스페이스키로

선택한다.

키보드는 Korean, Korean으로 셋팅하고 Done(완료)을 엔터를 누른다.

 

그림 13. 우분투 서버 20.04 설치 모습

초기 셋팅에서는 DHCP로 받아서 진행하도록 한다.

정식적인 방법으로 하려면, 서브넷 마스크를 계산해야 하는데 서브넷 마스크 계산기를 인터넷 등으로 검색해서

대역을 찾아야 한다.

Done을 선택한 후 엔터를 누른다.

 

그림 14. 설치 모습 / 프록시 환경설정 - 우분투 서버 20.04(2021-02-21)

 

그림 14는 프록서 서버에 대한 환경설정이다.

Done을 엔터키를 누른다.

 

 

 

그림 15. 우분투 아카이브 미러 사이트 - 우분투 서버 20.04(2021-02-21)

엔터를 누른다. 미러사이트를 구축한 경우에는 "변경"을 해도 무방하다.

 

그림 16. 스토레지(저장소) 환경설정 - 우분투 서버 20.04(2021-02-21)

 

저장소의 환경설정에 대한 것이다.

Custom("커스텀 / 사용자 설정")으로 설정을 해도 된다.

Done(완료)를 엔터키로 누른다.

 

그림 17. 스토레지(저장소) 환경설정 - 우분투 서버 20.04(2021-02-21)

Done(완료)를 엔터키로 누른다.

 

[참고사항]
수작업으로 설정하면, Software RAID(소프트웨어 레이드) 등을 구성할 수 있다.

 

그림 18. 스토레지(저장소) 설정 확인 창 - 우분투 서버 20.04(2021-02-21)

의역하면, "결과를 반영하면, 데이터가 유실될 수 있다. 돌아가실 겁니까? 진행하실 겁니까?" 이런 내용이다.

Continue(계속 / 컨티뉴), No(아니오, 노) 두 가지를 선택할 수 있다.

컨티뉴를 엔터키로 누른다.

 

그림 19. 프로파일(사용자 계정) - 우분투 서버 20.04(2021-02-21)

사용자 계정과 서버 정보를 입력한다.

비밀번호도 입력한다.

입력을 완료한 후 "Done"을 엔터키로 누른다.

 

그림 20. 프로파일(사용자 계정) - 우분투 서버 20.04(2021-02-21)

입력을 완료한 후 "Done"을 엔터키로 누른다.

 

 

그림 21. OpenSSH Server(오픈에스에스에이치) 설치 알람 메시지 - 우분투 서버 20.04(2021-02-21)

SSH 서버는 사실 강제는 아니다. 기본값은 22번 포트로 할당된다.

참고로 변경이 가능하다.

현재 SFTP는 Chroot(감옥 구성)이 잘 되지 않고 있다.

SSH포트를 개방할 때 신중해야 한다.

 

Done을 선택하고 엔터키를 누른다.

 

그림 22. 설치하고자 하는 패키지 구성 내용 - 우분투 서버 20.04(2021-02-21)

 

설치하고자 하는 패키지 구성 내용에 관한 것이다.

Done을 엔터를 누른다.

추후 선택 설치, 제거가 가능하기 때문이다.

 

그림 23. 설치 과정 / 기다리기 - 우분투 서버 20.04(2021-02-21)

 

기다린다.

 

그림 24. 설치 과정 / 기다리기 - 우분투 서버 20.04(2021-02-21)

 

기다린다.


 

3. 처음 부팅 모습

리눅스 우분투 서버 20.04를 설치하게 되면 이렇게 검은색 화면이 뜬다.

 

그림 25. 처음부팅 모습 / 우분투 서버 20.04(2021-02-21)

 

 


4. 환경설정 방법(1단계)

네트워크 환경설정 방법이다.

 

* 1. 우분투 20.04 / 서버 (netplan을 사용함)
# cd /etc/netplan/
# vim 00-installer-config.yaml

* 2. IPv4, IPv6 환경설정(로컬 네트워크) [예시]
---------------------------------------------------------------
network:
    version: 2
    renderer: networkd
    ethernets:
       enp0s3:
       addresses:
       - 192.168.1.25/24
       - "2001:1::1/64"
       gateway4: 192.168.1.1
       gateway6: "2001:1::2"
       nameservers:
          addresses:
          - 1.214.68.2
          - 61.41.153.2

---------------------------------------------------------------
참고사항: Public DNS(공개 DNS)
1. [KT-DNS]
168.126.63.1,
168.126.63.2

2. [데이콤, LG 유플러스]
1.214.68.2
61.41.153.2

3. [SK브로드밴드]
219.250.36.130

210.220.163.82

4. [구글] 

8.8.8.8
4.4.4.4

* 3. 수정 예제
---------------------------------------------------------------
network:
     ethernets:
         enp0s3:
             addresses: [192.168.0.20/24]
             gateway4: 192.168.0.1
             nameservers:
                  addresses: [1.214.68.2,61.41.153.2]
         version: 2
---------------------------------------------------------------
:wq

* 4. 적용
# netplan apply

 


5. 환경설정 방법(2단계 - 한글화 설정)

한글 설정이다.

* 1. 한글 언어팩 설치하기
# su
# apt install language-pack-ko

* 2. 한글 수정하기
# locale-gen ko_KR.UTF-8

* 3. locale(로케일) 변경하기
# vim /etc/default/locale
LANG="en_US.UTF-8"
LANG="ko_KR.UTF-8"

* 4. 문자열 환경설정 변경하기
# vim /etc/environment
root@master:/etc/tomcat9
# vim /etc/environment

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" LANG="ko_KR.UTF8"
LANGUAGE="ko_KR:ko:en_GB:en"
:wq

* 5. 한글 문자열 추가하기
# apt install fonts-nanum fonts-nanum-coding fonts-nanum-extra

 


6. 환경설정 방법(3단계 - 아파치 톰캣9, OpenSSL 1.11a, SSL설정하기)

아파치 톰캣9, OpenSSL 1.11a, SSL을 적용하는 방법에 대해 소개하겠다.

 

1. 아파치 톰캣9 패키지 버전 설치하기(규격화 되어있음)
# apt install tomcat9

2. openssl download

cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
tar xvzf openssl-1.1.1a.tar.gz

3. config
cd openssl-1.1.1a
./config
make && make install

4. openssl 버전확인
openssl version

5. 폴더 이동
# cd /
6. 폴더 생성
# mkdir ca

7. 저장소 만들기
/# cd ca
ca# mkdir localhost
ca# cd localhost

// 방법1) 개발 SSL(사설 인증서)
keytool -genkey -alias localhost -keyalg RSA -keystore /ca/localhost/keystore
keytool -certreq -keyalg RSA -alias localhost -file svr1.csr -keystore /ca/localhost/keystore

8. 톰켓 환경설정 경로
# cd /etc/tomcat # vim server.xml
------------------------------------------------------------------
// Tomcat 7.x 이상 버전의 설정
<Connector port="8443" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443"
                SSLEnabled="true"
                scheme="https"
                secure="true"
                sslProtocol="TLS"
                keystoreFile="/ca/localhost/keystore"
                keystorePass="password">
------------------------------------------------------------------
------------------------------------------------------------------
[참고할 것] // SSL 인증서 쌍 체인 등록 방법
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreds="150" scheme="https" secure="true" clientAuth="false"
           SSLCertificateFile="/usr/local/tomcat/config/ssl/domain.crt"

           SSLCertificateKeyFile="/usr/local/tomcat/config/ssl/domain.key"
           SSLCACertificateFile="/usr/local/tomcat/config/ssl/chainca.key"
           sslProtocol="TLS"  />


------------------------------------------------------------------
9. 방화벽
# iptables -I INPUT -p tcp --dport 8443 -j ACCEPT
# iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

10. 재부팅(컴퓨터 다시 시작)
# reboot

11. 서비스 시작하기
# service tomcat9 start

12. 배포 위치 경로(톰캣9 설치 경로)
* 설치 경로: /var/lib/tomcat9
--------------------------------------------------------------
root@master:/var/lib# cd tomcat9/
root@master:/var/lib/tomcat9# ls conf lib logs policy webapps work
root@master:/var/lib/tomcat9# pwd /var/lib/tomcat9
root@master:/var/lib/tomcat9#

--------------------------------------------------------------

 


7. 맺음글(Conclusion)

우분투 서버 20.04 배포판에서 아파치 톰캣9와 OpenSSL, SSL 설정하는 방법에 대해 소개하였다.

 


8. 참고자료(Reference)

 

 

반응형
728x90
300x250

[GNU - 리눅스(Linux)] Apache Tomcat 9(아파치 톰캣9), 큐브리드 10.2(Cubrid 11), 전자정부 이클립스, 리눅스민트 20에서 연동하기


이번에 소개할 내용은 아파치 톰캣9, 큐브리드 10.2, 전자정부 이클립스, 리눅스민트 20을 연동하여 개발하는 환경을 설정하는 방법에 대해서 소개하겠다.



1. 전자정부 이클립스 설치 복습


설치 방법을 잊어버린 경우를 대비해서 잠시 소개하였다.


그림 1. 리눅스민트20, 전자정부 이클립스 설치 가이드(1)



그림 2. 리눅스민트20, 전자정부 이클립스 설치 가이드(1)



그림 3. 리눅스민트20, 전자정부 이클립스 설치 가이드(1)




2. 큐브리드 10.2(11)와 아파치 톰캣 9 연동하기


큐브리드와 아파치 톰캣 9를 연동하기 위해서 먼저 전자정부 이클립스를 실행하도록 하겠다.

그림 4. 리눅스민트20, 전자정부 이클립스 실행하기




그림 5. 리눅스민트20, 전자정부 이클립스 실행하기





그림 6. 리눅스민트20, 전자정부 이클립스 / 아파치 톰캣 9 환경설정 확인



4. 큐브리드 10.2(11)와 JSP-Dynamic Web Project 생성하기


프로젝트를 생성하여 큐브리드 JDBC와 JSP, Java를 연동하는 방법에 대해 소개하도록 하겠다.



그림 7. 리눅스민트20, 전자정부 이클립스에서 새 프로젝트 생성하기


그림 8. 리눅스민트20, 전자정부 이클립스에서 새 프로젝트 생성하기




그림 9. 리눅스민트20, 전자정부 이클립스에서 새 프로젝트 생성하기





5. 큐브리드 10.2(11) JDBC, 신규 생성한 JSP 프로젝트에 설치하기


앞에서 생성한 다이나믹 웹 프로젝트에 JDBC-11-0-latest-cubrid.jar 파일을 설치하도록 하겠다.

(2021-02-01 기준으로 JDBC-11-0-latest-cubrid.jar 파일이 최신 버전이다.)


그림 10. 리눅스민트20, 전자정부 이클립스와 큐브리드 JDBC 연동하기




6. 큐브리드 10.2(11), 이클립스 프로젝트 (Java, JSP 코드 작성하기)


큐브리드에 사용되는 Java, JSP코드를 작성하는 방법에 대해 소개하도록 하겠다.




그림 11. 큐브리드 소스코드


https://www.cubrid.org/getting_started 해당 링크에 접속하면 자세한 내용을 확인할 수 있다.



그림 12. 자바 코드 생성하기




그림 13. 자바 코드 생성하기




그림 14. 자바 코드 생성하기




그림 15. 자바 코드 생성하기




그림 16. JSP 코드 생성하기




7. 서버 - 배포하기


서버에 배포하는 방법에 대해 소개하도록 하겠다.



그림 17. 구동중인 큐브리드 DB서버 상태를 확인할 것 (2021-02-01)


그림 17처럼 큐브리드 DB서버 상태를 제일 먼저 확인해야 한다.



그림 18. 초록색 (재생)버튼 누르기 (Run On Server 버튼 찾아서 클릭)


톰캣 9.0 서버로 배포 태스트를 할 것이다.




그림 19. 빌드 결과 (2021-02-01)


정상적으로 동작한 것을 확인할 수 있다.



* 첨부(Attachment)


210201_LinuxMint20_Cubrid_10_2_eGovFramework_Eclipse_Cubrid_JDBC_guide.zip

[Apache Licence v2.0을 적용 받는다]



* 맺음글(Conclusion)


리눅스민트20과 전자정부 이클립스, 아파치 톰캣 9를 연동하는 방법에 대해서 소개하였다.



* 참고 자료(Reference)


1. CUBRID Foundation: Getting Started, https://www.cubrid.org/getting_started, Accessed by 2021-02-01, Last Modified 2021-02-01.

-> GNU/GPL v3 License로 배포하고 있음.

2. eGovFrame Portal 온라인 지원 포탈, https://www.egovframe.go.kr, Accessed by 2021-02-01, Last Modified 2021-02-01.

-> 전자정부 이클립스(미리 SVN 배포 기능, 각종 셋팅이 미리 다 되어 있음.) / 전자정부 프레임워크만 사용하지 않았음. 

    (스프링프레임워크의 "외부 접속" 의존성 문제)

-> Apache License v2.0로 배포하고 있음.

3. Main Page - Linux Mint, https://linuxmint.com, Accessed by 2021-02-01, Last Modified 2021-02-01.

-> GNU/GPL v3 License로 배포하고 있음.

4. Oracle VM VirtualBox, https://www.virtualbox.org, Accessed by 2021-02-01, Last Modified 2021-02-01.

-> GNU/GPL v3 License로 배포하고 있음.

5. Enabling Open Innovation & Collaboration | The Eclipse Foundation, https://www.eclipse.org, Accessed by 2021-02-01, Last Modified 2021-02-01

반응형
728x90
300x250

[JSP] 17. JSP/Servlet MVC2 - 페이징네이션과 검색 그리고 오라클 프로젝트 (1)


Command 패턴과 Front Controller 패턴을 적용한 페이징네이션과 검색에 대해서 소개하려고 한다.

불필요한 기능은 다 제거하고 순수한 페이징네이션과 검색 그리고 오라클 연동에 대해서 다뤄보았다.


IDE: Spring-Tool Suite 4-4.7.2 RELEASES

Databases: Oracle Databases 19g

 - Maven 3.6.3/1.16.0.20200610-1735

 - javax.servlet-api (4.0.1) - servlet(서블렛)

 - jstl (1.2) - jstl 태그 적용

 - taglibs (1.1.2) - c태그 적용

 - HikariCP (3.4.2) - 커넥션 풀

 - com.oracle.database.jdbc - ojdbc8 (19.7.0.0)



[쿼리 관련해서 조금 더 보충한 글이다.]
1. [Oracle Databases] 번외글 - 게시판 페이징 관련 로직 쿼리, 2020-10-11.
- https://yyman.tistory.com/1466




1. 프로젝트 구조


작성할 프로젝트를 미리 살펴보면 조금 작업해야 할 양이 의외로 상당하다는 것을 알 수 있다.



그림 1, 그림 2. 프로젝트 작성 구조도




2. 게시판 - 설계


데이터베이스 설계는 매우 간단하게 작성하였다.


그림 3. Board - 테이블 설계(1)




그림 4. Board 게시판 설계(2)





3. 사용자 인터페이스 - 결과


이번 주제에서 다뤄볼 프로젝트의 완성 모습이다.

참고로 페이징네이션 로직에 대해서 다 기억할 수 없다.


다만 어떤 흐름인지는 대략적으로 알고는 있으면 하는 바람이다.

워낙 페이징 로직에 대해서 전문적으로 잘 연구하시는 분들이 많이 계시니깐 그건 골고루 참고도 해보고 개선도 해보고 하면 될 것 같다.



그림 5. list.do - 첫 화면



그림 6. list.do - 7번 페이지 / 기초



그림 7. list.do - 10106번 페이지 / 기초


10106번 페이지를 통해서 알 수 있는 것은 약 10106 * 10 = 101,106개의 DB가 존재한다는 것을 알 수 있다.

그림 8부터는 응용부분에 가까워진다.



그림 8. list.do - 키워드 검색 및 페이징 처리(1) / 심화


의외로 응용력이 많이 요구되는 부분이다.



그림 9. list.do - 키워드 검색 및 페이징 처리(2) / 심화


키워드 검색을 했을 때 "친"은 약 13개가 있었다는 사실을 유추할 수 있다.



그림 10. list.do - 키워드 검색 및 페이징 처리(3)


참고로 list.do 반응에 대해서 여러 조건으로 튜닝이 필요하다.



4. 프로젝트 생성하기


프로젝트는 Maven Project로 생성하여 진행하였다.



그림 11. Maven Project 생성하기(1)


File -> New -> Maven Project를 클릭한다.



그림 12. Maven Project 생성하기(2)


org.apache.maven.archetypes | maven-archetype-web을 선택하고 Next를 누른다.



그림 13. Maven Project 생성하기(3)


프로젝트의 Group Id, Artifact Id를 입력한다.

Finish를 누른다.




5. POM.xml - 설정하기


다음은 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>


  <groupId>com.boardMaven</groupId>

  <artifactId>web</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>


  <name>board Maven Webapp</name>

  <!-- FIXME change it to the project's website -->

  <url>http://www.example.com</url>


  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <maven.compiler.source>1.7</maven.compiler.source>

    <maven.compiler.target>1.7</maven.compiler.target>

  </properties>


  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.11</version>

      <scope>test</scope>

    </dependency>

    

<!-- Servlet -->

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    <scope>provided</scope>

</dependency>

<!-- JSTL -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

<!-- taglibs -->

<dependency>

<groupId>taglibs</groupId>

<artifactId>standard</artifactId>

<version>1.1.2</version>

<scope>compile</scope>

</dependency>


<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->

<dependency>

    <groupId>com.zaxxer</groupId>

    <artifactId>HikariCP</artifactId>

    <version>3.4.2</version>

</dependency>

<dependency>

<groupId>com.oracle.database.jdbc</groupId>

<artifactId>ojdbc8</artifactId>

<version>19.7.0.0</version>

</dependency>

  </dependencies>


  <build>

    <finalName>board</finalName>

    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->

      <plugins>

        <plugin>

          <artifactId>maven-clean-plugin</artifactId>

          <version>3.1.0</version>

        </plugin>

        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->

        <plugin>

          <artifactId>maven-resources-plugin</artifactId>

          <version>3.0.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-compiler-plugin</artifactId>

          <version>3.8.0</version>

        </plugin>

        <plugin>

          <artifactId>maven-surefire-plugin</artifactId>

          <version>2.22.1</version>

        </plugin>

        <plugin>

          <artifactId>maven-war-plugin</artifactId>

          <version>3.2.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-install-plugin</artifactId>

          <version>2.5.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-deploy-plugin</artifactId>

          <version>2.8.2</version>

        </plugin>

      </plugins>

    </pluginManagement>

  </build>

</project>



파일명: pom.xml


[첨부(Attachments)]

pom.zip



6. 프로젝트의 Build-Path, Properties 수정하기


프로젝트의 자바 버전에 대한 환경설정이다.



그림 14. 프로젝트의 마우스 오른쪽 버튼 모습


프로젝트를 클릭한다.

마우스 오른쪽 버튼을 누른다.

Properties를 클릭한다.



그림 15. Build-Path 환경설정


JRE System Library를 JavaSE-14버전으로 변경한다. (14버전으로 변경)

Apply를 누른다.



그림 16. Project Facets 환경 설정


Project Facets의 Java 버전을 14로 변경한다.

Apply를 누른다.

Apply and close를 누른다.



7. Resource 폴더와 db.properties 만들기


Resource 폴더와 db.properties를 생성할 것이다.



그림 17. /src/main 폴더 - 오른쪽 버튼 메뉴 모습


src/main 폴더를 마우스 오른쪽으로 클릭한다.

New-> Folder를 클릭한다.


폴더명: Resource



그림 17. /src/main/resource 폴더 - 오른쪽 버튼 메뉴 모습


src/main/resource 폴더를 마우스 오른쪽으로 클릭한다.

New-> File를 클릭한다.


파일명: db.properties



그림 18. /src/main/resource 폴더와 db.properties 모습


성공적으로 만들어진 것을 확인할 수 있다.



그림 19. db.propeties 모습


jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl

dataSourceClassName=oracle.jdbc.driver.OracleDriver

dataSource.user=userName

dataSource.password=password

cachePrepStmts=true

prepStmtCacheSize=250

prepStmtCacheSqlLimit=2048


파일명: db.propeties


[첨부(Attachments)]

db.zip




9. Servlet 생성하기


servlet 생성하고 나서 web.xml 수정을 진행하면 타이핑을 적게 해도 되는 장점이 생긴다.



그림 20. 프로젝트 오른쪽 버튼 - 메뉴 모습


프로젝트를 선택한다.

마우스 오른쪽 버튼을 클릭한다.

New->Servlet을 클릭한다.



그림 21. Servlet 생성하기


Java package명을 입력한다. ("예: com.smile.web.controller // 이런 형식으로 작성하면 됨.)

Class name을 입력한다. ("예: FrontController" )

Finish를 누른다.



10. web.xml - 수정하기


charset 초기값을 추가하였다.

Servlet 2.5 문서 양식에서 3.1 양식으로 변경하였다.


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns="http://java.sun.com/xml/ns/javaee" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 

id="WebApp_ID" version="3.0">

 

  <display-name>Archetype Created Web Application</display-name>

  

  <servlet>

  <servlet-name>FrontController</servlet-name>

  <servlet-class>com.smile.web.controller.FrontController</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet-mapping>

  <servlet-name>FrontController</servlet-name>

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

  

</web-app>


파일명: web.xml


[첨부(Attachments)]

web.zip




10. 폴더 2개(views, settings), 파일 하나 만들기(root-servlet.xml)


추가적으로 만들어줄 폴더와 파일이 있다.


폴더1: /src/main/webapp/WEB-INF/settings

폴더2: /src/main/webapp/WEB-INF/views

파일: /src/main/webapp/WEB-INF/settings/root-servlet.xml


Settings 폴더는 큰 의미는 없지만, 활용할 여지를 고려하여 생성하였다.
이 프로젝트에서는 root-servlet.xml은 직접 사용되진 않는다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
</beans>


파일명: root-servlet.xml


[첨부(Attachments)]

root-servlet.zip



그림 22. 작업된 프로젝트의 모습




11. FrontController.java - 서블렛(Servlet)


실제경로: /target/generated-sources/annotations/com/smile/web/controller

패키지명: com.smile.web.controller

파일명: FrontController.java


FrontController를 list만 정의하였다.

의외로 코드를 살펴보면, 간단하다는 것을 알 수 있다.


package com.smile.web.controller;


import java.io.IOException;

import java.sql.SQLException;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.smile.web.db.DBFactory;


public class FrontController extends HttpServlet {

private static final long serialVersionUID = 1L;

private String charset = null;

/**

* @see HttpServlet#doGet(HttpServletRequest req, HttpServletResponse res)

*/

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doAction(req, res);

}


/**

* @see HttpServlet#doPost(HttpServletRequest req, HttpServletResponse res)

*/

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doAction(req, res);

}

// FrontController 패턴 & Command 패턴

protected void doAction(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


ServletConfig sc = this.getServletConfig();

charset = sc.getInitParameter("charset");


req.setAttribute("charset", charset);

req.setCharacterEncoding(charset);

res.setContentType("text/html; charset=" + charset);


String uri = req.getRequestURI();

String conPath = req.getContextPath();

String command = uri.substring(conPath.length());


Controller subController = null;


if(command.equals("/board/list.do")){

System.out.println("-----------------------------");

System.out.println("게시판 목록");

System.out.println("-----------------------------");

req.setAttribute("controllerName", "list");

subController = new com.smile.web.controller.board.ListController();

subController.execute(req, res);

}

}


}



파일명: FrontController.java


[첨부(Attachments)]

FrontController.zip




12. Controller.java - 인터페이스


실제경로: /target/generated-sources/annotations/com/smile/web/controller

패키지명: com.smile.web.controller

파일명: Controller.java


인터페이스에 관한 것이다. (forward 정의 관련한 것)


package com.smile.web.controller;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public interface Controller {

public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException;


}


파일명: Controller.java


[첨부(Attachments)]

Controller.zip



12. /Board/ListController.java - 클래스


실제경로: /target/generated-sources/annotations/com/smile/web/controller/board

패키지명: com.smile.web.controller.board

파일명: ListController.java


게시판 목록에 관한 컨트롤러 명세이다.


package com.smile.web.controller.board;


import java.io.IOException;

import java.net.URLEncoder;

import java.util.List;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.smile.web.controller.Controller;

import com.smile.web.logic.Paging;

import com.smile.web.model.Board;

import com.smile.web.service.BoardService;

import com.smile.web.util.HttpUtil;


public class ListController implements Controller {


@Override

public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

String controllerName = (String) req.getAttribute("controllerName");

BoardService service = BoardService.getInstance();

List<Board> boardList = null;

// long totalCount = boardList.size();

long currentPage = 1; // 기본값

long pageSize = 10;

long totalCount = service.getTotalCount();

long startNum, endNum;

String keyword = null;

String pagingUrl = controllerName + ".do?";

// 페이지 번호 존재할 때

if (req.getParameter("page") != null){

currentPage = Integer.valueOf( req.getParameter("page") );

}

// 키워드가 존재할 때

if (req.getParameter("keyword") != null) {

keyword = req.getParameter("keyword");

totalCount = service.getTotalKeywordCount(keyword);

// 키워드 값이 하나라도 존재할 때

if ( keyword.length() > 0) {

pagingUrl = pagingUrl + "keyword=" + URLEncoder.encode(keyword, "UTF-8") + "&";

}

}

        Paging paging = new Paging();

        /*

        paging.setPageNo(1);

        paging.setPageSize(10);

        paging.setTotalCount(totalCount);

        */

        

        paging.setPageNo(currentPage);

        paging.setPageSize(pageSize);

        paging.setTotalCount(totalCount);


        System.out.println("현재페이지번호:" + currentPage);

        System.out.println("페이지크기:" + pageSize);

        System.out.println("키워드:" + keyword);

        System.out.println("페이징URL:" + pagingUrl);

        

        startNum = paging.getDbStartNum();

        endNum = paging.getDbEndNum();


        

// 키워드가 존재할 때

if (keyword != null) {

// 키워드 값이 하나라도 존재할 때

if ( keyword.length() > 0) {

boardList = service.getBoardKeywordList(keyword, startNum, endNum);

}

else {

boardList = service.getBoardList(startNum, endNum);

}

}

else {

        boardList = service.getBoardList(startNum, endNum);

}

        

        req.setAttribute("paging", paging);

        req.setAttribute("list", boardList);

        req.setAttribute("pagingUrl", pagingUrl);

HttpUtil.forward(req, res, "/WEB-INF/views/board/" + controllerName + ".jsp");

}


}



파일명: ListController.java


[첨부(Attachments)]

ListController.zip



13. HttpUtil.java - 클래스


실제경로: /target/generated-sources/annotations/com/smile/web/util

패키지명: com.smile.web.controller.util

파일명: HttpUtil.java


RequestDispatcher와 forward에 대한 정의이다.

추가로 업로드 기능에 대한 명세도 있다.


package com.smile.web.util;


import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.PrintWriter;


import javax.servlet.RequestDispatcher;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class HttpUtil extends HttpServlet {

private static final long serialVersionUID = 1L;

private static String charset = null;


public static void forward(HttpServletRequest req, HttpServletResponse res,

String path) throws ServletException, IOException {

try {

RequestDispatcher dispatcher = req.getRequestDispatcher(path);

dispatcher.forward(req, res);

}catch(Exception e) {

e.printStackTrace();

}

}

public static void fileUpload(HttpServletRequest req, HttpServletResponse res,

String path) throws ServletException, IOException {


charset = (String) req.getAttribute("charset");

System.out.println(charset);

PrintWriter out = res.getWriter();

// 파일 업로드된 경로

String root = req.getSession().getServletContext().getRealPath("/");

String savePath = root + "upload" + File.separator + "upload";

// 서버에 실제 저장된 파일명

String filename = "1600955663095" ;

System.out.println("파일 실제 폴더경로:" + savePath);

// 실제 내보낼 파일명

String orgfilename = "license한글.txt" ;

req.setCharacterEncoding(charset);

res.setCharacterEncoding(charset);

InputStream in = null;

OutputStream os = null;

File file = null;

boolean skip = false;

String client = "";

try{

    // 파일을 읽어 스트림에 담기

    try{

        file = new File(savePath, filename);

        in = new FileInputStream(file);

    }catch(FileNotFoundException fe){

        skip = true;

    }

    client = req.getHeader("User-Agent");

    // 파일 다운로드 헤더 지정

    res.reset() ;

    res.setContentType("application/octet-stream");

    res.setHeader("Content-Description", "JSP Generated Data");

    if(!skip){

        // IE

        if(client.indexOf("MSIE") != -1){

            res.setHeader ("Content-Disposition", "attachment; filename="+new String(orgfilename.getBytes("KSC5601"),"ISO8859_1"));

        }else{

            // 한글 파일명 처리

            orgfilename = new String(orgfilename.getBytes("KSC5601"),"iso-8859-1");

            res.setHeader("Content-Disposition", "attachment; filename=\"" + orgfilename + "\"");

            res.setHeader("Content-Type", "application/octet-stream; charset=utf-8");

        }  

        res.setHeader ("Content-Length", ""+file.length() );

        os = res.getOutputStream();

        

        byte b[] = new byte[(int)file.length()];

        int leng = 0;

        while( (leng = in.read(b)) > 0 ){

            os.write(b,0,leng);

        }

    }else{

    // 한글 깨짐 - 해결

    res.setContentType("text/html;charset=" + charset);

        out.println("<html><head>");

        out.println("<script language='javascript'>alert('파일을 찾을 수 없습니다.');history.back();</script>");

        out.println("</head><body></body></html>");

    }

    in.close();

    os.close();

}catch(Exception e){

e.printStackTrace();

}

    

}


}



파일명: HttpUtil.java


[첨부(Attachments)]

HttpUtil.zip



13. DBFactory.java - 커넥션 풀 적용


실제경로: /target/generated-sources/annotations/com/smile/web/db

패키지명: com.smile.web.controller.db

파일명: DBFactory.java


HikariCP 3.4.2를 적용한 코드이다.


package com.smile.web.db;



import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

import java.io.IOException;


import java.io.InputStream;


import java.io.Reader;

import java.util.Properties;

import java.sql.Connection;

import java.sql.SQLException;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.zaxxer.hikari.HikariConfig;

import com.zaxxer.hikari.HikariDataSource;


import oracle.jdbc.pool.OracleDataSource;


public class DBFactory {


private static final Logger logger = LoggerFactory.getLogger(DBFactory.class);


    private static String CLASSNAME;

    private static String JDBC_URL;

    private static String USERNAME;

    private static String PASSWORD;

    private static String CACHE_PREP_STMTS;

    private static HikariDataSource ds;


    private HikariConfig config;


    

    public DBFactory() {


    InputStream inputStream;

    config = new HikariConfig();


        String resource = "db.properties";

        Properties properties = new Properties();


        try {


        inputStream = getClass().getClassLoader().getResourceAsStream(resource);

            properties.load(inputStream);


            System.out.println("jdbcurl:" + properties.getProperty("jdbcUrl"));

            System.out.println("className" + properties.getProperty("dataSourceClassName"));


            CLASSNAME = properties.getProperty("dataSourceClassName");

            JDBC_URL = properties.getProperty("jdbcUrl");

            USERNAME = properties.getProperty("dataSource.user");

            PASSWORD = properties.getProperty("dataSource.password");

            CACHE_PREP_STMTS = properties.getProperty("cachePrepStmts");


            config.setDriverClassName(CLASSNAME);

            config.setJdbcUrl( JDBC_URL );

            config.setUsername( USERNAME );

            config.setPassword( PASSWORD );

            

            config.addDataSourceProperty( "cachePrepStmts" , CACHE_PREP_STMTS );

            config.addDataSourceProperty( "prepStmtCacheSize" , "250" );

            config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );

            

            ds = new HikariDataSource( config );

            

        } catch (IOException e) {

            e.printStackTrace();

        }


    }


    public Connection getConnection() throws SQLException {

   

    /*

        try(Connection con = ds.getConnection()){

            System.out.println("연결상태확인:" + con);

            

            String sql = "SELECT * from board where id > 4 and id < 10";

            

            PreparedStatement pstmt = con.prepareStatement(sql);

            ResultSet rs = pstmt.executeQuery();

            

            while (rs.next()) {

                System.out.println("진짜 연결되었는가:" + rs.getString(2));

            }

        }

        catch(Exception e) {

        System.out.println("연결실패확인:" + e.getMessage());

        }

    */

   

        return ds.getConnection();

    }

    

    public void close(Connection conn, PreparedStatement ps, ResultSet rs) {


if ( rs != null ) {


try {

rs.close();

}

catch(Exception ex) {

System.out.println("오류 발생: " + ex);

}

close(conn, ps); // Recursive 구조 응용(재귀 함수)

} // end of if


}


public void close(Connection conn, PreparedStatement ps) {


if (ps != null ) {


try {

ps.close();

}

catch(Exception ex) {

System.out.println("오류 발생: " + ex);

}

} // end of if


if (conn != null ) {

try {

conn.close();

}

catch(Exception ex) {

System.out.println("오류 발생: " + ex);

}

} // end of if


}

    

}


파일명: DBFactory.java


[첨부(Attachments)]

DBFactory.zip



* 2부에서는 핵심적인 로직 등에 대해서 소개하겠다.


2부에서 만나요.


1. [JSP] 17. JSP/Servlet MVC2 - 페이징네이션과 검색 그리고 오라클 프로젝트 (2), 2020-09-30

https://yyman.tistory.com/1429


반응형
728x90
300x250

[Spring-Framework] 11. Spring MVC - HikariCP 3.4.2, Oracle 19g 연동하기(Properties, Java) - (2)


1부에서는 환경설정하는 방법에 대해서 소개하였다.

2부에서는 코드로 구현하는 방법을 위주로 소개하겠다.


[1부] [Spring-Framework] 10. Spring MVC - HikariCP 3.4.2, Oracle 19g 연동하기(Properties, Java) - (1), 2020-09-23 14:20

https://yyman.tistory.com/1410



10. Properties 방식 - DataSource.java


코드를 하나 만들어보았다.


패키지: com.springMVC.web.persistance


package com.springMVC.web.persistance;


import java.io.IOException;

import java.io.InputStream;

import java.io.Reader;

import java.util.Properties;


import java.sql.Connection;

import java.sql.SQLException;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Value;


import com.zaxxer.hikari.HikariConfig;

import com.zaxxer.hikari.HikariDataSource;


public class DataSource {


private static final Logger logger = LoggerFactory.getLogger(DataSource.class);


    private static String CLASSNAME;

    private static String JDBC_URL;

    private static String USERNAME;

    private static String PASSWORD;

    private static String CACHE_PREP_STMTS;

    private static HikariDataSource ds;

    

/*

(자바 방식)

    private static HikariConfig config = new HikariConfig();

    

    static {

    config.setDriverClassName("oracle.jdbc.OracleDriver");

        config.setJdbcUrl( "jdbc:oracle:thin:@localhost:1521:orcl" );

        config.setUsername( "사용자계정명" );

        config.setPassword( "비밀번호" );

        

        config.addDataSourceProperty( "cachePrepStmts" , "true" );

        config.addDataSourceProperty( "prepStmtCacheSize" , "250" );

        config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );

        ds = new HikariDataSource( config );

    }

    */

    

    private HikariConfig config;

    

    public DataSource() {

   

    InputStream inputStream;

    config = new HikariConfig();

   

    String resource = "db.properties";

        Properties properties = new Properties();

        

        try {

        inputStream = getClass().getClassLoader().getResourceAsStream(resource);

            properties.load(inputStream);

            System.out.println(properties.getProperty("jdbcUrl"));

            System.out.println(properties.getProperty("dataSourceClassName"));

            

            

            CLASSNAME = properties.getProperty("dataSourceClassName");

            JDBC_URL = properties.getProperty("jdbcUrl");

            USERNAME = properties.getProperty("dataSource.user");

            PASSWORD = properties.getProperty("dataSource.password");

            

            CACHE_PREP_STMTS = properties.getProperty("cachePrepStmts");


            config.setDriverClassName(CLASSNAME);

            config.setJdbcUrl( JDBC_URL );

            config.setUsername( USERNAME );

            config.setPassword( PASSWORD );

            

            config.addDataSourceProperty( "cachePrepStmts" , CACHE_PREP_STMTS );

            config.addDataSourceProperty( "prepStmtCacheSize" , "250" );

            config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );

            

            ds = new HikariDataSource( config );

            

        } catch (IOException e) {

            e.printStackTrace();

        }


    }


    public Connection getConnection() throws SQLException {


        return ds.getConnection();

    }


}


파일명: DataSource.java


[첨부(Attachments)]

DataSource-java-type-properties.zip


위의 소스를 static 방식으로 간결하게 코드를 변경할 수 없는 이유는 "getClass().getClassLoader().getResourceAsStream(resource);" 이 부분이 static 변수에서는 처리가 되지 않는다.


비고: 클래스명에 대해서 "DataSource"로 해도 되나요?

       javax.sql.DataSource가 존재한다. 예제의 DataSource 클래스명은 좋은 명칭은 아니다. 

       (동작은 될 수 있겠으나 javax.sql.DataSource를 사용할 때는 명칭에 대해서 다시 생각을 해봐야 할 것이다.)



10-1. Controller - HomeController.java 수정하기(Properties 방식)


HomeController.java 파일로 작업하는 방법이다.


package com.springMVC.web.controller;


import java.text.DateFormat;

import java.util.Date;

import java.util.Locale;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;


import com.springMVC.web.dao.AddressBookDao;

import com.springMVC.web.persistance.DataSource;


/**

 * Handles requests for the application home page.

 */

@Controller

public class HomeController {

/*

// Controller 안에서만 사용가능.

@Value("#{props['dataSourceClassName']}")

private String CLASSNAME;

@Value("#{props['jdbcUrl']}")

private String JDBC_URL;

@Value("#{props['dataSource.user']}")

private String USERNAME;

@Value("#{props['dataSource.password']}")

private String PASSWORD;

*/

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

// @Value("#{props['jdbcUrl']}")

// private String url;

/**

* Simply selects the home view to render by returning its name.

*/

@RequestMapping(value = "/", method = RequestMethod.GET)

public String home(Locale locale, Model model) {

logger.info("Welcome home! The client locale is {}.", locale);

Date date = new Date();

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

String formattedDate = dateFormat.format(date);

try {

DataSource ds = new DataSource();

//ds.getConnection();

AddressBookDao dao = new AddressBookDao();

dao.allSelect();

//logger.info("URL:{}", JDBC_URL);

//dao.allSelect();

}

catch(Exception e) {

logger.info("msg: {}", e.getMessage());

}

model.addAttribute("serverTime", formattedDate );

return "home";

}

}


파일명: HomeController.java


[첨부(Attachments)]

HomeController-java-type-properties.zip




10-2. DAO - AddressBookDao.java (Properties 방식)


package com.springMVC.web.dao;


import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


import com.springMVC.web.persistance.DataSource;


public class AddressBookDao {


private static final Logger logger = LoggerFactory.getLogger(AddressBookDao.class);


public void allSelect() {

try {

DataSource ds = new DataSource();

Connection conn = ds.getConnection();

String query = "select * from addressbook";

PreparedStatement pstmt = conn.prepareStatement(query);

ResultSet rs = pstmt.executeQuery();

while(rs.next()) {


String msg = "번호:" + rs.getString("num") + "/이름:" + rs.getString("name") + "/주소:" + rs.getString("address");

logger.info("Msg: {}.", msg);

}

rs.close();

conn.close();

} catch (SQLException e) {

logger.info("msg:{}",  e.getMessage());

}

}

}



파일명: AddressBookDao.java


[첨부(Attachments)]

AddressBookDao-type-properties.zip




11. Java 방식 - DataSource.java


앞에 Properties 방식으로 구성해봐도 되고, 자바 코드 방식으로 해도 무방하다.


package com.springMVC.web.persistance;


import java.io.IOException;

import java.io.InputStream;

import java.io.Reader;

import java.util.Properties;


import java.sql.Connection;

import java.sql.SQLException;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Value;


import com.zaxxer.hikari.HikariConfig;

import com.zaxxer.hikari.HikariDataSource;


public class DataSource {


private static final Logger logger = LoggerFactory.getLogger(DataSource.class);


    private static String CLASSNAME;

    private static String JDBC_URL;

    private static String USERNAME;

    private static String PASSWORD;

    private static String CACHE_PREP_STMTS;

    private static HikariDataSource ds;

    

    private static HikariConfig config = new HikariConfig();

    

    static {

    config.setDriverClassName("oracle.jdbc.OracleDriver");

        config.setJdbcUrl( "jdbc:oracle:thin:@localhost:1521:orcl" );

        config.setUsername( "사용자계정명" );

        config.setPassword( "비밀번호" );

        

        config.addDataSourceProperty( "cachePrepStmts" , "true" );

        config.addDataSourceProperty( "prepStmtCacheSize" , "250" );

        config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );

        ds = new HikariDataSource( config );

    }

    

    /*

    private HikariConfig config;

    

    public DataSource() {

   

    InputStream inputStream;

    config = new HikariConfig();

   

    String resource = "db.properties";

        Properties properties = new Properties();

        

        try {

        inputStream = getClass().getClassLoader().getResourceAsStream(resource);

            properties.load(inputStream);

            System.out.println(properties.getProperty("jdbcUrl"));

            System.out.println(properties.getProperty("dataSourceClassName"));

            

            

            CLASSNAME = properties.getProperty("dataSourceClassName");

            JDBC_URL = properties.getProperty("jdbcUrl");

            USERNAME = properties.getProperty("dataSource.user");

            PASSWORD = properties.getProperty("dataSource.password");

            

            CACHE_PREP_STMTS = properties.getProperty("cachePrepStmts");


            config.setDriverClassName(CLASSNAME);

            config.setJdbcUrl( JDBC_URL );

            config.setUsername( USERNAME );

            config.setPassword( PASSWORD );

            

            config.addDataSourceProperty( "cachePrepStmts" , CACHE_PREP_STMTS );

            config.addDataSourceProperty( "prepStmtCacheSize" , "250" );

            config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );

            

            ds = new HikariDataSource( config );

            

        } catch (IOException e) {

            e.printStackTrace();

        }


    }

    

    

    */


    public static Connection getConnection() throws SQLException {


        return ds.getConnection();

    }

}


파일명: DataSource.java


[첨부(Attachments)]

DataSource-java-type-java.zip




11-1. Controller - HomeController.java 수정하기(Java 방식)


HomeController.java 파일로 작업하는 방법이다.


package com.springMVC.web.controller;


import java.text.DateFormat;

import java.util.Date;

import java.util.Locale;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;


import com.springMVC.web.dao.AddressBookDao;

import com.springMVC.web.persistance.DataSource;


/**

 * Handles requests for the application home page.

 */

@Controller

public class HomeController {

/*

// Controller 안에서만 사용가능.

@Value("#{props['dataSourceClassName']}")

private String CLASSNAME;

@Value("#{props['jdbcUrl']}")

private String JDBC_URL;

@Value("#{props['dataSource.user']}")

private String USERNAME;

@Value("#{props['dataSource.password']}")

private String PASSWORD;

*/

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

// @Value("#{props['jdbcUrl']}")

// private String url;

/**

* Simply selects the home view to render by returning its name.

*/

@RequestMapping(value = "/", method = RequestMethod.GET)

public String home(Locale locale, Model model) {

logger.info("Welcome home! The client locale is {}.", locale);

Date date = new Date();

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

String formattedDate = dateFormat.format(date);

try {

//ds.getConnection();

AddressBookDao dao = new AddressBookDao();

dao.allSelect();

//logger.info("URL:{}", JDBC_URL);

//dao.allSelect();

}

catch(Exception e) {

logger.info("msg: {}", e.getMessage());

}

model.addAttribute("serverTime", formattedDate );

return "home";

}

}


파일명: HomeController.java


[첨부(Attachments)]

HomeController-java-type-java.zip





11-2. DAO - AddressBookDao.java (JAVA 방식)


자바 방식으로 dao를 구성하는 방법이다.


package com.springMVC.web.dao;


import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


import com.springMVC.web.persistance.DataSource;


public class AddressBookDao {


private static final Logger logger = LoggerFactory.getLogger(AddressBookDao.class);


public void allSelect() {

try {

Connection conn = DataSource.getConnection();

String query = "select * from addressbook";

PreparedStatement pstmt = conn.prepareStatement(query);

ResultSet rs = pstmt.executeQuery();

while(rs.next()) {


String msg = "번호:" + rs.getString("num") + "/이름:" + rs.getString("name") + "/주소:" + rs.getString("address");

logger.info("Msg: {}.", msg);

}

rs.close();

conn.close();

} catch (SQLException e) {

logger.info("msg:{}",  e.getMessage());

}

}

}



파일명: AddressBookDao.java


[첨부(Attachments)]

AddressBookDao.java-Type-java.zip



12. 출력 결과


작업한 데이터베이스의 모습이다.

작업한 결과를 보면, 무슨 작업을 하려고 했는지 직관적으로 이해될 것으로 보인다.

DB를 처리하거나 호출하는 건 똑같은데, 호출할 때 미리 저장된 풀을 활용하여 부담을 줄여주는 효과가 있다.



그림 11. Oracle DB - SQL Developer 모습(Addressbook)



그림 12. Oracle DB - SQL Developer 모습(Addressbook)



그림 13. 화면 출력 결과 - STS4(Eclipse)



* 맺음글(Conclusion)


시중의 HikariCP에 대한 글이 오류가 많아서 한번 정확하게 최신 버전으로 작성해보고 싶었다.

수차례 태스트 작업을 완료하였으니 사용하는 데 지장없을 것으로 보인다.


공식 사이트: https://github.com/brettwooldridge/HikariCP

-> 공식 사이트의 메뉴얼이 다소 부족한 면이 있다.



* 참고자료(Reference)


1. [Spring] 커넥션 풀(Connection pool)이란?, https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/ , Accessed by 2020-09-23, Last Modified 2019-08-14.

2. Spring-Hikari-Oracle연동 시 나는 oracle.jdbc.driver.OracleDriver not found 에러, https://apiclass.tistory.com/entry/Spring-Hikari-Oracle%EC%97%B0%EB%8F%99-%EC%8B%9C-%EB%82%98%EB%8A%94-oraclejdbcdriverOracleDriver-not-found-%EC%97%90%EB%9F%AC, Accessed by 2020-09-23, Last Modified 2019-10-16.

3. Introduction to HikariCP, https://www.baeldung.com/hikaricp, Accessed by 2020-09-23, Last Modified 2020-06-02.

4. Maven Repository: mysql » mysql-connector-java » 8.0.21, https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.21, Accessed by 2020-09-23, Last Modified .

5. GitHub - brettwooldridge/HikariCP: 光 HikariCP・A solid, high-performance, JDBC connection pool at last., https://github.com/brettwooldridge/HikariCP, Accessed by 2020-09-23, Last Modified .

6. [Spring][04]커넥션 풀 설정(HikariCP), https://kimvampa.tistory.com/57, Accessed by 2020-09-23, Last Modified 2020-04-10.

7. [Spring] Spring Test 오류 해결 모음(SpringJUnit4ClassRunner , Resource specification), https://life-with-coding.tistory.com/373, Accessed by 2020-09-23, Last Modified 2020-07-08.

8. [오류, 에러] Spring Junit Test 환경설정 / Class<SpringJUnit4ClassRunner> cannot be resolved to a type, https://developerntraveler.tistory.com/1, Accessed by 2020-09-23, Last Modified 2020-05-14.

9. 오라클 드라이버 에러 - Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found, trying direct instantiation, https://wrkbr.tistory.com/410, Accessed by 2020-09-23, Last Modified 2018.

10. SpringBoot error: Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found, trying direct instantiation, https://stackoverflow.com/questions/52014595/springboot-error-registered-driver-with-driverclassname-oracle-jdbc-driver-orac, Accessed by 2020-09-23, Last Modified 2018.

11. Spring에서 Properties 사용, https://yookeun.github.io/java/2015/12/22/spring-properties/, Accessed by 2020-09-23, Last Modified 2015-12-22.

12. Java에서 Properties 파일 읽기, https://prettymucho.tistory.com/7, Accessed by 2020-09-23, Last Modified 2017-06-12.

반응형
728x90
300x250

[Spring-Framework] 8. Spring MVC 웹 프로젝트 생성하기, UTF-8 문제(1)


Spring MVC 프로젝트를 이해하기 위해서는 몇 가지 가벼운 지식이 요구된다.


* 웹 서버: Apache Tomcat 9

  - JSP/Servlet 기초 이해력

* 라이브러리: Maven(메이븐)

* Spring 프레임워크없이, JSP/Servlet 기반으로 MVC2를 직접 구현할 수 있는 수준


jQuery, Ajax 등 기반으로 만들어진 시중 책들이 굉장히 많은데 이건 별도의 영역이다.

같이 취급해서는 안 된다고 본다.


엄밀히 보면, jQuery나 Ajax는 javascript 영역이다.


시중 책들이 워낙 어렵게 소개되고 있어서 간단하고 알기 쉽게 소개하려고 한다.


운영체제: Microsoft Windows 10

개발환경: Spring Tool-Suite 4-4.7.2. Release (Eclipse 기반 개발)

웹 서버: apache-tomcat-9.0.37-windows-x64




1. Eclipse Marketplace에서 "Spring Tools 3 Add-On for Spring Tools 4 3.9.14. RELEASE" 설치하기

(부재: Spring Legacy Project 기능 추가하기)


Spring MVC Project를 쉽고 빠르게 사용하려면, Spring Legacy Project 기능을 설치해야 한다.

현재 최신 STS 4-4.7.2를 보면, Spring Boot나 Spring Starter 등 최신 기능을 주력으로 하는 것 같다.



그림 1. Eclipse의 Help 메뉴


"Help->Eclipse Marketplace"를 들어간다.



그림 2. STS 검색하기


sts를 검색한다.

"Spring Tools 3 Add-On for Spring Tools 4 3.9.14. RELEASE"를 Install한다.


(중략함. 설치 과정 자체가 쉬움.)



2. 새 프로젝트 만들기


File-> New-> Others를 누른다.



그림 3. Project 생성하기


Spring 폴더의 Spring Legacy Project를 선택한다.

Next를 누른다.



그림 4. Project 생성하기


Spring MVC Project를 선택한 후 Next를 누른다.




그림 5. Project 생성하기


프로젝트 상위 패키지명을 입력한 후 Finish를 누른다.


의외로 쉽게 MVC 프로젝트가 생성되는 것을 확인할 수 있다.

참고로 com.springMVC1.web으로 작성하면, 태스트 배포 주소는 "홈페이지주소:8080/web"이 된다.



3. 신규 프로젝트 구경하기


시작이 반이다.

Spring MVC에 겁먹지 말고, 프로젝트를 구경해보기 바란다.



그림 6. Controller 모습



그림 7. View 영역의 WEB-INF/views/home.jsp 모습





그림 8. servlet-context.xml


과거에는 힘들게 servlet-context.xml을 작성하였지만, 지금은 힘들게 작성할 필요는 없다.


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/mvc"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">


<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->

<annotation-driven />


<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->

<resources mapping="/resources/**" location="/resources/" />


<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<beans:property name="prefix" value="/WEB-INF/views/" />

<beans:property name="suffix" value=".jsp" />

</beans:bean>

<context:component-scan base-package="com.springMVC1.web" />

</beans:beans>


* 소스코드 원문: servlet-context.xml





그림 9. root-context.xml





그림 10. servlet-context.xml


web.xml 파일이다. 

servlet 작성하면서, 작업해본 경험이 있을 수 있다. 동일하게 사용할 수 있다.

참고로 maven으로 웹 프로젝트를 개설하면, 자동으로 생성된다.



그림 11. pom.xml


Spring Framework는 maven 프로젝트의 핵심인 pom.xml 기능을 그대로 사용할 수 있다.




그림 12. Hello World - 초기 접속


Spring MVC를 처음으로 구성하고 접속해보면, 그림 12의 화면을 볼 수 있다.



4. 한글 문제 해결하기(UTF-8 문제)


한글 문제 해결에 관한 이슈이다.

web.xml 파일을 수정하여 해결할 수 있다.



그림 13. web.xml에서 한글 문제 해결하기


<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/spring/root-context.xml</param-value>

</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>


<!-- Processes application requests -->

<servlet>

<servlet-name>appServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>appServlet</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>


<!-- UTF-8 -->

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>

org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param> <init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>​



</web-app>



* 파일명: web.xml


[첨부(Attachments)]

web.zip



그림 14. 한글 문제가 해결된 모습




5. Controller - 입문하기


Spring MVC Controller를 활용하여 쉽고 간단하게 작성하는 방법을 소개하겠다.



그림 15. 클래스 만들기(Controller로 개조 예정)


패키지에서 오른쪽 버튼을 클릭한다.

New->Class를 클릭한다.

"BoardController"를 하나 만들어준다.



그림 16. 클래스 만들기(Controller) - HomeController.java


HomeController의 내용을 신규 생성한 "BoardController.java" 파일을 열어서 복사, 붙여넣기를 해준다.




그림 17. 클래스 만들기(Controller) - BoardController.java


편집을 완료한 BoardController의 모습이다.


정정: 

(1) HomeController.class -> BoardController.class로 변경 (탈자)
(2) Welcome home: The ..... -> Welcome board: The...로 변경





그림 18. lisp.jsp 생성하기 -> src/main/webapp/WEB-INF/views/board/list.jsp


views내에 board폴더를 만든다.

board폴더 내에 list.jsp 파일을 만든다.



그림 19. 서버를 로드했을 때 모습 - STS 4


Spring-Framework MVC를 웹서버에서 실행시켜보면, 매우 간단한 구조로 동작하는 모습을 살펴볼 수 있다.

web.xml 파일 수정도 안 했으며, Controller하고 list.jsp 파일만 만들었는데 작동하는 모습을 보면, 프레임워크가 좋긴 좋다는 것을 느낄 수 있다.



그림 20. board/list 호출한 결과



* 맺음글(Conclusion)


매우 간단한 형태로 Spring MVC Project를 구성하는 방법에 대해서 소개하였다.


반응형
728x90
300x250

[JSP] 11. WAR 배포하기 - 웹 사이트 올리기


개발을 하였으면, 사용자가 접속할 수 있도록 배포를 해주어야 한다.

기존의 Apache Web Server나 Microsoft IIS 서버의 경우에는 프로젝트 그대로 올려주면 되는데, JSP는 두 가지 방법을 지원하고 있다.


WAR 형태 파일로 압축하여 서버에 올리는 방법이 있다.




1. 리눅스, 윈도우 환경에서 "Eclipse IDE(Spring Tool-Suite 4)"로 개발했을 때


1. 배포할 spring 프로젝트를 우클릭하여 export를 선택한다.

2. export 메뉴가 나오면 Web 카테고리 안의 WAR file을 선택하고 Next를 누른다.

3. Destination에 war파일을 저장할 위치를 지정해준다. (tomcat이 설치된 폴더의 webapps 폴더로 지정해주면 편리하다)


4. Export source files와 Overwrite existing file 항목을 체크해준다.

5. 마지막으로 finish를 누르면 war파일이 생성된다.



그림 1. File 메뉴 모습


File -> Export를 클릭한다.



그림 2. Eclipse의 Export 작업


"Web 폴더"의 "War file"을 선택한 후, "Next"를 누른다.



그림 3. Eclipse의 Export 작업


작업한 웹 프로젝트를 선택하고 "Browse"를 누른다.



그림 4. Eclipse의 Export 작업


배포할 파일의 내보낼 위치를 선택한다.

저장(S)를 누른다.



그림 5. Eclipse의 Export 작업


"Finish"를 누른다.




2. Windows(윈도우) 환경에서의 아파치 서버에 배포하기


{tomcat 설치 경로}\webapps 폴더에 생성한 war 파일을 복사한다.

{tomcat 설치 경로}/bin 으로 들어가서 startup.bat을 실행하면 tomcat이 시작된다.


tomcat을 시작하면, 자동으로 프로젝트 이름과 동일한 폴더가 생성되면서 war 파일로 묶여있던 패키지가 풀린다.


웹브라우저에서 localhost:8080이나 아이피주소:8080로 해당 프로젝트에 접속하면 된다. 

프로젝트명이 test인 경우 http://localhost:8080/test 로 접속하면 spring 프로젝트에 접속된다.




그림 6. 배포 폴더에 war 파일 모습


webapps폴더에 war 파일을 붙여넣는다.



그림 7. bin의 startup.bat(Apache Tomcat 9)


bin폴더에 있는 startup.bat을 실행하여 웹 서버를 실행해준다.



그림 8. Apache Tomcat 9 - 서버 가동중




그림 9. 웹 브라우저에서 확인하기


웹 브라우저에서 접속하여 확인하면, 동작하는 것을 알 수 있다.



3. Linux(Ubuntu) 환경에서 배포


마찬가지로 tomcat이 설치된 디렉토리의 webapps 디렉토리에 war 파일을 복사하고 tomcat을 재시작 해주면 된다.

(/var/lib/tomcat{버전}/webapps/ 디렉토리에 복사한다.)


tomcat을 재실행한다.

Windows와 동일하게 tomcat을 시작하면 자동으로 프로젝트 이름과 동일한 폴더가 생성되면서 war 파일로 묶여있던 패키지가 풀린다.


$ sudo service tomcat{버전} restart


웹브라우저에서 해당 서버의 아이피주소:8080로 접속할 수 있다.


운영체제: 리눅스 우분투(Ubuntu-20 Desktop 64bit)


[명령어 요약]

user@localhost :sudo -i

root#apt update

(처음 우분투 설치하면, 업데이트 하라고 GUI화면에 올라옴. 재부팅을 몇 번 해보고 나서 작업하는 것을 권장함.)

root#apt install tomcat9

root#service tomcat9 start


(war 파일 경로 찾기)

#mv {파일명}.war /var/lib/tomcat9/webapps

(수동 컴파일 버전은 수동 설치 경로로 할 것)


(잠시 기다리고 나서 1분 이내)

* 파이어폭스 열어서 접속할 것




그림 10. 우분투(리눅스)에서 톰캣9 - 설치하기




그림 11. 우분투(리눅스)에서 ifconfig 명령어 집합(net-tools) 설치 및 톰캣 실행하기 - 리눅스




그림 12. 파이어폭스에서 localhost 구경하기 - 리눅스





그림 13. 톰캣 설치 경로 찾기 - 리눅스






그림 14. war 파일 복사 및 경로 이동하기 - 리눅스





그림 15. 루트에 배포된 war 파일 모습 - 리눅스






4. 루트 경로에 배포하기


* ROOT에 war파일 배포할 경우


1. 프로젝트 war파일 생성


- Eclipse에서 프로젝트 우클릭 -> Export - Web - WAR file 선택 -> Next버튼 클릭


- Destination에 war파일 생성될 위치 지정하고, 파일명은 반드시 'ROOT.war'로 입력한 후 Finish버튼 클릭


* 파일명을 꼭 ROOT로 해야하는 것은 아니지만 ROOT가 아닌 다른 걸로 하려면 별도의 설정이 필요함


2. Tomcat 폴더/webapps/ROOT 폴더의 이름을 변경


* Tomcat을 설치하면 위 경로에 ROOT폴더가 있는데 이 폴더가 존재하면 ROOT.war가 압축해제되지 않음


3. Tomcat 폴더/webapps 폴더에 생성된 ROOT.war파일 이동



그림 16. root.war 파일 설치하기


초기에 ROOT폴더는 이름을 변경해서 둔다.



그림 17. 서버 실행하기


bin폴더에 들어가서 startup.bat을 실행한다.


그림 18. 루트 홈페이지 모습


"서버주소:포트"로 홈페이지에 접속하면, 루트 홈페이지로 풀린 프로젝트를 살펴볼 수 있다.



그림 19. 서버 동작 후, 프로젝트 컴파일된 모습


서버 동작 시키고 나서 webapps 폴더를 관찰해보면, ROOT 폴더가 새로 생겨있는 것을 살펴 볼 수 있다.



* 참고자료(References)


1. Spring 프로젝트 배포하기(tomcat 이용), https://attackyourheart.tistory.com/50, Accessed by 2020-09-22, Last Modified 2015-01-20.

2. Tomcat에 war파일 배포하는 방법, https://its-easy.tistory.com/4, Accessed by 2020-09-22, Last Modified 2018-02-13.

반응형
728x90
300x250

[Spring-Framework] 6. Maven, Hibernate 5.4, Servlet, MySQL 8 연동(CRUD) - (1)


Hibernate 5.4 이상에서 ORM기반의 데이터베이스를 사용하는 방법에 대해서 소개하겠다.

글을 작성하게 된 계기는 인터넷을 검색해보니깐, 워낙 오래된 Hibernate 버전을 기준으로 현실성이 없는 복잡한 구현의 글이 많아서 쉽고 간단하게 작성할 수 없겠느냐는 생각을 갖고 좀 더 쉽고 적응하기 쉽도록 만들어보고자 작성하게 되었다.


글을 2부로 구성하였다.


조금 태스트를 하면서 느낀 소감은 iBatis나 SQL이 훨씬 사용하기에는 편리하다.

절차지향적인 언어인 SQL 사용하는 게 나쁜 건만 아니라고 본다.


조금 양이 많을 수 밖에 없어서 불가피하게 두 개의 글로 나누었으니 참고하길 바란다.


Hibernate(하이버네이트)란?

하이버네이트 ORM은 자바 언어를 위한 객체 관계 매핑 프레임워크이다.
객체 지향 도메인 모델을 관계형 데이터베이스로 매핑하기 위한 프레임워크를 제공한다.
하이버네이트는 GNU LGPL 2.1로 배포되는 자유 소프트웨어이다.

https://hibernate.org/



ORM(Object-relational mapping)이란?

ORM(Object-relational mapping)을 단순하게 표현하면 객체와 관계와의 설정이라 할 수 있다.
ORM에서 말하는 객체(Object)의 의미는 우리가 흔히 알고 있는 OOP(Object_Oriented Programming)의 그 객체를 의미한다는 것을 쉽게 유추할 수 있을 것이다. 그렇다면 과연 관계라는 것이 의미하는 것은 무엇일까?
지극히 기초적인 이야기지만 개발자가 흔히 사용하고 있는 관계형 데이터베이스를 의미한다.



[환경]

- 운영체제: Microsoft Windows 10


- 웹서버: Apache-tomcat-9.0.37                (http://tomcat.apache.org/)


- IDE: Spring Tool-Suite 4-4.7.2 Releases      (https://spring.io/tools)

  * JBoss -> Hibernate만 설치할 것(필수) - Help->Eclipse Marketplace


- 데이터베이스: MySQL 8.0.21 Windows 64bit  (https://dev.mysql.com/downloads/mysql/)

  * Library: Connector/J 8.0.21


- 개발 라이브러리:

  * Maven

    - https://maven.apache.org/

  * hibernate-entitymanager (5.4.21 Final)

    - https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager

    - https://hibernate.org/

  * javax.inject (1)
  * javax.servlet-api (4.0.1)

    - https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api

  * mysql-connector-java (8.0.21)

    - https://mvnrepository.com/artifact/mysql/mysql-connector-java




1. MySQL Server - 설치하기


아래의 사이트에 접속한다.

https://dev.mysql.com/downloads/mysql/


설치 방법은 워낙 간단하고, 잡음이 적은 프로그램이므로 짧게 정리하였다.




그림 1) MySQL Server 8.0.21 - 설치하기





그림 2) MySQL Server 8.0.21 - 설치하기



2. 테이블 설계 (emptable, student)


dto 또는 model 영역 중 하나의 작업으로 두 개의 테이블을 설계하였다.


"emptable", "student"




그림 3) 데이터베이스 테이블 생성 - emptable






그림 4) 데이터베이스 테이블 생성 - student



CREATE TABLE `emptable` (

  `empno` INT NOT NULL AUTO_INCREMENT,

  `name` VARCHAR(20) NULL,

  `address` VARCHAR(100) NULL,

  `createdate` DATE NULL,

  PRIMARY KEY (`empno`));


INSERT INTO `emptable` (`name`, `address`, `createdate`) VALUES ('하하', '안녕', '20-09-1');



CREATE TABLE `student` (

  `studentno` INT NOT NULL AUTO_INCREMENT,

  `name` VARCHAR(45) NULL,

  `address` VARCHAR(100) NULL,

  `createdate` DATE NULL,

  PRIMARY KEY (`studentno`))

ENGINE = InnoDB

DEFAULT CHARACTER SET = utf8

COLLATE = utf8_unicode_ci;


INSERT INTO `student` (`name`, `address`, `createdate`) VALUES ('홍길동', '연습', '21-3-4');


[첨부(Attachments)]

emptable.zip

student.zip




3. 프로젝트 구성


미리 살펴보는 hibernateMaven2 프로젝트의 구성이다.



그림 5) 프로젝트 구성도 - hibernateMaven2


* Servlet 구성

- /SampleServlet

- /StudentServlet



4. POM.xml 수정하기(Maven 적용된 프로젝트)


pom.xml이 왜 없냐고 생각하는 경우가 있을 수 있다.

알기 쉽게 소개하면, maven이 적용되어있는 프로젝트에서 존재하는 기능이라고 보면 된다.


http://mvnrepository.com에 접속해서 몇 가지 구성을 찾아서 입력해줘야 한다.


(중략)

      <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->

<dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-entitymanager</artifactId>

    <version>5.4.21.Final</version>

</dependency>

    <!-- @Inject -->

    <dependency>

        <groupId>javax.inject</groupId>

        <artifactId>javax.inject</artifactId>

        <version>1</version>

    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    <scope>provided</scope>

</dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>8.0.21</version>

</dependency>


(중략)




그림 6) pom.xml 수정하기







5. hibernate 환경설정 - 생성과 수정


이 작업은 "JBoss -> hibernate" 라이브러리를 설치하지 않으면, 의미가 없다고 보면 된다.

수동으로 물론 셋팅할 수는 있으나 권장하진 않는다. (시도해봐도 무방, 처음에 찾는데 시간이 오래 걸린다. 이런 문제)




그림 7) 프로젝트 항목 -> 오른쪽 버튼 메뉴 모습





그림 8) Hibernate Configuration File 선택하기


- Hibernate XML Mapping file 기능은 생성이 되지 않는다.

  (꼭 반드시 XML Mapping으로 hibernate resources를 잡을 필요는 없으며, Class Mapping도 사용된다.)


셋팅에서 필요한 부분들을 정리해보았다.


* hibernate.connection.driver_class = com.mysql.jdbc.Driver

* hibernate.connection.url = jdbc:mysql://localhost:3306/web?serverTimezone=UTC&characterEncoding=utf8

* hibernate.dialect = org.hibernate.dialect.MySQL8Dialect

* hibernate.show_sql = true

* hibernate.hbm2ddl.auto = update

* hibernate.default_entity_mode = pojo

* hibernate.current_session_context_class = thread



문제1. [MySQL 초기 설치 후 작업했을 때, 타임존 문제]


타임존 미설정시

* ERROR: The server time zone value


해결 방법1: serverTime=UTC를 입력해준다.

해결 방법2: 서버 my.cnf 파일에서 timezone을 지정해준다.


* my.cnf 파일 내에 환경 설정을 변경해주는 방법이 있다.
[mysqld]

default-time-zone='+9:00'



문제2. [UTF-8 환경설정 문제]


해결 방법1: characterEncoding=utf8을 입력해준다.

해결 방법2: 서버 my.cnf 파일에서 timezone을 지정해준다.


* my.cnf 파일 내에 환경 설정을 변경해주는 방법이 있다.

[mysqld]

init_connect = SET collation_connection = utf8_general_ci

init_connect = SET NAMES utf8

character-set-server = utf8

collation-server = utf8_general_ci




그림 9) hibernate.cfg.xml


[첨부(Attachments)]

hibernate.cfg.zip


* 경로는 다음과 같다. 참고로 초기에 폴더가 생성되어 있는 것이 아니라서, 수동으로 폴더를 만들어줘야 한다.


폴더: src/main/resources




그림 10) hibernate 모습



물론 공식 메뉴얼만 가지고 이해가 되지 않으면 추가적인 검색을 시도해봐도 된다.





5. 결과 - 미리 살펴보는 결과


완성된 작품은 이러한 모습을 가지고 있다.

무슨 작품을 만들지 생각해보기 위함이다.


그림 11) 출력 결과 - 웹 브라우저




그림 12) 출력 결과 - 웹 브라우저(2)




그림 13) 출력 결과 - 웹 브라우저(3)




6. 2부에서 만나요 


게시글 2부에서 연속 글이 연재된다.


[Spring-Framework] 7. Maven, Hibernate 5.4, Servlet, MySQL 8 연동(CRUD) - (2)

https://yyman.tistory.com/1405




* 참고 자료(References)


1. Hibernate Getting Started Guide, https://docs.jboss.org/hibernate/orm/5.4/quickstart/html_single/, Accessed by 2020-09-21, Last Modified 2020-08-27 10:35.

- 공식적인 Hibernate 메뉴얼이니 이해가 안 되면 읽어보길 바란다.


2. Hibernate 5 Java Configuration Example - DZone Java, https://dzone.com/articles/hibernate-5-java-configuration-example, Accessed by 2020-09-21, Last Modified 2018-12-03

- 추천(70점): 가장 실질적으로 많은 도움을 받았던 글이다. (영어 글)


3. MySQL(MariaDB) 서버 타임존 설정하기, https://offbyone.tistory.com/318, Accessed by 2020-09-21, Last Modified 2018-07-17 23:38.

4. java.sql.SQLException: The server time zone value ‘xx time’ is unrecognized, https://mkyong.com/jdbc/java-sql-sqlexception-the-server-time-zone-value-xx-time-is-unrecognized/, Accessed by 2020-09-21, Last Modified 2019-07-05.

- 비고: (영어 글)이다.

반응형
728x90
300x250
[JSP] 6. Apache Tomcat 9 기반으로 한 Eclipse에서 Servlet 사용하기(Using servlets in Eclipse based on Apache Tomcat 9)

 

Apache Tomcat 9와 Eclipse Java 2019-09를 활용한 Dynamic Web Project를 하나 진행하도록 하겠다.

해당 예제는 톰캣에 탑재되어 있는 기본 예제로 진행하였다.

(The Apache Tomcat 9 and the Eclipse Java 2019-09 A Dynamic Web Project will utilize the proceeds to one.

This example is a basic example of Tomcat.)

 


1. 실습 환경(Environmental Practice)

 

1. MS윈도우 10 1909(MS Windows 10 1909)

2. Apache Tomcat 9

3. Eclipse Java 2019-09

4. OpenJDK 13

 


2. 프로젝트 생성하기(Create a project)

 

프로젝트를 아래의 그림처럼 생성한다.(Create a project as shown below.)

 

 

 


3. Servlet 생성하기

 

서블랫에 대해서는 다음에 소개하도록 하겠다.

(I'll introduce you to the Servlet later.)

 

 

Java Resources 탭에서 src 폴더를 오른쪽 버튼을 클릭한다.

(Right-click the src folder on the Java Resources tab.)

 

 

그리고 New-> Servlet을 클릭한다.

(Then click New-> Servlet.)

 

 

 

 

 

 

 

 


4. Apache Tomcat 9의 Servlet API 찾기(Finding the Servlet API for Apache Tomcat 9)

 

서블랫의 경로는 아래의 그림처럼 존재한다.

C:\{Apache 설치경로}\lib\servlet-api.jar

(The servlet's path exists as shown below.

C:\{Apache installation path}\lib\servlet-api.jar)

 

 

 


5. 이클립스에 적용하기(Apply to Eclipse)

 

이클립스에 적용하는 방법이다. {프로젝트명} 폴더를 클릭 후 오른쪽 버튼을 클릭한다.

그리고 "Properties"를 클릭한다.

(This is how you apply it to Eclipse.

Right click on the {Project Name} folder.Then click "Properties".)

 

 

 

 

 


6. 소스코드 구현하기(Implement the source code)

 

소스코드를 작성해주면 된다.(Write the source code.)

 

 


7. 디버그 및 태스트하기

 

Eclipse Java 2019-09부터는 Server에 Apache Tomcat이 사라졌다.

(Starting with Eclipse Java 2019-09, Apache Tomcat disappeared from Server.)

 

 


7-1. WAS에 WAR 배포하기

 

WAS(이하 "Web Application Server")에 방금 작성한 자바 프로젝트를 배포하는 방법이다.

(How to deploy a Java project you just created to WAS ("Web Application Server").)

 

 

File->Export를 클릭한다.(Click File-> Export.)

 

 

 

 

배포 위치는 c:\apache-tomcat-***\webapps에 넣어주면 된다.

(The distribution location is in "c:\apache-tomcat-***\webapps.")

 

 


8. 웹 사이트 접속해보기(Go to the website)

 

웹 사이트에 접속하면 확인해볼 수 있다.(You can check it by visiting the website.)

 

반응형

+ Recent posts