728x90
300x250

[컴퓨터 - PC활용] 오픈소스 - 라이선스 파일(txt)


오픈소스 프로젝트를 운영하거나 만들 때 사용하면 좋은 라이선스를 몇 가지 정리해보았다.

프로젝트를 만들고, 해당 라이선스 파일을 넣어놓으면, 오픈소스 라이선스 정책을 적용받게 된다.


* 종류: GNU/GPL License, Apache Licenses, MIT License, BSD License 등



그림 1. Open Source Initiative 로고(승인된 라이선스)


[참고 사이트]

https://opensource.org/


1. License 정책 정리하기


1-1. GNU Library or Lesser General Public License version 3.0 (LGPLv3)

라이브러리는 공유하되 개발된 제품에 대해서는 소스를 공개하지 않고 상용 SW 판매가 가능한 GPL 보다 완화된 라이선스를 말함.

“본 라이선스”는 이 라이선스는 GNU 일반 공중 라이선스 버전 3에 추가된 추가 허용 사항들로 구성된다.

GNU 약소 일반 공중 라이선스의 버전 3를 의미하며 GNU GPL은 GNU 일반 공중 라이선스의 버전3을 의미한다.

버전 : 3.0

관리기관 : Free Software Foundation

관련라이선스 : LGPL2.1, GPL2.0 GPL3.0

라이선스 계열 : GPL

웹사이트 바로가기 : http://www.opensource.org/licenses/lgpl-3.0.html


1-1-1. 라이선스 주요내용


1-1-2. 주요 특징 및 배포시 의무사항


* 주요 특징:   

LGPL 라이브러리를 이용한 응용프로그램의 경우 소스코드 제공없이 배포가능

결합라이브러리 작성의 허용(제5조)

‘배포(distribution)’를 ‘컨베이(convey)’라는 용어로 대체

복제, 수정, 배포행위 등을 포함하는 ‘프로퍼게이트(propagate)' 용어 사용

‘해당 소스(corresponding source)에 인터페이스 정의 파일, 저작물의 서브프로그램과 다른 부분들 사이의 제어 흐름이나 밀접한 데이터 통신 등을 통해 저작물이 특별히 필요로 하는, 동적 링크된 하위 프로그램과 공유 라이브러리의 소스코드를 포함

기술적보호조치의 보호에 관한 법적 권리의 포기(제3조)

사용자제품에 대한 설치정보의 제공. “설치 정보”란 해당 소스의 수정본으로부터 발생한 사용자 제품 내의 저작물의 수정된 버전을 설치하고 실행하기 위한 모든 방법과 절차, 인증키, 기타 필요한 정보를 말함.(제6조)

추가적인 허용사항 또는 제약사항을 부가하는 것을 가능하도록 함(제7조)

차별적인 특허라이선스 계약체결의 금지(제11조)

Affero GPL과 결합하거나 연결하여 하나의 저작물을 만들 수 있도록 허용(제13조)


* 배포시 의무사항:

각 복제본에 저작권 고지와 보증책임이 없음을 명시

LGPL 3.0의 조건 및 제7조의 조건에 관한 내용을 있는 그대로 유지

프로그램을 양도 받는 모든 이들에게 프로그램과 함께 GPL 및 LGPL 라이선스 사본 제공

수정시 수정사실 및 일시를 명시

원본저작물과 파생저작물을 LGPL3.0에 의해 배포

원본저작물 및 파생저작물에 대한 소스코드를 제공하거나, 요청시 제공하겠다는 약정서 제공

사용자제품에 대한 인증키 등 설치정보의 제공

응용프로그램을 배포할 경우, LGPL 라이브러리를 사용하고 있다는 사실을 명시

사용자가 라이브러리를 수정해도 응용프로그램을 사용할 수 있도록 (예를 들어 오브젝트코드 등을 제공하거나 공유라이브러리 방식등을 이용하여) 허용


1-2. GNU General Public License (GPLv2)
자유 소프트웨어 재단(FSF)에서 만든 자유 소프트웨어 라이선스다.
미국의 리처드 스톨만(Richard Stallman)이 GNU-프로젝트로 배포된 프로그램의 라이선스로 사용하기 위해 작성했다.

'① 컴퓨터 프로그램을 어떤 목적으로든지 사용할 수 있다
② 컴퓨터 프로그램의 복사를 언제나 프로그램의 코드와 함께 판매 또는 무료로 배포할 수 있다
③ 컴퓨터 프로그램의 코드를 용도에 따라 결정할 수 있다
④ 변경된 컴퓨터 프로그램 역시 프로그램의 코드와 함께 자유로이 배포할 수 있다'라는 네 가지 조항을 명시하고 있다.


대부분의 소프트웨어에 대한 라이선스는 소프트웨어를 공유하거나 수정할 수 있는 자유를 금지하기 위 고안되었다.
반면에 GNU 일반 공중 라이선스는 자유 소프트웨어를 공유하고 수정할 수 있는 자유를 보장하기 위해 의도되었다.
즉, 소프트웨어가 사용자 모두에게 자유롭게 이용될 수 있도록 하는 것이다.
이 일반 공중 라이선스는 자유 소프트웨어 재단의 소프트웨어 대부분을 비롯하여, 저작자가 이 라이선스의 사용을 지정한 기타 모든 프로그램에 적용된다. (자유 소프트웨어 재단의 소프트웨어 중 일부는 이 라이선스 대신 GNU 라이브러리 일반 공중 라이선스가 적용된다.)
누구나 자신의 프로그램에 이 라이선스를 적용시킬 수 있다.

버전 : 2.0

관리기관 : Free Software Foundation, Inc

관련라이선스 : GPL 3.0, LGPL

라이선스 계열 : GPL

웹사이트 바로가기 : http://www.opensource.org/licenses/gpl-2.0.php


1-2-1. 라이선스 주요내용



1-2-2. 주요 특징 및 배포시 의무사항


* 주요 특징 및 배포시 의무사항

주요 특징:

소스코드는 실행물에 포함된 모든 모듈들의 소스 코드와 이와 관련된 인터페이스 정의 파일 전체, 그리고 실행물의 컴파일과 설치를 제어하는데 사용된 스크립트 전부를 의미

다만, 실행물이 실행되는 운영체제의 주요 부분(컴파일러, 커널 등)과 함께 (소스 코드나 바이너리의 형태로) 일반적으로 배포되는 구성요소들은, 그 구성요소 자체가 실행물에 수반되지 않는 한 배포되는 소스 코드에 포함되지 않아도 무방

서브라이선스를 허용하지 않음. 다만 제6조에 의해 수취인은 자동적으로 라이선스를 취득

법원의 판결, 특허침해 등에 의해 라이선스 조건을 준수할 수 없는 경우, GPL에 의한 배포 불가능(제7조)

 

* 배포시 의무사항:

각 복제본에 적절한 저작권 고지와 보증책임이 없음을 명시

GPL 라이선스를 언급하는 고지사항과 보증책임 관련 고지사항을 원본 그대로 유지

프로그램을 양도 받는 모든 이들에게 프로그램과 함께 GPL 라이선스 사본 제공

파일 수정의 경우 수정사실과 날짜를 파일에 명기

원본저작물과 파생저작물을 GPL 2.0에 의해 배포

원본저작물 및 파생저작물에 대한 소스코드를 제공하거나, 요청시 제공하겠다는 약정서 제공


1-3. Apache License v2


아파치 라이선스는 아파치 웹서버의 배포를 위해 만들어진 라이선스이다.

아파치 재단이나 재단의 프로젝트에 의해서 만들어진 모든 소프트웨어는 현재 Apache License 2.0에 의해 배포되고 있다.

버전 : 2.0

관리기관 : 아파치 소프트웨어 재단

관련라이선스 : Apache-1.1

라이선스 계열 : BSD

웹사이트 바로가기 : http://www.apache.org/licenses/LICENSE-2.0


1-3-1. 라이선스 주요내용



1-3-2. 주요 특징 및 배포시 의무사항


* 주요 특징:

라이센서에게 Contribution 하는 경우 Apache 라이선스를 따름

 

* 배포시 의무사항:

수취인에게 라이선스 사본 제공

수정된 파일에 대해 수정사항을 표시한 안내문구 첨부

저작권, 특허, 상표, attribution에 대한 고지사항을 소스코드 또는 "NOTICE" 파일 등에 포함

최초개발자 등을 위해 보증을 면제하고, 책임을 제한


1-4. MIT License


MIT 라이선스(MIT License)는 미국 매사추세츠 공과대학교(MIT)에서 해당 대학의 소프트웨어 공학도들을 돕기 위해 개발한 라이선스다. MIT 라이선스를 따르는 소프트웨어를 개조한 제품을 반드시 오픈 소스로 배포해야 한다는 규정이 없으며 GNU 일반 공중 라이선스의 엄격함을 피하려는 사용자들에게 인기가 있다. 이 라이선스를 따르는 대표적 소프트웨어로 X 윈도 시스템이 있다.


관리기관 : Massachusetts Institute of Technology

라이선스 계열 : BSD

웹사이트 바로가기 : https://opensource.org/licenses/MIT


1-4-1. 라이선스 주요내용



1-4-2. 주요 특징 및 배포시 의무사항


* 주요 특징:

 

배포시 의무사항:

저작권 안내문구, MIT 라이선스 문구가 모든 복제본에 포함





2. GNU/GPL v3 License


https://www.gnu.org/licenses/gpl-3.0.html


[첨부(Attachments)]

license.txt

license-gnu-v3.zip




3. GNU/GPL v2, v1 License(이전 버전)


https://www.gnu.org/licenses/old-licenses/old-licenses.html#GPL


[첨부(Attachments)]

gnu-license-v2.zip

license-v2.txt




4. Apache License


https://www.apache.org/licenses/LICENSE-2.0


* 업무에 APACHE 라이센스를 적용하는 방법(HOW TO APPLY THE APACHE LICENSE TO YOUR WORK)


일반적으로 LICENSE라는 파일에 Apache 라이선스의 사본을 작업에 포함하고 NOTICE 파일도 포함해야합니다.


작업의 특정 파일에 Apache 라이선스를 적용하려면 다음과 같은 상용구 선언을 첨부하고 괄호 "[]"로 묶인 필드를 고유 한 식별 정보로 바꿉니다.
(괄호를 포함하지 마십시오!) 텍스트는 파일 형식에 적합한 주석 구문으로 묶어야합니다. 또한 타사 아카이브 내에서 쉽게 식별 할 수 있도록 파일 또는 클래스 이름과 목적 설명을 저작권 고지와 동일한 "인쇄 된 페이지"에 포함하는 것이 좋습니다.


Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and 



[첨부(Attachments)]

license-apache2.txt

license-apache2.zip




5. MIT License


https://opensource.org/licenses/MIT


Copyright <YEAR> <COPYRIGHT HOLDER>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


[첨부(Attachments)]

license-mit.zip

license-mit.txt





반응형
728x90
300x250

[컴퓨터 - PC활용] 파일질라(FileZilla) FTP Client/Server(클라이언트/서버)


ftp 클라이언트/서버 프로그램에 대해서 소개하려고 한다.

오픈소스 프로그램으로 널리 국내/해외에서 사용되고 있다.


라이선스(License): GNU/GPL v2

프로젝트 주소: https://filezilla-project.org/






1. 프로젝트 소개


파일질라 프로젝트 사이트에 접속하면 아래의 그림을 볼 수 있다.



그림 1. 파일질라 홈페이지 (2020-09-19)


Download(다운로드)를 클릭한다.



그림 2. 파일질라 홈페이지 (2020-09-19)


Download FileZilla Client를 클릭한다.

(이외에 리눅스, 윈도우 32bit, 맥OS 버전을 지원하고 있다.)




그림 3. 파일질라 홈페이지 (2020-09-19)


FileZilla는 Download를 클릭한다.



그림 4. 라이선스에 관한 것 (2020-09-19)


읽어보면 도움이 될 것으로 보인다.



2. 설치하기


설치 방법은 크게 어렵지 않게 설치할 수 있다.



그림 5. 설치 마법사 (1)


라이선스에 대한 사항이다. 읽어보고 동의한다면 I Agree("동의")를 누른다.



그림 6. 설치 마법사 (2)


기다린다.



그림 7. 설치 마법사 (3)


Next("다음")를 누른다.



그림 8. 설치 마법사 (4)


Next("다음")를 누른다.



그림 9. 설치 마법사 (5)


Next("다음")를 누른다.



그림 10. 설치 마법사 (6)


Next("다음")를 누른다.



그림 11. 설치 마법사 (7)


Decline을 클릭한다.




그림 12. 설치 마법사 (8)


설치 진행 중인 모습이다.

설치가 완료되면, "Next"를 누른다.



그림 13. 설치 마법사 (9)


Start FileZilla now를 체크하고 Finish 버튼을 누르면, 설치 후에 파일질라가 실행된다.

Finish 버튼을 누른다.



3. 실행하기


크게 어렵지 않은 과정으로 파일질라를 사용할 수 있다.



그림 14. 파일질라 실행 모습 (2020-09-19)


처음 접하게 되는 파일질라 실행 환경의 모습이다.




그림 15. 파일질라 사이트 관리자 모습 (2020-09-19)


그림 15의 사이트 관리자에 New site 등의 기능을 통해서 ftp 접속환경을 셋팅할 수 있다.




4. 파일질라 FTP 서버


파일질라 FTP 서버(오픈소스)도 있다.



그림 16. Filezilla Server - 윈도우 버전





참고 자료(Reference)


1. FileZilla - The free FTP solution, https://filezilla-project.org/, Accessed by 2020-09-19, Last Modified 2020-09-19

2. Download FileZilla Client for Windows (64bit), https://filezilla-project.org/download.php?type=client, Accessed by 2020-09-19, Last Modified 2020-09-19

3. Download FileZilla Server for Windows, https://filezilla-project.org/download.php?type=server, Accessed by 2020-09-19, Last Modified 2020-09-19

반응형
728x90
300x250

[컴퓨터 - PC활용] Eclipse에서 git 프로젝트 import하기(가져오기)


Eclipse에서 git 프로젝트를 가져오는 방법에 대해서 소개하려고 한다.

git 프로젝트 등에서 좋은 아이디어 등을 얻을 수도 있고, 개선 작업을 할 수도 있다.

또는 오픈소스를 활용하는 프로젝트를 진행할 수도 있다.

이럴 때 유용하게 프로젝트를 가져오는 방법에 대해서 논하고자 한다.


적용대상: Eclipse 기반의 IDE(STS 4 포함) 





1. 프로젝트 가져오기


File에서 Import를 누른다.



그림 1. 프로젝트 가져오기(1)


Git의 Projects from git을 선택하고 "Next(다음)"을 누른다.



그림 2. 프로젝트 가져오기(2)


Clone URI를 선택하고 "Next"를 누른다.




그림 3. 프로젝트 가져오기(3)


가져오고 싶은 프로젝트의 git 사이트 URL을 찾아야 한다.

프로젝트에서 Code를 클릭한 후 URL 주소를 복사한다.




그림 4. 프로젝트 가져오기(4)


이클립스 화면으로 가서 "Import Projects from Git" 창을 활성화 한다.

그리고 URI에 복사했던 URL주소를 붙여넣는다.

그리고 "Next"를 누른다.





그림 5. 프로젝트 가져오기(5)


특별한 사항이 없다면, "Next"를 누른다.



그림 6. 프로젝트 가져오기(6)


로컬 저장소 경로에 관한 것이다.

원하는 경로가 있다면, Browse를 클릭하여 지정해도 좋다.


설정을 완료하였다면, Next를 누른다.




그림 7. 프로젝트 가져오기(7)


아래의 모습은 프로젝트가 원격 저장소에서 로컬 저장소로 전송되고 있는 모습이다.



그림 8. 프로젝트 가져오기(8)


Import existing Eclipse projects를 클릭하고 Next를 누른다. 



그림 9. 프로젝트 가져오기(9)


프로젝트에 대한 사항을 확인하고, "Finish"를 누른다.




그림 10. 프로젝트 가져오기(10)


아래의 그림 11처럼 프로젝트를 가져온 모습을 확인할 수 있다.




그림 11. 프로젝트 가져오기(11)



반응형
728x90
300x250

[컴퓨터 - PC활용] Eclipse에서 git 설치 및 push하기


Eclipse(Spring Tool Suite 포함)에서 git 기능을 사용하는 방법에 대해서 소개하겠다.

협업 프로젝트, 형상관리 등에 있어서 중요한 역할을 하는 프로그램 중 하나가 git이 아닐까 싶다.


Svn(Sub-Version / 서브버전) 기반의 형상관리는 프로젝트를 지속가능하도록 만들어준다.


적용 대상: Eclipse 기반의 IDE(통합개발환경도구)





1. Install New Software로 git 설치하기


help 메뉴에서 Install New Software를 클릭한다.



그림 1. Eclipse에서 가능한 환경 만들기



그림 2. Latest Eclipse Release 선택 후 git 검색하기(1)


Latest Eclipse Release를 선택하고 git을 검색한다.

git에 관련된 항목을 체크한다.




그림 3. Latest Eclipse Release 선택 후 git 검색하기(2)


선택을 완료했으면, 다음(Next)을 클릭한다.



그림 4. 선택한 항목에 대해서 확인하기


선택 사항을 확인한 후에, 다음(Next)을 클릭한다.




그림 5. 오픈소스 라이선스에 관한 것(Eclipse License)


읽어보고 동의한 후 "Finish"를 누른다.



2. git 작업환경으로 만들기


Window-> Perspective -> Open Perspective -> Other...를 클릭한다.



그림 6. 작업환경 전환



그림 7. Open Perspective


git을 클릭 후 Open을 누르면, Git 작업에 최적화된 화면이 나타나는 것을 확인할 수 있다.




3. github - ssh 생성하기


github 옵션에 보면, ssh 인증키를 입력하는 항목이 있다.


계정(Account)에서 Settings을 클릭하여, "SSH and GPG keys"를 클릭하면 아래 그림을 볼 수 있다.

이걸 등록하지 않고 Push 작업을 수행하면, 허가되지 않아서 작업할 수 없게 된다.



그림 8. SSH-key 등록하기



그림 9. Window->Preference 메뉴


Eclipse의 Egit의 ssh 기능을 활용하여 그림 8의 작업을 진행하도록 하겠다.

Window->Preference를 클릭하여 ssh 생성 기능을 사용할 수도 있다.



그림 10. SSH 기능의 모습


General의 Network Connection의 SSH2를 클릭하면 그림 10의 화면을 볼 수 있다.



그림 11. Key management의 Generate RSA Key 활용하기


Key management를 클릭한 후 Generate RSA Key를 누르면 RSA 암호키가 생성되는 것을 확인할 수 있다.

이 키를 활용하여 github SSH-GPA 인증을 받을 수 있다.



3. Remote 등록하기


github repositories 원격지에 접속할 것이다. 

Remote에서 Create Remote를 클릭한다.



그림 12. Create Remote 클릭하기



그림 13. New Remote


Remote name(리모트 명칭)을 임의로 입력해도 무방하다.

그리고 Create(생성)를 누른다.



그림 14. Configure Push


초기 공급자 셋팅값이 없다면, Change 버튼을 누른다.




그림 15. Select a URI


github에서 Repository URL을 복사 붙여넣기하고 URI 칸에 붙여넣기를 한다.

Authentication 항목에 "이메일주소", "비밀번호"를 입력한다.



그림 16. Configure Push(2)


Save and Push를 누른다.



4. Push 하기


Window -> Show View -> Git Staging을 클릭한다.



그림 17. Window의 Show View 




그림 18. Git Staging 작업창


Unstaged Changes에 올라와 있는 내용을 Staged Changes로 드래그 한다.

그리고 메시지 등 작성을 완료한 후 "Commit and Push..."를 누르면 Push 작업을 수행할 수 있다.




그림 19. Push Branch Master(1)


Preview 버튼을 누른다.



그림 20. Push Branch Master(2)


작성한 내용을 확인한 후 Push를 누른다.




그림 21. 업로드 진행 모습




그림 22. 작업 완료 결과


그림 22와 같은 메시지가 뜨면 정상적으로 작업이 완료된 것이다.

반응형
728x90
300x250

[컴퓨터 - PC활용] 압축프로그램 - 반디집 (프리웨어 / 상용웨어 두 종류)


반디집 프로그램은 라이선스가 무료, 상용 프로그램 두 가지 종류로 구성되는 국산 압축 프로그램이다.

성능이 우수하며, 많이 애용되는 프로그램 중 하나이다.


https://www.bandisoft.com/bandizip/



1. 반디집 프로그램 소개


반디집 프로그램은 압축 파일 등을 만들거나 풀거나 등을 수행할 수 있는 응용 프로그램이다.



그림 1. 반디집 6.13 프로그램(윈도우 10 시연)



그림 2. 라이선스 정책(2020-09-19)


반디집 프로그램은 압축 프로그램 중에서는 정말 착한 프로그램 중 하나로 알려져 있다.


[첨부(Attachments)]

BANDIZIP6-SETUP.EXE

BANDIZIP6-PORTABLE.zip



반응형
728x90
300x250

[JSP] 8. 영속프레임워크 MyBatis를 활용한 CRUD 구현 - JSP와 Oracle(XML 방식)


조금 알기 쉽게 작성하였다.

"영속 프레임워크"라고 보면 된다.

영속 프레임워크라는 것은 DAO 객체에서 데이터베이스 데이터의 처리 기능을 제공하는 프레임워크이다.


대표적인 것: myBatis, Hibernate가 있다.


* 사용되는 언어: JSP / Servlet,
* 데이터베이스: Oracle 12 이상 (Oracle 18g에서 태스트 완료 하였음.)

* 프레임워크: mybatis-3.5.5

[첨부(Attachments)]

mybatis-3.5.5.jar

mybatis-3.5.5(원본).7z



1. 최소한 관련 프레임워크에 대해서 이해해보기


프레임워크의 특징에 대해서 간단하게 작성해보았다.


[특징]


myBatis란 그나마 학습하기 쉽고, 사용방법이 간단함.

초기 셋팅을 조금한 후에 나머지는 SQL명령문과 간단한 자바 소스코드로 구현하여 사용할 수 있음.

(iBatis 프로젝트로 시작해서 현재는 Apache Foundation에서 관리하는 자바 오픈소스 프레임워크)


http://www.mybatis.org


hibernate란 ORM(Object-Relational Mapping) 프레임워크라는 영속 프레임워크로서 자바와 객체와 데이터베이스를 매핑하여 데이터를 처리하므로 엔터프라이즈 환경에 적합한 특징을 가지고 있음.

(배우기 어려움. - 객체 모델링 경험이 요구됨.)


http://hibernate.org 



[생각해보기]


생각을 조금해본다면, 꼭 반드시 웹 프로젝트에만 MyBatis를 활용할 필요가 없음.
일반적인 Swing 프로젝트 연습 등에서도 사용해볼 수도 있겠음.

- 프레임워크 사용하기 전에 고민해야 할 점

1. 기본적으로 제공하는 JDBC 구현에 대해서도 생각해보기

(이유: 자바에서 자체적으로 제공하는 jdbc 구현(예: ResultSet, prepareStatement 등)에 대해서 이해하고 있으면 좋음.)


2. 프레임워크를 사용하는 것이 만능인지, 고민하기

3. SQL Injection 등의 보안 문제에 대해서 생각하기

   (프레임워크를 사용하면, SQL Injection 문제는 간단하게 해소된다.)


결론은 좋긴 좋다. 프레임워크!!!


[코드 비교하기] 


 Mybatis 사용전 코드 방식

 Mybatis 사용후 코드 방식

 

public Entity selectFAQList(UserConnection conn, Entity param)  throws SQLException 

{

    UserStatement stmt = null; //stmt 초기값 선언
    ResultSet rslt = null; //rslt 초기값 선언
    StringBuffer sql = new StringBuffer();
    sql.append("\n SELECT *"); //
    sql.append("\n FROM"); //코드 추가
    sql.append("\n TABLE1");
    stmt = conn.prepareStatement(sql.toString());
    rslt = stmt.executeQuery();
    Entity _DATA = new Entity();
    _DATA.put("_DATA", EntityUtil.ResultSetToClobList(rslt));
    return _DATA;
}

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

  <ENTITY id="table.getTable1List" type="SQL" return="List">
    <![CDATA[
        SELECT *
            FROM
            TABLE1
    ]]>
    <PARAMS>    
    </PARAMS>
  </ENTITY>

// xml로 빼내서 쿼리문을 작성하면 내부적 처리는 Mybatis에서 // 모두 처리해주므로
// Entity ID값을 java에서 호출만하면 된다.




2. 초기 환경설정 셋팅하기


시중 블로그를 다수 검색하고, 교제등을 참고하였으나 왕초보 수준으로 알기 쉽게 적용하는 방법은 나오지 않은 거 같아서 작성해보려고 한다.



그림 1. 초기 셋팅해줘야 하는 프로젝트 파일


최소 못해도 기본적으로 갖춰줘야 하는 소스 파일들을 몇 개 찝어보았다.


"Address_****.파일확장자명"으로 구성된 파일은 사용자에 따라 임의적으로 구성해봐도 무방하다.


ojdbc8_g.jar은 어디에 있는가?

오라클 설치파일이 있는 폴더에 보면 jdbc 폴더가 있는데 해당 위치에 있다.



그림 2. 오라클 설치 파일이 있는 폴더



그림 3. jdbc 폴더에 있는 readme.txt



그림 4. jdbc/lib 폴더 내에 있음.



[첨부(Attachments)]

oracle12lib.z01

oracle12lib.z02

oracle12lib.zip


(참고로 반디집을 통해서 압축을 풀 수 있음.)


소스코드를 통해서 살펴보는 것이 조금 빠를 수 있다고 주장해 본다.



3. 데이터베이스 설계하기


예제 데이터베이스를 설계하도록 하겠다.


tableName(테이블명): addressbook


 키

 항목명

 속성 

 PK(기본키)

num

인덱스(ID)

 

name

nvarchar

 

address

nvarchar

 

birthdate

date




그림 5. 테이블 만들기(오라클)


그림 5는 SQL Developer를 통해서 테이블을 생성한 모습이다. 

원래 복잡하게 쿼리라는 것을 통해서 작성해야 하는데, 세상이 시간이 지나다보니 편리해진 것도 있다고 주장한다.


CREATE TABLE "C##USER"."ADDRESSBOOK" 

   ( "NUM" NUMBER(*,0) NOT NULL ENABLE, 

"NAME" NVARCHAR2(20), 

"ADDRESS" NVARCHAR2(100), 

"BIRTHDATE" DATE, 

CONSTRAINT "ADDRESSBOOK_PK" PRIMARY KEY ("NUM")



  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 

  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

...............................

(중략)


ALTER TRIGGER "C##USER"."ADDRESSBOOK_TRG" ENABLE;



그림 6. SQL문으로 Create Table 구성하기


그림 6은 흔히 CRUD(Create Read Update Delete)에서의 Create를 의미하는 작업이다.

예를 들면 원래는 이렇게 복잡하게 작성해야 하는데 지금은 훨씬 편하게 만들 수 있다고 보면 된다.




4. 프로젝트 구성하기 - 과정 소개 (소스코드를 통해서 살펴보는 프로젝트 구성)


1단계 설계

SQL - 테이블 작성


2단계 기본 환경설정 작성(준비)

web.xml을 먼저 작성한다.              (암기가 되는 부분인가? 불가능. 이거 외우는 거 불가능.)

mybatis-config.xml                     (암기가 되는 부분인가? 불가능. 이거 외우는 거 불가능.)

SqlMapSessionFactory.java           (암기가 되는 부분인가? 불가능. 이거 외우는 거 불가능.)

AddressDto.java 

addressMapper.xml                    (암기가 되는 부분인가? 불가능. 이거 외우는 거 불가능.)


3단계(간단한 CRUD 템플릿 준비)

addressDao.java                       (암기가 되는 부분인가? 코드는 간단하나 2단계 셋팅이 안 되어 있으면 의미 없음.)


4단계(인터페이스 설계 및 구현부 작성)

address.java 

addressImpl.java


5단계(뷰 페이지 구성하기)

web.xml (수정 - 작업)

servlet 페이지로 진행 또는 jsp파일로 진행해도 무방




5. 소스코드


소스코드는 순서대로 소개하겠다.


(2단계 - 소스코드)


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


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

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">


<display-name>edu-mybatis</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<!-- Board List -->

<servlet>

<servlet-name>boardList</servlet-name>

<servlet-class>com.edu.view.BoardListServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>boardList</servlet-name>

<url-pattern>/board/list.do</url-pattern>

</servlet-mapping>

<!-- Board Insert -->

<servlet>

<servlet-name>boardInsert</servlet-name>

<servlet-class>com.edu.view.BoardInsertServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>boardInsert</servlet-name>

<url-pattern>/board/insert.do</url-pattern>

</servlet-mapping>

<!-- Board Delete -->

<servlet>

<servlet-name>boardDelete</servlet-name>

<servlet-class>com.edu.view.BoardDeleteServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>boardDelete</servlet-name>

<url-pattern>/board/delete.do</url-pattern>

</servlet-mapping>

</web-app>


* 파일명: web.xml


[첨부(Attachments)]

web.zip



예를 들면, 이런 형태로 구성해서 사용할 수 있다.

크게 어렵게 작성하진 않았으니 참고하면 도움이 될 것 같다.


<?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">


<configuration>


<environments default="development">

    <environment id="development">

      <transactionManager type="JDBC"/>

      <dataSource type="POOLED">

        <property name="driver" value="oracle.jdbc.driver.OracleDriver" />

        <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>

        <property name="username" value="사용자 계정"/>

        <property name="password" value="비밀번호"/>

      </dataSource>

    </environment>

  </environments>


  <mappers>

    <mapper resource="com/edu/db/addressMapper.xml"/>              // 리소스 증가시 추가해서 사용해보기

  </mappers>


</configuration>


* 파일명: mybatis-config.xml



[첨부(Attachments)]

mybatis-config.zip



package com.edu.db;


import java.io.IOException;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;


public class SqlMapSessionFactory {

public static SqlSessionFactory ssf;


    static{


        String resource = "com/edu/db/mybatis-config.xml";

        InputStream inputStream = null;


        try {

            inputStream = Resources.getResourceAsStream(resource);

        } catch (IOException e) {

            e.printStackTrace();

        }


        ssf = new SqlSessionFactoryBuilder().build(inputStream);


    }

    

    public static SqlSessionFactory getSqlSessionFactory(){

        return ssf;

    }

    

}



* 파일명: SqlMapSessionFactory.java


[첨부(Attachments)]

SqlMapSessionFactory.zip


package com.edu.db;


import java.sql.Timestamp;


public class AddressDto {

private int num;

private String name;

private String address;

private Timestamp birthdate;

public int getNum() {

return num;

}

public void setNum(int num) {

this.num = num;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public Timestamp getBirthdate() {

return birthdate;

}

public void setBirthdate(Timestamp birthdate) {

this.birthdate = birthdate;

}

}



* 파일명: AddressDto.java


[첨부(Attachments)]

AddressDto.zip


<?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">


<mapper namespace="com.edu.db.mappers.addressMapper">

<select id="allAddress" resultType="com.edu.db.AddressDto">

select * from addressbook

</select>


<select id="selectAddress" parameterType="Integer" resultType="com.edu.db.AddressDto">

select NUM, NAME, ADDRESS, BIRTHDATE

from addressbook

  where num=#{num}

</select>


<insert id="insertAddress" parameterType="com.edu.db.AddressDto">

insert into

addressbook(NAME, ADDRESS, BIRTHDATE)

values

(#{name},#{address},#{birthdate})

</insert>


<delete id="deleteAddress" parameterType="Integer">

DELETE FROM AddressBook

WHERE NUM = #{num}

</delete>

<update id="updateAddress" parameterType="com.edu.db.AddressDto" >

update addressbook

set birthdate = #{birthdate}, name = #{name}, address =#{address}

where num = #{num}

</update>

</mapper>


* 파일명: addressMappper.xml


[첨부(Attachments)]

addressMapper.zip


(3단계 - 소스코드)


package com.edu.db;

import java.io.*;

import java.util.*;

import org.apache.ibatis.io.*;

import org.apache.ibatis.session.*;


public class AddressDao {

private AddressDao() {}

    private static AddressDao dao;


    public static AddressDao getInstance(){


        if(dao == null){

            dao = new AddressDao();

        }


        return dao;

    }

    

    // SQL 세션 열기

    SqlSessionFactory factory = SqlMapSessionFactory.getSqlSessionFactory();


    public AddressDto selectAddress(Integer num) {


        SqlSession session = factory.openSession();


        AddressDto addressDTO = session.selectOne("com.edu.db.mappers.addressMapper.selectAddress", num);

        session.close();


        return addressDTO;


    }


 


    public int updateAddress(AddressDto addressDTO) {


        SqlSession session = factory.openSession();


        int update = session.update("com.edu.db.mappers.addressMapper.updateAddress", addressDTO);


        // update나 delete의 경우 반드시 커밋 필요.

        // session.commit();을 해주거나 factory.openSession(true);로 설정하면 자동 커밋된다.

        session.commit(); 

        session.close();


        return update;


    }

    

    

    public int insertAddress(AddressDto addressDTO) {

   

    SqlSession session = factory.openSession();

    int insert = session.insert("com.edu.db.mappers.addressMapper.insertAddress", addressDTO);

   

    session.commit();

    session.close();

   

    return insert;

   

    }

    

    public int deleteAddress(Integer num) {

   

    SqlSession session = factory.openSession();

    int delete = session.delete("com.edu.db.mappers.addressMapper.deleteAddress", num);

   

    session.commit();

    session.close();

   

    return delete;

    }


}


* 파일명: AddressDao.java


특징: Singleton 패턴을 적용함.


[첨부(Attachments)]

AddressDao.zip



(4단계 - 소스코드)


package com.edu.db;


public interface Address {


public AddressDto getAddress(Integer num);

public int updateAddress(AddressDto addressDTO);

public int insertAddress(AddressDto addressDTO); 

public int deleteAddress(Integer num);

}


* 파일명: Address.java


특징: Interface 파일


[첨부(Attachments)]

Address.zip


package com.edu.db;


public class AddressImpl implements Address {


AddressDao dao = AddressDao.getInstance();

@Override

public AddressDto getAddress(Integer num) {

return dao.selectAddress(num);

}


@Override

public int updateAddress(AddressDto addressDTO) {

return dao.updateAddress(addressDTO);

}

@Override

public int insertAddress(AddressDto addressDTO) {

return dao.insertAddress(addressDTO);

}

@Override

public int deleteAddress(Integer num) {

return dao.deleteAddress(num);

}


}


* 파일명: AddressImpl.java


특징: Address 인터페이스 구현파일


[첨부(Attachments)]

AddressImpl.zip


(5단계 - Servlet 파일 예)


package com.edu.view;


import java.io.IOException;

import java.io.PrintWriter;

import java.sql.Timestamp;

import java.text.SimpleDateFormat;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.edu.db.Address;

import com.edu.db.AddressDto;

import com.edu.db.AddressImpl;


/**

 * Servlet implementation class boardListServlet

 */

public class BoardListServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BoardListServlet() {

        super();

    }


/**

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

*/

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

res.setContentType("text/html;charset=UTF-8");

PrintWriter out = res.getWriter();

out.print("<br/>");

AddressImpl address = new AddressImpl();

AddressDto addressDto = address.getAddress(1);

out.println("<html><head><title>CRUD - List2</title></head>");

out.println("<body><h2>MyBatis - List</h2>");

SimpleDateFormat format1 = new SimpleDateFormat ( "yyyy-MM-dd" );

String birthdate = format1.format(addressDto.getBirthdate());

out.print(addressDto.getNum() + "/" + addressDto.getName() + "/");

out.print(addressDto.getAddress() + "/" + birthdate);

out.print("<br/>");

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

out.close();

}

/**

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

*/

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

doGet(req, res);

}


}



* 파일명: boardListServlet.java


어노테이션으로 맵핑하지 않고, web.xml에 URL 맵핑하였음.


[첨부(Attachments)]

BoardListServlet.zip


package com.edu.view;


import java.io.IOException;

import java.io.PrintWriter;

import java.sql.Timestamp;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.edu.db.Address;

import com.edu.db.AddressDto;

import com.edu.db.AddressImpl;


/**

 * Servlet implementation class boardInsertServlet

 */

public class BoardInsertServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BoardInsertServlet() {

        super();

    }


/**

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

*/

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

res.setContentType("text/html;charset=UTF-8");

PrintWriter out = res.getWriter();

out.print("<br/>");

AddressImpl address = new AddressImpl();

AddressDto dbNode = new AddressDto(); 

dbNode.setName("도도" + serialVersionUID);

dbNode.setAddress("행복시 행복동");

// 버그1: new Date() 사용안됨. (2020을 3920으로 인식함.) 

// 버그2: new Timestamp() 사용안됨. (2020을 3920으로 인식함.)

String userDate = "2020-02-01";

java.sql.Timestamp sqlDate = java.sql.Timestamp.valueOf(userDate);

dbNode.setBirthdate(sqlDate);

int result = address.insertAddress(dbNode);

AddressDto addressDto = address.getAddress(1);

out.println("<html><head><title>CRUD - Insert</title></head>");

out.println("<body><h2>MyBatis - Insert</h2>");

out.print("<br/>");

out.print("등록여부:" + result + "</br>");

out.print("<br/>");

out.print(addressDto.getNum() + "/" + addressDto.getName() + "/");

out.print(addressDto.getAddress() + "/" + addressDto.getBirthdate());

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

out.close();

}

/**

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

*/

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

doGet(req, res);

}


}


* 파일명: boardInsertServlet.java


[첨부(Attachments)]

BoardInsertServlet.zip



package com.edu.view;


import java.io.IOException;

import java.io.PrintWriter;

import java.sql.Timestamp;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.edu.db.Address;

import com.edu.db.AddressDto;

import com.edu.db.AddressImpl;


/**

 * Servlet implementation class boardInsertServlet

 */

public class BoardDeleteServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BoardDeleteServlet() {

        super();

    }


/**

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

*/

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

res.setContentType("text/html;charset=UTF-8");

PrintWriter out = res.getWriter();

out.print("<br/>");

AddressImpl address = new AddressImpl();

int result = address.deleteAddress(5);

AddressDto addressDto = address.getAddress(5);

out.println("<html><head><title>CRUD - Delete</title></head>");

out.println("<body><h2>MyBatis - Delete</h2>");

out.print("<br/>");

out.print("삭제여부:" + result + "</br>");

out.print("<br/>");

if ( addressDto != null ) {

out.print(addressDto.getNum() + "/" + addressDto.getName() + "/");

out.print(addressDto.getAddress() + "/" + addressDto.getBirthdate());

}

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

out.close();

}


/**

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

*/

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

doGet(req, res);

}


}



* 파일명: BoardDeleteServlet.java


[첨부(Attachments)]

BoardDeleteServlet.zip



package com.edu.view;


import java.io.IOException;

import java.io.PrintWriter;

import java.sql.Timestamp;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.edu.db.AddressDto;

import com.edu.db.AddressImpl;


@WebServlet("/board/update.do")

public class BoardUpdateServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BoardUpdateServlet() {

        super();

    }


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

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

res.setContentType("text/html;charset=UTF-8");

PrintWriter out = res.getWriter();

out.print("<br/>");

AddressImpl address = new AddressImpl();

AddressDto dbNode = new AddressDto();

dbNode.setNum(3);

dbNode.setName("도도수정" + serialVersionUID);

dbNode.setAddress("행복시 행복동");


// 버그1: new Date() 사용안됨. (2020을 3920으로 인식함.) 

// 버그2: new Timestamp() 사용안됨. (2020을 3920으로 인식함.)

String userDate = "2020-07-01";

java.sql.Timestamp sqlDate = java.sql.Timestamp.valueOf(userDate);

dbNode.setBirthdate(sqlDate);

int result = address.updateAddress(dbNode);

AddressDto addressDto = address.getAddress(3);

out.println("<html><head><title>CRUD - Update</title></head>");

out.println("<body><h2>MyBatis - Update</h2>");

out.print("<br/>");

out.print("수정여부:" + result + "</br>");

out.print("<br/>");

out.print(addressDto.getNum() + "/" + addressDto.getName() + "/");

out.print(addressDto.getAddress() + "/" + addressDto.getBirthdate());

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

out.close();

}


/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

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

doGet(req, res);

}


}



* 파일명: BoardUpdateServlet.java


특징: web.xml으로 맵핑하지 않고, @WebServlet으로 어노테이션을 사용하여 매핑처리함.


[첨부(Attachments)]

BoardUpdateServlet.zip




6. 맺음글


순수한 JSP 기반의 MyBatis 프레임워크 사용방법에 대해서 소개해보았다.

많은 도움이 되었으면 좋겠다.


1. [JSP] 19. MyBatis-3.5.5 와 Maven / Servlet 연동하기 (Oracle 19g) - Java 방식, 2020-10-01

https://yyman.tistory.com/1434



[참고 자료(Reference)]


1. [Java, OpenJDK] Timestamp 형식 변환, https://infotake.tistory.com/16, Accessed by 2020-09-18, Last Modified 2018-09-13.

-> 참고 이유: Timestamp 명령 사용방법 참고함.


2. 내가 그리는 세상  DB(mysql)에 timestamp로 저장된 값 java에서 불러오기_getTimestamp(), https://yoonka.tistory.com/450, Accessed by 2020-09-18, Last Modified 2013-10-28.


3. [JSP] Mybatis 사용하기  또리야 개발하자, https://ddoriya.tistory.com/entry/JSP-Mybatis-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0, Accessed by 2020-09-17, Last Modified 2014-11-18.

-> 추천(60점 이상): 이 사이트의 글만 가지고 따라하면, 완벽하게 동작이 되진 않음. 몇 가지 보충을 해줘야 해서 추가적으로 검색하였음.
그래도 순수한 MyBatis 원리에 대해서 많은 영감을 얻었음.


4. Oracle와 mybatis 연동 실습, https://dlgkstjq623.tistory.com/228, Accessed by 2020-09-18, Last Modified 2019-06-05.

-> 추천(40점 이상): 이 사이트의 글을 이해하려면, Spring Framework 지식과 JSTL 지식이 있어야 함.

   기본적인 흐름 정도 파악하는데 참고하였음. (이론적인 느낌을 얻었음.)


5. MyBatis – 마이바티스 3 | 소개, https://mybatis.org/mybatis-3/ko/index.html, Accessed by 2020-09-18, Last Modified 2020-06-05.

-> 추천(20점 이상): 설명서가 조금 어렵게 되어 있음. 셋팅 파일을 가지고 셋팅한 후 설명서를 참고하면 도움이 될 수도 있음.


6. 4. Spring Boot Oracle DB 연동(JSP, MyBatis), https://dotheright.tistory.com/173, Accessed by 2020-09-18, Last Modified 2020-07-15.

-> 삽질하여 실패와 탐구 등의 횟수 기록이 담겨져 있음. ("삽질을 하게 된다.??" 이런 느낌을 보여줌.)

-> Spring Framework 기반으로 만든 소스코드를 소개하고 있음. (이 게시글 작성에 있어서 크게 영향을 주지 못함.)


7. [JSP] JSP에 MyBatis 연결하기, https://yuja-kong.tistory.com/8, Accessed by 2020-09-18, Last Modified 2018-04-17.

-> 추천(50점 이상): 순수한 JSP와 MyBatis 연결에 대해서 소개하고 있는데, 이 글을 작성할 수 있는 가능성을 만들어 줌.


8. JSP 서블릿 한글 세팅(한글 깨짐 해결 하기), https://developsd.tistory.com/100, Accessed by 2020-09-18, Last Modified 2019-05-18.

-> 추천(20점): 오라클DB(이하 "UTF-8 셋팅한 오라클")로 데이터를 불러오려고 했을 때, ?????라고 한글을 인식하지 못했음.

   간단한 명령어 하나로 해결하는 데 도움을 받았음. (가끔은 쉬운 게 어렵고, 어려운 게 쉬울 때도 있다는 생각이 듬.)


1. 파일의 인코딩 속성을 "UTF-8"으로 변경

2. response.setContentType("text/html;charset=UTF-8");


반응형
728x90
300x250

[Spring-Framework] 2. Eclipse의 UTF-8 프로젝트로 환경설정하기


Eclipse의 UTF-8 프로젝트로 환경설정하는 방법에 대해 소개하겠다.


적용 대상: Eclipse IDE 기반의 프로그램 (사용가능) // 웹 프로젝트의 예



- 문자 집합(Character Set): 사람이 사용하는 문자를 컴퓨터가 이해하는 기호로 표현하기 위해 문자를 각 코드(숫자)에 매칭 시킨 것


  컴퓨터에서 문자를 처리하려면 인코딩, 디코딩 과정이 필요하다.
  (예: 컴퓨터라는 게 아날로그, 디지털 이런 형태가 있다고 하면 흔히 1,0로 구성되어 있기 때문이다. - 쉽게 이해를 돕기 위해서 작성함.)

- 인코딩(Encoding)/부호화: 각 문자를 특정 기호로 변환.

  ex) 유니코드를 UTF-8로 인코딩


- 디코딩(Decoding)/복호화: 변환된 기호를 다시 문자로 변환


웹에서는 문자열 처리가 무척 중요하다고 할 수 있다.

Euc-kr로 했다가 UTF-8로 변경하면 문자가 깨져버리는 현상이 발생할 수 있다. (이유: 문자 집합이 다르기 때문)


1. Window의 Preferences 변경 


Window의 Preferences를 클릭한다.



그림 1. Preferences 클릭하기




그림 2. Encoding 검색하기 - Eclipse Preference


General -> Workspace -> Text file encoding -> Other: UTF-8


Web -> CSS Files -> UTF-8로 변경

Web -> HTML Files -> UTF-8로 변경

Web -> Jsp Files -> UTF-8로 변경



그림 3. Css Files -> 인코딩 Unicode(UTF-8)로 변경하기



그림 4. HTML Files 인코딩 형식 바꾸기



그림 5. JSP Files 인코딩 형식 바꾸기

반응형
728x90
300x250

[Spring-Framework] 1. 간단한 소개, STS 4 설치와 실행


오랜만에 글을 작성한다.

스프링 프레임워크에 대해서 간단하게 소개하려고 한다.

Java 기반으로 만든 프레임워크라고 이해하면 되겠다.

과거의 전자정부 프레임워크의 기반이 되는 원래 프레임워크는 Spring Framework Project라고 보면 되겠다.


https://egovframe.go.kr/   (이 게시글에서는 기억할 필요가 없음. 초간단하게 작성하기 위함)

http://spring.io


기본적인 셋팅은 간단하다고 보면 된다.

주로 어디에 사용되는 프레임워크냐면, 국내에서는 웹 개발 프로젝트에 많이 사용되는 것으로 알려져 있다.


물론 순수하게 jsp model1기반으로 작성된 웹 페이지도 있다.




[1. Spring Framework 사이트에서 프로젝트 내려받기]


https://spring.io/tools



그림 1. Spring Tools 4 for Eclipse 사이트(2020-09-15)


Projects에서 Development Tools의 Spring Tools 4를 클릭한다.


그림 2. Spring Tools 4 for Eclipse 사이트(2020-09-15)


버전은 크게 리눅스(Linux 64-BIT), MACOS 64-BIT, 윈도우 64비트(Windows 64bit) 버전으로 3가지로 구성된다.

운영체제에 맞는 걸로 내려받으면 된다.



2. 압축 풀기


spring-tool-suite-4-4.7.2.RELEASE-e4.16.0-win32.win32.x86_64.self-extracting.zip을 압축풀면 내부 폴더에 contents.zip이라는 파일이 있다.

이 파일도 압축을 풀어준다.



그림 3. 프로그램 설치 완료


이렇게 되어있으면 설치는 완료된 것이라고 보면 되겠다.



4. 프로그램 실행


Spring Tools Suites는 SpringToolSuite4.exe 파일을 실행시키면 된다.



그림 4. SpringToolSuite4 - 위치 찾기


IDE 사용자체를 놓고 본다면, Eclipse 기반이므로 친숙하게 적응할 수 있다.
(MVC패턴, 프레임워크 사용방법 등 생략하고 IDE만 놓고 보면)



그림 5. SpringToolSuites 4-4.7.2 (2020-09-15)


신 버전과 이전 버전의 차이점
신 버전에서는 Legacy Project 등을 사용하려면, Help->Eclipse MarketPlace에서 STS를 검색하여 Add-On을 설치해야 한다.




5. MarketPlace의 STS 검색 후 Add-On 설치하기


Spring Tools 3 Add-On for Spring Tools 4 3.9.14.CI를 찾으면 된다. (Legacy Project 등 이전 버전의 부가기능을 사용하고자 할 때)



그림 6. Eclipse Marketplaces의 모습(2020-09-15)


"Install"을 클릭한다.



그림 7. Install 모습


Confirm을 눌러서 다음 과정을 진행한다.



그림 8. 라이선스에 관한 것


오픈소스 라이선스에 관한 것이다. I accept the terms of the.....을 체크하고 Finish를 누른다.



그림 9. 설치중 모습(2020-09-15)


기다리면 된다.



그림 10. Restart Now 누르기 전 모습 - Eclipse(STS)


Restart Now를 누르면 STS 프로그램이 다시 시작된다.



6. Spring Project -> 새 프로젝트 확인해보기


이전 "STS3"버전에서 사용했던 부가 기능이 존재하는지 확인할 수 있다.



그림 11. File -> New -> Project 모습


File -> New -> Other를 클릭한다.



그림 12. Spring 프로젝트 내에 이전의 부가 기능


STS3 하위 버전을 설치하지 않아도 부가 기능 추가로 다시 활용할 수도 있다.

반응형

+ Recent posts