막막하기만 했던 어제 주어진 과제

오늘 이어서 하는 날이다.


오늘내로 끝낼 수 있을까?


그렇게 불안불안하게 시작된 오늘


Dom4j..?

Xpath..?


뭔가 막 찾아져서

이렇게 하면 될거 같은데 안되고

저렇게 하니까 되기도 하고


중간중간 차장님과 동기의 도움도 받고!


내맘같지 않았던

내가 만든 자바 프로젝트는

어느순간 채워지지 않을 줄 알았는데

채워져있다.


그렇게 끝났다.


오늘 작업한 건 나또한 구글링을 했기에

내 방식대로 작업한 걸 

이번 주말에 포스팅해야겠다.


내일만 가면 다시 주말~

어느순간 주말을 기다리는 직장인이 되었다.

다음주부터는 정상적인 5일 근무의 첫 시작


이대로라면

잘 할 수 있겠지?



4일의 휴식이 끝나고


아침에는 하는 일 없이 있다가

점심 먹은 이후 주어진 과제


오랜만에 자바였다..


어디서부터 시작해야 하는지

무엇을 해야하는 건지

전혀 감도 안 오고..


시작은 했지만

내가 하고 있는 게 맞는 건지

모르겠다.


언제까지나 도움만 받을 수도 없기에

너무 막막한 나머지 시작을 어떻게 해야하는 건지만


그리고 내가 하고 있는 게 맞는 건지 확신만이라도..


그래도 나름 확신은 갖고 퇴근 할 수 있었다.

ActivePerl 다운로드

https://www.activestate.com/activeperl 에서 다운로드한다.


Download Now를 클릭한다


Download ActivePerl 5.24.2 for Windows (64-bit, x64)를 클릭하여 다운로드한다.


Install 순서

Next 버튼을 클릭한다.


I accept the terms in the License Agreement에 체크 표시를 하고 Next 버튼을 클릭한다.


Location 위치에 ActivePerl 폴더가 만들어진다.

Next 버튼을 클릭한다.


Add Perl to the PATH environment variable은 환경 변수에 Perl의 경로를 추가한다.

Create Perl file extension association은 Perl 파일(.pl)의 연결을 설정한다.

Next 버튼을 클릭한다.


Install 버튼을 클릭하면 설치가 시작된다.

Finish 버튼을 클릭하면 ActivePerl 설치가 완료된다.

'개발자 > Perl' 카테고리의 다른 글

Perl이 보이는 그림책 - Perl 인터프리터 설치하기  (0) 2018.10.09

어디까지 할 수 있을까?

어제 주신 과제를 끝낼 수 없을거라 판단했지만..

어떻게든 끝났다.. 정말 어떻게든..


부장님과 동기의 도움을 받아 끝낸 이번 과제..

이번 과제를 통해 무엇을 공부해야 하는 지 알아서 좋았다.


이제 다음달이면 프로젝트 투입이라는데..


걱정이 앞서지만 최대한 야근하지 않기 위해서라도

지금 준비할 수 있을 때 준비할 거를 다 준비해야겠다.


동기와 달리 짧은 기간 안에 숙지해야 되는 지라 부담도 되지만

그만큼 도와주시기에 걱정은 안 해도 되는 것 같다.


그래도 최대한 민폐끼치지 않기 위해 혼자 스스로 해결할 수 있으려고 노력 중!

부장님이 대부분 탈락시키고 나와 동기를 처음으로 뽑았다고 해서

정말 잘해야겠다라는 생각도 들고.. 그치만 너무 급하지 않게!


제 시간 안에만 하면 된다

숙지하는 건 천천히!



..


퇴근 후 오랜만에 만난 학원 친구들!

왠지 학원 끝나고 모인 것 같은 느낌을 받아서

신기하기도 하고 정말 계속 오래갔으면 하는 사람들이다.


이 친구들 이전에 만났던 사람들은

대부분이.. 아니지 중학교 때 친구들을 제외하고는

연락하는 사람이 한 명도 없다.


언제나 무엇을 위해 만났던 

한 자리에 모여서 만났던 사람들치고

끝까지 오래간 사람들이 없었다. 


그 기간동안 친해지려고 노력한 적도 없고

그것에 대한 필요성을 못 느꼈었다.


그러나 이번에는 다르다.


그냥 계속 친하게 지냈으면 좋겠다.

같은 길을 가는 사람으로써

앞으로 인생을 살면서 

이렇게 친해질 수 있는 사람들을

또 만나는 기회는 흔치 않을 테니까


사람은 혼자 살다 혼자 죽는다고 하지만

그러기에는 너무 삭막하기에 인간관계가 필요한 것 같다.


언제나 혼자있던 내게 다가온 사람들이기에

모두 원하는 대로 목표 이루면서 잘 되었으면 좋겠다.


그래야 만나도 서로가 즐겁기에~~~

  1. 2018.10.06 20:49

    비밀댓글입니다

하루종일 어제 주신 과제를 하기 위해 끙끙..

영어로 되어 있는 책이라 멘탈이 나갔지만;;

계속 보다보니 자세한 건 아직 모르지만

전체적인 구조는 보이기 시작한다.


동기의 도움을 받아서 끝낸 첫번째 과제..

그러나


다음달이면 첫 프로젝트 투입..

그래서 난 어쩔 수 없이 빠른 기간 내에 숙지해야한다 ㅠ


퇴근 하기 30분 전

목요일 과제를 받고 나니 

머리가 멍해진다..


해야할 공부는 많고

시간은 부족하고


자발적으로 야근을 조금 하고 왔지만

턱없이 부족한 실력으로 내가 과연 할 수 있을까?


두려운 마음이 앞서서


그치만 앞전 다른 회사들과 달리

먼저 도망치고 싶지 않다


너무 어렵지만 자꾸만 다뤄보고 싶은 이 제품을 

건드려볼 수 있게 된 것이기에

이 기회를 놓치고 싶지 않다.


나만 그런거 아니라고 위로를 받아가며

다만 조금 늦게 시작하기도 했고

나이기에 좀더 늦을 뿐..


조급해 하지 않고

하나씩 해나가다보면

언젠가 다 하지 않을까?



또 다시 시작된 첫 출근

10시 출근이지만

신입사원이니 9시라 생각하고 출근을 했다


긴장, 설렘, 두려움

머리는 어질어질 두통이 심하다


그렇게 시작된 오늘은

걱정과 달리 무사히 끝났다


오전에는 아무것도 하는 것 없이 가만히..

그러다 회사 제품에 대한 강의를 듣고


본격 개인스터디 시작!

온통 영어로 되어 있는 책과의 전쟁이 시작되었다


앞으로 내가 공부할 것

- TeamSite

- XSLT

- XML

- Perl

- JavaScript

- 영어


호스팅 서버 준비하기

HTML로 웹 사이트를 만들고 그 내용을 다른 사람들이 볼 수 있도록 하려면 HTML로 만든 웹 문서를 모두 서버 컴퓨터로 옮겨야 한다. 개인은 웹 서버를 마련하기 어렵기 때문에 서버의 일부 공간을 매달 또는 몇 년마다 일정 금액을 내고 사용하는 서비스를 이용한다. 이것을 '서버 호스팅 서비스' 또는 '웹 호스팅 서비스'라고 한다. 개인 웹 사이트 운영자들은 대부분 호스팅 서비스를 이용한다. 


* 웹 호스팅 서버의 종류

호스팅 서비스는 어떤 서버를 이용하느냐에 따라 윈도우 서버 호스팅과 리눅스 서버 호스팅으로 나뉘는데 윈도우 서버에서는 ASP나 ASP.NET 프로그래밍 언어를 사용하고 리눅스 서버에서는 PHP 프로그래밍 언어를 사용하며 좀 더 대중적이고 저렴하다. 이외에 클라우드 서버를 사용한 '클라우드 서버 호스팅'도 최근 많이 사용한다.


닷홈에 무료 호스팅 서비스 신청하기

닷홈의 호스팅 서비스는 1년 간 무료로 사용할 수 있으며 1년이 지나면 연장 신청을 해야 무료로 계속 사용할 수 있다.


1. 닷홈 회원 가입하기

dothome.co.kr을 입력하여 무료 호스팅을 제공하는 닷홈 사이트로 이동한다. 로그인 창 바로 아래에 있는 회원가입을 클릭한다. 필요한 정보를 입력하고 회원 가입한다. 입력한 이메일 주소를 통해 인증까지 마쳐야 호스팅을 신청할 수 있다.


2. 무료 호스팅 신청하기

웹 호스팅 메뉴 중 무료 호스팅을 선택한다.


3. 무료 호스팅에도 여러 가지 서비스가 있는데 그 중 무료 호스팅에서 공간만 설치를 선택하고 신청하기를 클릭한다.


4. 무료 호스팅 신청하기를 클릭한다. FTP 아이디는 다른 것으로 바꿀 수도 있지만 FTP 접속 주소와 아이디, 비밀번호는 반드시 기억해 두어야 한다. '무료계정 사용정책 동의'에 체크한 후 확인 단어를 입력하고 인증 코드 발송을 눌러 다시 한 번 인증 코드를 입력한다. 그리고 신청하기를 누른다.


FTP 프로그램 설치하기

사용자 컴퓨터에서 작성한 웹 문서와 파일을 서버로 옮기는 것을 업로드(upload), 서버에 있는 파일들을 사용자 컴퓨터로 옮기는 것을 다운로드(download)라고 하고 서버와 클라이언트 간에 파일을 주고 받을 수 있게 해주는 파일 전송 프로토콜(File Transfer Protocol)을 약자로 FTP라고 한다.


FTP 프로그램 FileZilla 설치하고 서버에 접속하기

5. FileZilla 설치하기

https://filezilla-project.org/download.php?type=client에 접속한 후 화면 중앙의 녹색 다운로드 버튼 아래에 있는 Show additional download options를 클릭한다.


6. 사용하고 있는 시스템 환경에 맞는 FileZilla를 다운로드한 후 설치한다. 설치가 끝나면 FileZilla 프로그램 창과 알림 창이 나타난다. 확인을 클릭한다.


7. FTP 서버와 연결하기

FileZilla 프로그램을 실행한 후 위의 호스트 칸에는 FTP 접속 주소를 입력 사용자명에는 FTP 아이디를, 비밀번호에는 FTP 비밀번호를 입력한 후 빠른 연결을 클릭한다.


내가 만든 문서 웹 서버에 올리고 확인하기

8. 로컬 사이트 창에서 01 폴더를 찾아 클릭하면 바로 아래에 01 폴더 안의 내용이 표시된다. 웹 서버에서 실제 파일이 업로드될 영역은 서버 공간의 html 폴더이므로 오른쪽 리모트 사이트 창에서 html 폴더를 더블 클릭한다. 왼쪽 로컬 사이트 영역에 있는 first.html 파일과 images 폴더를 동시에 선택한 후 오른쪽 리모트 사이트 영역으로 드래그한다. 웹 문서에는 이미지나 동영상, 스크립트 파일 등 여러 가지 파일들이 함께 사용되는데 이 파일들도 로컬 컴퓨터에 있던 폴더 구조 그대로 함께 웹 서버에 올려놓아야 한다.


9. 웹 브라우저에서 확인하기 - http://miniweb.dothome.co.kr/first.html

주소 표시줄에 'http://아이디.dothome.co.kr/first.html'이라고 입력해 본다. 내 컴퓨터에 저장했던 first.html 문서가 화면에 보일 것이다. 웹 사이트도 이런 방법으로 웹 문서와 사용한 파일들을 웹 서버에 올려 놓으면 된다.


http://localhost:8080/edu/index.jsp


웹 애플리케이션 위치

실제 애플리케이션의 루트 디렉터리는 WebContent이다. 이 디렉터리가 톰캣의 webapps의 하위 디렉터리에 해당한다. 애플리케이션의 루트 디렉터리는 URL에서 "/"라는 기호로 접근한다.


웹 애플리케이션 구조

웹 애플리케이션 루트 디렉터리 바로 하위에 WEB-INF 디렉터리이며, WEB-INF 디렉터리에는 web.xml 파일이 있어야 한다.

또한, 현재 웹 애플리케이션에서 서비스하려는 클래스 파일이 있다면 WEB-INF/classes 디렉터리 하위에 있어야 한다. 그리고 클래스 파일들이 jar로 압축되어 있다면 WEB-INF/lib 디렉터리에 있어야 한다. 왜냐하면, 클래스 파일들이 WEB-INF/classes 또는 WEB-INF/lib에 있어야만 WAS로 구성하는 애플리케이션 서버들이 자동으로 인식할 수 있기 때문이다. web.xml 파일과 클래스 파일을 제외한 다른 파일들은 웹 애플리케이션 루트 디렉터리 하위의 어느 곳에 있어도 상관없다.


환경설정 파일 : web.xml

web.xml은 웹 애플리케이션의 서비스 처리에 관한 내용이 정의된 파일이다. 웹서버는 web.xml에 정의된 내용대로 웹 애플리케이션을 실행하기 위한 설정을 수행한다. 정리하자면, web.xml은 웹 애플리케이션 실행에 관해 정의하는 환경설정 파일이며, 웹 애플리케이션 서비스 시작 시 웹서버가 읽어서 사용하는 파일이다.


만일, 직접 만들지 않은 웹 애플리케이션을 유지보수해야 한다면, 제일 먼저 web.xml을 비롯한 환경설정 파일들을 분석해야 한다. 프레임워크를 사용하지 않고 순수 웹 애플리케이션으로 개발된 시스템이라면, web.xml 분석만으로도 전체 흐름을 파악할 수 있다. 참고로 대부분 환경설정 파일은 XML로 작성된다.


서블릿 디렉터리

서블릿이 공식적으로 존재하는 디렉터리로서 모든 WAS의 구조가 같다. 서블릿 디렉터리는 웹 애플리케이션의 루트 디렉터리 하위의 WEB-INF/classes이다. 


1. edu 프로젝트를 마우스 오른쪽 버튼으로 클릭하고, Build Path - Configure Build Path를 선택한다.


2. 자바 빌드 경로(Java Build Path) 설정 화면에서 Source 탭을 선택한 후 Browse를 선택한다.


3. WebContent 아래 WEB-INF 폴더를 선택한 후 Create New Folder를 선택한다.


4. Folder name에 classes라고 입력한 후 OK를 선택한다. 이어서 나오는 폴더 선택 화면에서 다시 OK를 선택한다.


5. 자바 소스의 컴파일 후 출력 위치(Default output folder)가 edu/WebContent/WEB-INF/classes로 지정된 것을 확인한다.


Apply and Close를 클릭하면 classes 폴더가 사라진다. 클래스 파일을 직접 편집할 일이 없기 때문이다. 실제 classes 폴더가 삭제된 것은 아니고, 이클립스의 프로젝트 탐색 창에서만 안 보이는 거다. 


이클립스에서 스프링 프로젝트를 생성하는 방식은

1. 처음부터 스프링 프로젝트를 지정하고 생성하는 방식

2. Maven이나 Gradle 프로젝트를 생성한 후 프레임워크를 추가하는 방식

3. 직접 프레임워크 라이브러리를 추가하는 방식


'ex00' 프로젝트 생성

1. Eclipse의 스프링 관련 플러그인을 설치하면 별도의 설정 없이 몇 번의 클릭만으로도 Maven을 사용하는 스프링 프로젝트를 생성할 수 있다. 화면 오른쪽 상단의 Perspective를 Spring으로 지정한 후 File - New - Spring Legacy Project메뉴를 통해서 프로젝트를 생성한다.


2. Spring Legacy Project 메뉴를 이용하면 여러 종류의 스프링 기반 프로젝트를 Maven 기반으로 생성할 수 있다. 프로젝트는 Spring MVC Project를 이용해서 생성한다.


3. 패키지명은 org.zerock.controller로 지정한다.


프로젝트를 최초로 생성하면 필요한 코드와 라이브러리를 다운로드하게 된다. 다운로드 하는 라이브러리들은 사용자 폴더 내 '.m2'라는 이름의 폴더를 이용한다. '.m2' 폴더에 생성된 repository 폴더 안에는 프로젝트 생성 시 다운로드된 파일들이 추가된다.


프로젝트 생성 시 에러가 발생하는 경우

Maven 등에서 스프링 관련 jar 파일들을 다운로드하는 중에 문제가 발생하는 경우가 대부분이다. 먼저 생성한 프로젝트를 삭제하고 이클립스를 종료하고 현재 사용자 폴더 내에 있는 '.m2' 밑에 'repository' 폴더의 내용물을 삭제해야 한다. 이후 이클립스를 재시작하고 다시 프로젝트를 생성한다. 다운로드도 인 라이브러리의 경우 다른 프로젝트에서 필요로 하는 경우에는 다시 다운로드되지 않으므로, 최초의 프로젝트 생성이나 라이브러리가 추가되는 경우에만 문제가 발생할 수 있다. 


스프링 버전 변경

4. 생성된 프로젝트는 다음과 같은 구조로 Java 폴더나 JSP 폴더, 테스트 폴더 등이 생성된다.

src/main/java - 작성되는 코드의 경로

src/main/resources - 실행할 때 참고하는 기본 경로 (주로 설정 파일들을 넣는다)

src/test/java - 테스트 코드를 넣는 경로

src/test/resources - 테스트 관련 설정 파일 보관 경로

servlet-context.xml - 웹과 관련된 스프링 설정 파일

root-context.xml - 스프링 설정 파일

views - 템플릿 프로젝트의 jsp 파일 경로

web.xml - Tomcat의 web.xml 파일

pom.xml - Maven이 사용하는 pom.xml


5. pom.xml에서 스프링 프레임워크 버전은 3.1.1로 생성되므로, 5.0.7 버전으로 수정한다.


6. Maven Dependencies 항목을 통해서 스프링 프레임워크 라이브러리들이 제대로 변경되었는지 확인한다.


Java version 변경

생성된 프로젝트의 JRE System Library를 보면 'JavaSE-1.6' 버전으로 생성되었으므로, 스프링 5.x 버전을 이용하고 싶다면 JDK 1.8을 사용하는 것이 가장 좋다. JDK 1.9 버전은 MyBatis에서 경고 메시지에 대한 이슈가 해결되지 않은 상태이고, Java SE 10의 경우 Tomcat과의 이슈가 해결되지 않은 상황이다.


7. pom.xml의 <plugin> 태그 중 maven-compiler-plugin의 내용을 1.6에서 1.8로 수정한다.


8. 프로젝트를 선택한 상태에서 Maven - Update Project를 실행한다. 실행한 뒤에는 프로젝트의 컴파일이나 실행 환경이 JDK 1.8을 기준으로 설정된 것을 확인할 수 있다.


SQL 매퍼 프레임워크 구현과 관련해서 Application 클래스, Executor 클래스, Shop 클래스, SqlMapper 클래스를 작성한다. 


Application 클래스는 JDBC 인터페이스를 사용해서 데이터를 조회한다.

Executor 클래스는 Application 객체를 생성한 다음 view( ) 메소드를 호출한다.

이때 Shop 클래스를 리절트 객체로 사용한다.

SqlMapper 클래스는 Application 클래스의 부모 클래스로 개선이 필요한 소스 코드를 추출해서 메소드로 작성한다.


먼저 Shop 클래스를 작성한 다음 Application 클래스Executor 클래스를 순차적으로 작성한다. 

SqlMapper 클래스는 기능 구현에 따라 단계적으로 작성한다.


1. Shop 클래스 생성 경로 : /chapter01/src/org/mybatis/domain/Shop.java


shopNo;

shopName;

shopLocation;

shopStatus;

2. SHOP 테이블에 정의한 컬럼을 기준으로 프로퍼티를 선언한다. 프로퍼티명은 컬럼명을 낙타 표기 형식에 맞추어 변환한 문자열을 사용한다. 


int shopNo;

String shopName;

String shopLocation;

String shopStatus;

3. 프로퍼티를 선언한 다음 컬럼 타입에 적합한 자바 타입을 프로퍼티 타입으로 선언한다. 컬럼 타입이 숫자 타입인 경우 int 타입 또는 Integer 타입을 프로퍼티 타입으로 선언하고, 문자 타입인 경우 String 타입을 프로퍼티 타입으로 선언한다.


/* 접근 제한자 */

private int shopNo;

private String shopName;

private String shopLocation;

private String shopStatus;


/* 셋터 메소드 */

public void setShopNo(int shopNo){

this.shopNo = shopNo;

}


/* 겟터 메소드 */

public int getShopNo( ){

return this.shopNo;

}

4. 선언한 프로퍼티 값을 직접 변경하지 못하도록 접근 제한자를 지정한 다음 셋터 메소드와 겟터 메소드를 작성한다.


private int shopNo;

private String shopName;

private String shopLocation;

private String shopStatus;


/* 기본 생성자 */

public Shop( ) {


}


/* 생성자 */

public Shop(int shopNo, String shopName, String shopLocation, String shopStatus){

this.shopNo = shopNo;

this.shopName = shopName;

this.shopLocation = shopLocation;

this.shopStatus = shopStatus;

}

5. 두 개의 생성자를 작성한다. 하나는 기본 생성자이고, 다른 하나는 모든 프로퍼티를 인자로 지정한 생상자다.

* 생성자는 클래스명과 이름이 동일하고, 반환 타입이 생략된 메소드를 말한다. 특히 생성자 가운데 인자가 없는 생성자를 기본 생성자라고 한다.


import java.io.Serializable;


public class Shop implements Serializable {


}

6. Serializable 인터페이스를 지정한다.


Application 클래스를 작성한다. JDBC 인터페이스 호출 순서를 따라 작성한 Application 클래스는 데이터베이스로부터 조건에 맞는 데이터를 한 건 조회한다. Application 클래스는 단계적인 리팩토링 작업을 통해서 점진적으로 작성한다. Application 클래스를 작성할 때 Shop 클래스를 리절트 객체로 사용한다.


7. Application 클래스 생성 경로 : /chapter01/src/step0/Application.java


import java.sql.SQLException;

import java.util.List;


public class Application {

public void view(List<Object> parameters) throws SQLException {

try {

// JDBC 드라이버 로딩

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException e) {

e.printStackTrace( );

}

}

}

8. view( ) 메소드를 정의한다. view( ) 메소드에 Class 클래스의 forName( ) 메소드를 사용해서 JDBC 드라이버를 로딩하는 소스 코드를 작성한다. forName( ) 메소드를 호출할 때 패키지 경로를 포함한 (오라클 데이터베이스의) JDBC 드라이버 클래스를 인자로 전달한다. 빌드 경로에서 JDBC 드라이버 클래스를 찾지 못하면 ClassNotFoundException 예외가 발생한다. 이런 경우에 try ~ catch 문을 사용해서 예외를 처리한다. 


import java.sql.Connection;

import java.sql.DriverManager;


public class Application {

public void view(List<Object> parameters) throws SQLException {

Connection connection = null;


try {

// JDBC 드라이버 로딩

Class.forName("oracle.jdbc.driver.OracleDriver");


// 데이터베이스 연결

connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "mybatis", "mybatis");

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

}

}

}

9. JDBC 드라이버를 로딩한 다음 DriverManager 클래스의 getConnection( ) 메소드를 호출하면, Connection 객체를 반환받을 수 있다. getConnection( ) 메소드를 호출할 때 데이터베이스 연결 URL, 계정, 비밀번호를 인자로 지정한다.


import java.sql.PreparedStatement;


public class Application {

public void view(List<Object> parameters) throws SQLException {

Connection connection = null;

PreparedStatement preparedStatement = null;


try {

...


// 데이터베이스 연결

connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "mybatis", "mybatis");


// 쿼리문 처리 객체 생성

preparedStatement = connection.prepareStatement(

"SELECT SHOP_NO, SHOP_NAME, SHOP_LOCATION, SHOP_STATUS "

 + "FROM SHOP WHERE SHOP_NO = ? AND SHOP_STATUS = ?");


// 파라미터 바인딩

preparedStatement.setInt(1, (Integer) parameters.get(0));

preparedStatement.setString(2, String.valueOf(parameters.get(1));

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

}

}

}

10. 반환된 Connection 객체의 preparedStatement( ) 메소드를 호출하면, PreparedStatement 객체를 반환받을 수 있다. PreparedStatement에서 제공하는 다양한 셋터 메소드를 사용해서 매개 변수를 지정한 쿼리문에 파라미터를 바인딩할 수 있다. 매개 변수의 컬럼 타입이 숫자 타입인 경우 setInt( ) 메소드를 사용하고, 문자 타입인 경우 setString( ) 메소드를 사용한다. 셋터 메소드의 인자로 매개 변수 순번과 파라미터를 전달한다.


import java.sql.ResultSet;


public class Application {

public void view(List<Object> parameters) throws SQLException {

...

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;


try {

...


// 파라미터 바인딩

preparedStatement.setInt(1, (Integer) parameters.get(0));

preparedStatement.setString(2, String.valueOf(parameters.get(1));


// 쿼리문 실행 및 결과 반환

resultSet = preparedStatement.executeQuery( );

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

}

}

}

11. PreparedStatement 객체의 executeQuery( ) 메소드를 호출하면, 조회 쿼리문을 실행한 다음 결과를 담은 ResultSet 객체를 반환받을 수 있다.


import org.mybatis.domain.Shop;


public class Application {

public Shop view(List<Object> parameters) throws SQLException {

...

ResultSet resultSet = null;

Shop shop = null;


try {

...


// 쿼리문 실행 및 결과 반환

resultSet = preparedStatement.executeQuery( );


// 결과 처리

if(resultSet.next()){

shop = new Shop( );


shop.setShopNo(resultSet.getInt("SHOP_NO"));

shop.setShopName(resultSet.getString("SHOP_NAME"));

shop.setShopLocation(resultSet.getString("SHOP_LOCATION"));

shop.setShopStatus(resultSet.getString("SHOP_STATUS"));

}

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

}


return shop;

}

}

12. 조회 결과는 ResultSet 객체에 행과 열 형태로 담겨 반환된다. ResultSet 객체의 next( ) 메소드를 호출하면, 각 행에 순차적으로 접근할 수 있다. 행에 존재하는 각 열의 값은 다양한 겟터 메소드를 사용해서 가져올 수 있다. 열의 값이 숫자 타입인 경우 getInt( ) 메소드를 사용하고, 문자 타입인 경우 getString( ) 메소드를 사용한다. 겟터 메소드의 인자로 컬럼명을 지정한다.


public class Application {

public Shop view(List<Object> parameters) throws SQLException {

...


try {

...

}

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

} finally {

// 자원 및 데이터베이스 연결 해제

if(resultSet!=null){

resultSet.close();

}

if(preparedStatement!=null){

preparedStatement.close();

}

if(connection!=null){

connection.close();

}

}


return shop;

}

}

13. try ~ catch 문에 finally 문을 추가한 다음 사용한 자원 및 데이터베이스 연결을 해제한다. 객체 생성 순서의 역순으로 자원 및 데이터베이스 연결 객체의 close( ) 메소드를 호출한다.


Executor 클래스를 작성한다. Executor 클래스는 main( ) 메소드 실행을 통해서 Application 객체를 생성한 다음 view( ) 메소드를 호출한다.


14. Executor 클래스 생성 경로 : /chapter01/src/step0/Executor.java


import java.util.ArrayList;

import java.util.List;


public class Executor {

public static void main(String[] args){

// 파라미터 객체 생성 및 파라미터 등록

List<Object> parameters = new ArrayList<Object>( );

parameters.add(1);

parameters.add("Y");

}

}

15. main( ) 메소드를 작성한다. main( ) 메소드에 Application 객체의 view( ) 메소드를 호출할 때 필요한 파라미터 객체를 준비한다.


import org.mybatis.domain.Shop;


public class Executor {

public static void main(String[] args){

// 파라미터 객체 생성 및 파라미터 등록

List<Object> parameters = new ArrayList<Object>( );

parameters.add(1);

parameters.add("Y");


// 조회 쿼리문 실행 및 결과 반환

Application application = new Application();

try {

Shop shop = application.view(parameters);

} catch (SQLException e) {

e.printStackTrace();

}


}

}

16. Application 객체를 생성한 다음 view( ) 메소드를 호출한다. 준비한 파라미터 객체를 인자로 전달한다. Application 객체의 view( ) 메소드를 호출할 때 에러가 발생할 수 있다. try ~ catch 문을 사용해서 예외를 처리한다.


Application 클래스는 JDBC 인터페이스 호출 순서에 맞추어 작성한 전형적인 JDBC 인터페이스 호출 순서에 맞추어 작성한 전형적인 JDBC 프로그래밍이다. Application 클래스는 Executor 클래스의 main( ) 메소드 호출을 통해서 실행된다.


JDBC 프로그래밍 단점을 고스란히 가진 Application 클래스를 개선하는 데 필요한 SqlMapper 클래스를 작성한다. SqlMapper 클래스를 완성하면, Application 클래스는 좀 더 간결하고 유연한 구조를 가질 수 있다. 


SQLMapper 클래스에 구현할 기능

1. 중복된 기능 추출

2. 외부 파일 정의

3. 인자와 결과를 자동 처리

4. 단순한 실행 메소드 정의


+ Recent posts