본문 바로가기
Lecture/JSP & Java

[본격 게시판짜기 Part2.4 Model2 MVC패턴] Model 구성

by cusmaker 2012. 7. 13.
반응형

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.1 - 게시판도 HTML부터] 게시글 리스트

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.2 - 게시판도 HTML부터] 글입력폼

2012/06/13 - [Lecture/Javascript-기초] - [본격 게시판짜기 Part1.3 - Dom 맛보기 ] 글입력폼 검사

2012/06/13 - [Lecture/Jsp] - [본격 게시판짜기 Part1.4 - HTML-> JSP] form 파라미터 받기

2012/06/26 - [Lecture/SQL / Oracle] - [본격 게시판짜기 Part1.5 JSP > Oracle] 게시판 DB 테이블 생성

2012/06/26 - [Lecture/Jsp] - [본격 게시판짜기 Part1.6 Oracle > JSP] Database 접속 및 Select

2012/07/05 - [Lecture/Jsp] - [본격 게시판짜기 Part1.7 JSP, SQLDeveloper] 게시글 입력 및 리스트조회기능

2012/07/08 - [Lecture/Jsp] - [본격 게시판짜기 Part1.8 JSP 게시글 조회] 게시글 조회기능 및 게시글 삭제

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.1 Model2 MVC패턴] 뷰(View) 코드 분리

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.2 Model2 MVC패턴] Entity Beans의 사용

2012/07/12 - [Lecture/Jsp] - [본격 게시판짜기 Part2.3 Model2 MVC패턴] Controller구성


안녕하세요! cocy입니다. 

저번시간에는 MVC 패턴중 Controller의 구성을 해보았는데요, 

게시글에 댓글이 달려서 매우 기분이 좋습니다. 왜 사람들이 댓글 댓글 하는지 이해가.....이게 아니고,


이번엔 Model 구성입니다.

Model은 전에 말씀드렸듯이, 데이터베이스 접속에 관한 부분을 담당하는 파트로,

데이터베이스의 트랜젝션관리, 커넥션 관리, 쿼리제어 등 

Action에서 데이터베이스에 관련된 모든부분을 담당하게 됩니다.




그림 1. MVC 코드구조 클래스 다이어그램(Class Diagram)



자 설명은 여기까지하고 바로 코드를 보겠습니다.

살펴볼 부분은 저번시간에 작성했던 ListAction.java입니다.


여기서 데이터베이스에 관련된 부분을 찾아봅시다.




빨갛게 표시한 부분이 데이터베이스에 관련된 부분입니다.

이런식으로 구성하게되면,

하나의 Action이 실행될때마다 데이터베이스에 접속하게되고,

그렇게되면 다수의 사용자가 몰렸을 경우에 데이터베이스에 무리를 주게되므로

커넥션의 효율적인 관리가 필요하게 됩니다. (커넥션 풀의 사용)


그리고 만약 하나의 Action에서 두개이상의 쿼리실행이 생길경우에는 (글입력, 로그입력 등)

첫번째 쿼리가 실패했을경우 다음에 실행되는 쿼리도 같이 실패를 해야 

데이터베이스의 무결성을 유지할 수가 있게되는데,

이를 트랜젝션관리라고 합니다.


이러한 코드들을 하나의 Action에 전부 넣게되면 코드의 길이가 길어지게되고 가독성도 떨어지게됩니다.


그럼 이러한 코드들을 분리하고 관리하기위해

패키지를 하나 생성합니다.


com.board.dao


여기서 dao는 데이터 접근 객체(Data Access Object)의 약자로 

비지니스 로직을 수행하는 자바클래스를 Action이라고 명명하는것과 마찬가지로 

Model 객체를 명명하는 이름입니다.


패키지를 만드셨으면 BoardDao.java 파일을 만들어주세요.





그럼 Dao의 내용을 채워볼건데요,


데이터베이스에 접속하는 로직을 ListAction.java 기준으로 살펴보면 보통 이런식이겠죠?


String driverName = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@localhost:1521:XE";         

ResultSet rs = null;

 

Class.forName(driverName);                                                            // 1. 드라이버 클래스 로드

Connection con = DriverManager.getConnection(url,"board","board");  // 2. 접속정보를 가지고 접속

System.out.println("Oracle Database Connection Success.");

 

Statement stmt = con.createStatement();                             // 3. 쿼리를 생성하고

String sql = "select * from board order by idx desc";

rs = stmt.executeQuery(sql);                                                            // 4. 쿼리 실행


// 5. 마지막으로 생략했지만 쿼리에서 반환된 결과값을 사용


그럼 이부분에서 공통적으로 사용 할 수 있는 부분을 

CommonDao.java라는 클래스 파일을 만들고 하위 dao에서는 상속받아서 사용하는건 어떨까요?

이게 바로 디자인 패턴의 시작입니다. 디자인 패턴이란 어려운것이 아니라

성능과 코드의 효율성을 고려하여 코드 구조를 설계하는 것입니다.

그럼 CommonDao.java파일을 동일 패키지에 만들어주고 내용을 채워봅시다.



어려운 코드는 없습니다. 빨갛게 표시한 부분을 중점적으로 보시면 됩니다. 


여기서 잠시 말씀드리자면, Dao의 구성이 어떻다 이렇게 정해진건 아닙니다.

해당코드는 내 주관적인 구성방법이며, 좀 더 나은방향으로 설계하셔도 좋습니다.

저는 최대한 이해가 쉽게끔 설계하고자 미처 성능이나 여러 이슈들을 고려하지 못했습니다. 참고하시고,

다만 제가 말씀드리고 싶은것은 이런식으로 Dao를 구성할 수 있다 정도로 이해 시켜드리고 싶은것이며,

차후에 나올 ORM(※조사해 보세요) 프레임워크인 I-batis를 사용하여 좀 더 나은 Dao구성에 들어가도록 하겠습니다.


CommonDao에서 공통적으로 쓰일 변수들을 상수로 선언해 놓고,

쿼리를 실행하기위한 Statement 객체를 반환하는 openConnection 메소드와 

연결을 종료하는 closeConnection 메소드를 구현하였습니다.


그리고 이를 BoardDao에서 상속받고

모든 게시글을 가져오기위한 getArticleList메소드를 구현하고,

쿼리를 적은뒤 openConnection 함수를 호출해 해당 쿼리를 실행,

반환값을 ResultSet 변수에 담은뒤 Board형 ArrayList형식으로 반환하였습니다.


여기서 눈여겨 봐야할부분이 있는데요,

바로 BoardDao의 getInstance() 부분입니다.

데이터베이스의 접속이 일어날때마다 Dao객체를 생성하고 연결하는것은

크게 봤을때 상당한 메모리의 낭비가 될 수 있습니다.

이에 자바에서는 싱글턴(Singleton)패턴(※조사해 보세요)이라고 하는 디자인패턴을 활용하는데요,

최초에 객체를 생성하고 이후 접속요청이 오면 새로운 객체를 생성하지 않고 인스턴스를 반환합니다.

이역시 완벽하게 구현된 싱글턴 패턴은 아니니 이해만 하고 넘어가시기바랍니다.


그럼 이제 ListAction에서 BoardDao를 사용하는 일만 남았는데요,

아주 간단합니다.

전체 코드를 보면서 설명하겠습니다.



코드가 상당히 깔끔해졌습니다.

ListAction에서 해야 할 일은 단지

반환받을 변수를 선언하고 Dao객체로부터 해당 메소드를 사용하는 일뿐입니다.


다른 액션도 마찬가지로 분리해 보시기바랍니다.

작업하시면서 느끼게 되시겠지만 MVC의 장점이자 단점은 바로, 

기능을 하나 추가하게되면 손볼 파일들이 많아진다는 것입니다. 

머릿속에 진행되는 과정을 이해하시고, 빼놓지않고 하나하나 추가하시기바랍니다.

이로서 MVC구성이 끝났습니다.


생각보다 빨리끝났죠??

하지만 여기서 끝이아니라

앞으로는 게시판의 퀄리티를 높여 보겠습니다.

물론 디자인은 제외하고,,,


코드의 성능을 높이고, 

보안적인 요소를 고려하고,

못다만든 기능(count, paging 등등)들을 추가시켜 보도록 하겠습니다.

이를 위해서는 이미 구현되어있는 아주 유용한 외부 라이브러리들을 사용 할 겁니다.


아주 재밌을겁니다. 재밌었으면 좋겠습니다.


수고하셨습니다.



다음장으로 >> http://cusmaker.tistory.com/92