본 튜터리얼은 사내 직원 교육용으로 만든 것으로 초급 자바 개발자들이 쉽게 iBATIS를 이용하여 개발하도록 하여 좀 더 나은 품질의 코드와 제품을 생산할 수 있도록 하기 위한 바램으로 작성한 자료이다. 즉, 고급 기술 및 상세 기능은 배제를 하였음을 미리 밝힌다.
7. SqlMap에서의 데이터 입력
개발을 위한 기본적인 환경 구축이 완료되었다면 본격적으로 iBATIS를 이용하여 웹 애플리케이션 개발을 하도록 하겠다.
지난 번에 만든 emp.xml을 열면 아래와 같은 코드를 보게 되는데, namespace라는 속성이 보일 것이다. iBATIS는 기본적으로 여러개의 <sqlMap>을 가지게 되어 중복되는 이름을 가진 sql이 존재할 수 있다. 이를 위해 각 <sqlMap> 마다 namespace 속성은 두어 <sqlMap>간의 유일성을 보장해주게 된다. 물론, 이를 정상적으로 이용하기 위해서는 <sqlMapConfig>내의 요소중의 하나인 <settings>의 속성 useStatementNamespaces가 true로 설정되어 있어야 한다. <sqlMapconfig> 테그는 SqlMapConfig.xml에 정의되어 있다. 여기서는 namespace를 Emp로 정하였다.
<sqlMap namespace="Emp">
</sqlMap>
이 Emp는 직원 기본 정보를 관리하는 sqlMap으로 생각하면 되겠다. 지난번에 만든 emp 테이블은 아래와 같다. 현재는 부서 정보를 사용하지 않을 것이므로 dept_no는 항상 null이 될 것이다. 사원번호는 일련번호(AUTO_INCREMENT) 형태로 사용될 것이다.
iBATIS는 SqlMaps라는 별명을 가지고 있다. 즉, SQL과 Java Object를 Mapping(매핑) 기능을 수행하는 툴이 바로 iBATIS이기 때문이다. 그런 이유로, iBATIS를 이용하기 위해서는 DB로부터 쿼리한 결과를 전달하기 위한 매개체가 필요하다. iBATIS는 매개체로 Map이나 유저가 정의한 Class(Object)가 이용된다(중급과정에서 설명하겠지만, XML도 이용이 가능하다). Map이 되었든 Class가 되었든 DB의 구조를 전체(또는 일부분)를 반영한다는 사실은 다르지 않다. 이제 위의 표에 정의된 테이블 구조를 이용하여 적절한 객체(클래스)를 만들어 보겠다(MVC 패턴에서 Model에 속한다, 즉 모델 클래스를 작성한다고 하면 되겠다).
위의 그림은 emp 테이블 구조를 그대로 Class Diagram으로 옮겨본 것이다. 네이밍룰에 주시할 필요가 있는데, 꼭 이렇게 해야한다는 것은 아니고 테이블의 컬럼명을 Java에서 즐겨 사용하는 네이밍룰을 적용하다보니 _가 사라지로 _(underscore) 다음은 대문자로 바뀌는 등의 네이밍이 되었을 뿐이다. 물론, 많은 개발자가 즐겨 사용하는 룰을 사용하는 것이 더 좋을 것이므로 그대로 따르는 것이 좋겠다. 위의 그림을 Java 클래스 코드로 사상하면 다음과 같을 것이다. 이 Emp 클래스의 위치(즉, 패키지)는 ibatis.sample01.model로 하겠다. model 객체는 model이라는 패키지에 함께 모아두면 관리가 편리하기 때문에 일반적으로 이렇게 한다.
이제 위의 Model Object를 이용하여 데이터를 DB로 입력하고 출력하는 기능을 하는 sqlMap을 작성하도록 하겠다.
iBATIS는 CRUD를 위한 요소(element)로 <insert />, <select />, <update />, <delete />가 있다. SQL을 사용하면서 위에 나열한 단어는 익숙할 것이며 또한 알고 있는 그대로 사용하면 된다.
먼저, insert 문장을 구현해보겠다. insert는 DB에 데이터를 기록하도록 하는데 목적이 있다. 즉, Emp 객체에 데이터를 입력한 후 iBATIS로 보내고 iBATIS는 다시 데이터를 추출하여 DB로 입력할 수 있게 된다. <insert /> 요소를 이용하여 기본적인 데이터 입력을 아래와 같이 구현하였다. MySQL은 AUTO_INCREMENT라는 기능을 이용하여 채번을 하게 된다. 이 기능은 데이터가 테이블에 기록되면서 생성되는 번호이기 때문에 입력후 일련번호를 받을 수 있다. 결국 emp_no 컬럼에 입력되는 empNo의 값은 <selectKey />라는 요소를 이용하여 데이터 입력후 가져온 후 empNo 변수에 할당하는 메커니즘을 제공한다. 물론, Oracle과 같이 시퀀스(Sequence)를 사용하여 데이터 입력 전에 일련번호를 생성하는 방법도 제공하고 있다. 이 방법은 중급 과정에서 자세히 설명하도록 하겠다.
emp.xml 파일에는 위의 내용만 추가(물론 <sqlMap> ~ </sqlMap>사이에 추가)한 다음 저장한다. CRUD를 한 번에 모두 구현해도 되지만 지금은 어떻게 동작하는지 보여주는 것이 과제이므로 iBATIS API를 이용하여 jsp 페이지에서 Emp 객체를 만들고 데이터를 입력한 후 DB에 어떻게 입력하는지 설명하도록 하겠다.
MVC패턴은 View와 Control 및 Model을 분리하는 게 원칙이나 지금은 MVC 패턴을 학습하는 것이 아니라 iBATIS의 기본 개념 파악이 목적이므로 바로 jsp 페이지에 구현하는 것이다. 중급과정에서는 Model, View, Control을 분리하여 샘플 웹 애플리케이션일 개발하도록 하겠다.
위 그림은 입력폼(HTML)과 처리스크립트(JSP)와 iBATIS API의 처리 흐름을 시퀀스 다이어그램으로 나타내었다. html페이지에서 폼 정보를 입력한후 전송버튼을 클릭하면 jsp페이지로 제어권이 넘어가면서 iBATIS초기화 및 insert를 수행한 후 다시 정보 입력을 위해 html 페이지로 되돌아가게 된다. 위의 그림에서 정의된 프로세스에 따라 구현해보겠다. 위치(폴더)는 /www/sample01에 위치하도록 한다. 디렉토리가 생성되어 있지 않으니 디렉토리(폴더)를 생성한 후 아래의 소스를 입력하기 바란다. 소스는 모두 UTF-8로 입력해야 하므로 html과 jsp페이지를 생성후 properties에서 Resource의 file encoding 항목이 UTF-8인지 확인하고 아닐 경우 UTF-8로 변경한 후 작업을 해야만 한글 문제가 사라진다.
정상적으로 실행되는지 확인하기 위해서는 톰캣 서버를 시동한 다음 웹브라우저에 http://localhost:8080/ibatis01/sample01/insert_emp.html 을 실행하여 다음 화면을 확인한다.
사원 정보를 입력하기 위해 이름란에 적당한 이름을 입력한 후 전송을 누른다. 아직은 조회를 할 수 있는 서비스를 만들지 않았기 때문에 정상적으로 입력이 되었는지 확인하기 위해서는 MySQL 접속후 SELECT * FROM ibatis.emp 를 실행하면 된다.
MVC패턴을 사용하지 않은 대부분의 JSP 개발 소스들에서는 지금까지 알아본 개발 절차보다 좀 더 쉽고 간단했을 것이다. 하지만, 로직과 HTML이 스파게티처럼 뒤섞여 로직 분석에도 시간이 걸리고, 심각할 경우 SQL문이 jsp페이지에 그대로 사용이 되어 특정 로직이 변경되어야 할 경우 모든 소스를 모두 찾아서 수정해야하는 번거로움과 어려움을 많이 겪게 된다. iBATIS와 MVC패턴을 지원하는 프레임워크(Struts, WebWork)등을 사용하게 되면 초기 구축시 복잡성으로 어려움이 있기는 하지만 구축후 유지보수가 간편해진다는 장점이 있다. 물론, 그 프레임워크에 익숙해지는 시간이 필요하다는 단점은 존재한다.
다음에는 생성한 데이터를 조회하는 업무를 구현해보도록 하겠다.
7. SqlMap에서의 데이터 입력
개발을 위한 기본적인 환경 구축이 완료되었다면 본격적으로 iBATIS를 이용하여 웹 애플리케이션 개발을 하도록 하겠다.
지난 번에 만든 emp.xml을 열면 아래와 같은 코드를 보게 되는데, namespace라는 속성이 보일 것이다. iBATIS는 기본적으로 여러개의 <sqlMap>을 가지게 되어 중복되는 이름을 가진 sql이 존재할 수 있다. 이를 위해 각 <sqlMap> 마다 namespace 속성은 두어 <sqlMap>간의 유일성을 보장해주게 된다. 물론, 이를 정상적으로 이용하기 위해서는 <sqlMapConfig>내의 요소중의 하나인 <settings>의 속성 useStatementNamespaces가 true로 설정되어 있어야 한다. <sqlMapconfig> 테그는 SqlMapConfig.xml에 정의되어 있다. 여기서는 namespace를 Emp로 정하였다.
<sqlMap namespace="Emp">
</sqlMap>
이 Emp는 직원 기본 정보를 관리하는 sqlMap으로 생각하면 되겠다. 지난번에 만든 emp 테이블은 아래와 같다. 현재는 부서 정보를 사용하지 않을 것이므로 dept_no는 항상 null이 될 것이다. 사원번호는 일련번호(AUTO_INCREMENT) 형태로 사용될 것이다.
iBATIS는 SqlMaps라는 별명을 가지고 있다. 즉, SQL과 Java Object를 Mapping(매핑) 기능을 수행하는 툴이 바로 iBATIS이기 때문이다. 그런 이유로, iBATIS를 이용하기 위해서는 DB로부터 쿼리한 결과를 전달하기 위한 매개체가 필요하다. iBATIS는 매개체로 Map이나 유저가 정의한 Class(Object)가 이용된다(중급과정에서 설명하겠지만, XML도 이용이 가능하다). Map이 되었든 Class가 되었든 DB의 구조를 전체(또는 일부분)를 반영한다는 사실은 다르지 않다. 이제 위의 표에 정의된 테이블 구조를 이용하여 적절한 객체(클래스)를 만들어 보겠다(MVC 패턴에서 Model에 속한다, 즉 모델 클래스를 작성한다고 하면 되겠다).
위의 그림은 emp 테이블 구조를 그대로 Class Diagram으로 옮겨본 것이다. 네이밍룰에 주시할 필요가 있는데, 꼭 이렇게 해야한다는 것은 아니고 테이블의 컬럼명을 Java에서 즐겨 사용하는 네이밍룰을 적용하다보니 _가 사라지로 _(underscore) 다음은 대문자로 바뀌는 등의 네이밍이 되었을 뿐이다. 물론, 많은 개발자가 즐겨 사용하는 룰을 사용하는 것이 더 좋을 것이므로 그대로 따르는 것이 좋겠다. 위의 그림을 Java 클래스 코드로 사상하면 다음과 같을 것이다. 이 Emp 클래스의 위치(즉, 패키지)는 ibatis.sample01.model로 하겠다. model 객체는 model이라는 패키지에 함께 모아두면 관리가 편리하기 때문에 일반적으로 이렇게 한다.
Emp 클래스 소스 열기..
이제 위의 Model Object를 이용하여 데이터를 DB로 입력하고 출력하는 기능을 하는 sqlMap을 작성하도록 하겠다.
iBATIS는 CRUD를 위한 요소(element)로 <insert />, <select />, <update />, <delete />가 있다. SQL을 사용하면서 위에 나열한 단어는 익숙할 것이며 또한 알고 있는 그대로 사용하면 된다.
먼저, insert 문장을 구현해보겠다. insert는 DB에 데이터를 기록하도록 하는데 목적이 있다. 즉, Emp 객체에 데이터를 입력한 후 iBATIS로 보내고 iBATIS는 다시 데이터를 추출하여 DB로 입력할 수 있게 된다. <insert /> 요소를 이용하여 기본적인 데이터 입력을 아래와 같이 구현하였다. MySQL은 AUTO_INCREMENT라는 기능을 이용하여 채번을 하게 된다. 이 기능은 데이터가 테이블에 기록되면서 생성되는 번호이기 때문에 입력후 일련번호를 받을 수 있다. 결국 emp_no 컬럼에 입력되는 empNo의 값은 <selectKey />라는 요소를 이용하여 데이터 입력후 가져온 후 empNo 변수에 할당하는 메커니즘을 제공한다. 물론, Oracle과 같이 시퀀스(Sequence)를 사용하여 데이터 입력 전에 일련번호를 생성하는 방법도 제공하고 있다. 이 방법은 중급 과정에서 자세히 설명하도록 하겠다.
insert 소스 열기..
emp.xml 파일에는 위의 내용만 추가(물론 <sqlMap> ~ </sqlMap>사이에 추가)한 다음 저장한다. CRUD를 한 번에 모두 구현해도 되지만 지금은 어떻게 동작하는지 보여주는 것이 과제이므로 iBATIS API를 이용하여 jsp 페이지에서 Emp 객체를 만들고 데이터를 입력한 후 DB에 어떻게 입력하는지 설명하도록 하겠다.
MVC패턴은 View와 Control 및 Model을 분리하는 게 원칙이나 지금은 MVC 패턴을 학습하는 것이 아니라 iBATIS의 기본 개념 파악이 목적이므로 바로 jsp 페이지에 구현하는 것이다. 중급과정에서는 Model, View, Control을 분리하여 샘플 웹 애플리케이션일 개발하도록 하겠다.
위 그림은 입력폼(HTML)과 처리스크립트(JSP)와 iBATIS API의 처리 흐름을 시퀀스 다이어그램으로 나타내었다. html페이지에서 폼 정보를 입력한후 전송버튼을 클릭하면 jsp페이지로 제어권이 넘어가면서 iBATIS초기화 및 insert를 수행한 후 다시 정보 입력을 위해 html 페이지로 되돌아가게 된다. 위의 그림에서 정의된 프로세스에 따라 구현해보겠다. 위치(폴더)는 /www/sample01에 위치하도록 한다. 디렉토리가 생성되어 있지 않으니 디렉토리(폴더)를 생성한 후 아래의 소스를 입력하기 바란다. 소스는 모두 UTF-8로 입력해야 하므로 html과 jsp페이지를 생성후 properties에서 Resource의 file encoding 항목이 UTF-8인지 확인하고 아닐 경우 UTF-8로 변경한 후 작업을 해야만 한글 문제가 사라진다.
insert_emp.html more..
insert_emp.jsp more..
정상적으로 실행되는지 확인하기 위해서는 톰캣 서버를 시동한 다음 웹브라우저에 http://localhost:8080/ibatis01/sample01/insert_emp.html 을 실행하여 다음 화면을 확인한다.
사원 정보를 입력하기 위해 이름란에 적당한 이름을 입력한 후 전송을 누른다. 아직은 조회를 할 수 있는 서비스를 만들지 않았기 때문에 정상적으로 입력이 되었는지 확인하기 위해서는 MySQL 접속후 SELECT * FROM ibatis.emp 를 실행하면 된다.
MVC패턴을 사용하지 않은 대부분의 JSP 개발 소스들에서는 지금까지 알아본 개발 절차보다 좀 더 쉽고 간단했을 것이다. 하지만, 로직과 HTML이 스파게티처럼 뒤섞여 로직 분석에도 시간이 걸리고, 심각할 경우 SQL문이 jsp페이지에 그대로 사용이 되어 특정 로직이 변경되어야 할 경우 모든 소스를 모두 찾아서 수정해야하는 번거로움과 어려움을 많이 겪게 된다. iBATIS와 MVC패턴을 지원하는 프레임워크(Struts, WebWork)등을 사용하게 되면 초기 구축시 복잡성으로 어려움이 있기는 하지만 구축후 유지보수가 간편해진다는 장점이 있다. 물론, 그 프레임워크에 익숙해지는 시간이 필요하다는 단점은 존재한다.
다음에는 생성한 데이터를 조회하는 업무를 구현해보도록 하겠다.
