반응형



저번 포스팅까지는 MVC에서 C(컨트롤러)를 만들어 보았는데요.

이번에는 ListAction에 포함되어있는 DB 커넥트부분을 따로 때어내서 Model을 만들어 봅시다.

Model은 데이터베이스 접속에 관련된 부분을 담당하는 파트로 데이터베이스의 트랜젝션 관리, 커넥션관리, 쿼리제어 등

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

http://cusmaker.tistory.com/88 (갓갓 블로그!!)


간단하게 그림을 설명해보겠습니다.

Controller에서 ListAction을 맵핑시켜 실행하게되고 ListAction은 DB의 정보가 필요합니다. 그래서 ListAction은

BoardDao를 사용하여 CommonDao를 이용하여 DB에 연결하고 값을 가져와서 View로 반환합니다.(.jsp로)

ListAction.java를 보시면 뭔가 딱 DB 커넥션에 연관있어보이는 소스코드가 바로 보일겁니다.

이런식으로 구성하게 되면 하나의 Action ( 하나의 요청)이 실행될 때 마다 DB에 접속하게 됩니다.

그렇다면 다수의 사용자가 실행하게되면 하나하나의 Action에 DB에 접속하고 끊고 접속하고 끊게 됩니다.

그러면 당연히 DB에 무리를 주게되고 많이 느려지거나 뻥! 터지겠죠.

따라서 커넥션의 효율적인 관리가 필요하게 됩니다. ( 커넥션 풀을 사용하는 이유)


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

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

DB의 무결성을 유지할 수 있는데 이 무결성을 유지하는 것을 트랜젝션관리라고 합니다.

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

이런 코드들을 분리하여 관리하기 위해 패키지하나를 생성합시다.

com.board.dao

dao란 데이터 접근 객체 (Data Access Object)의 약자로 비즈니스 로직을 수행하는 자바클래스를 Action이라고 명명하는 것과 마찬가지로

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

패키지를 만들고 BoardDao.java를 만듭시다.


아까전에 ListAction에서 보았듯이 DB 커넥션때 공통되는 부분이 있습니다.

공통되는 부분을 CommonDao로 묶고 나머지가 CommonDao를 상속받아서 사용하면 효율적이지 않을까요?

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

그렇다면 CommonDao를 만들고 공통되는 부분을 넣도록 해봅시다.

경로를 똑같게 com.board.dao > CommonDao를 만듭시다. 

(복붙하고 DB접속이 안되는 불상사가 없길 바랍니다. ID, PW등 확인)


CommonDao를 만들었고 이제 하위 Dao인 BoardDao를 사용할 차례입니다.



CommonDao도 만들었고 BoardDao도 만들었습니다.

공통되게 DB커넥션에 사용하는 부분은 CommonDao에 넣어 BoardDao에서 CommonDao를 상속받게합니다.

BoardDao를 보시면

처음에 getInstance()가 있는데 DB의 접속이 일어날 때마다 Dao객체를 생성하고 연결하는 것은 낭비라고 볼 수 있습니다.

이에 자바에서는 싱글턴(singleton)패턴이라고 하는 디자인 패턴을 사용한다고 합니다.

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

이 역시 완벽하게 구현된 싱글턴 패턴이 아니라고 하니 이해만하고 넘어가고 추후에 한번 더 공부해봅시다.


다시 BoardDao로 돌아와서

getArticleList()라는 함수에서는 모든 게시글을 가져오는 역할을 하며, CommonDao에 있는 openConnection()을 이용해

DB에 연결하게 되고 sql구문을 실행하게 됩니다. 


마지막으로는 CommonDao에 있는 closeConnection()을 통해 접속을 끊게 되구요. 그리고 실행되어 반환된 값을

ResultSet 변수에 담은뒤 board형태로 선언된 ArrayList(articleList)에 넣게되겠습니다. 

이제 ListAction에서 Model부분인 DB커넥션을 구현하였습니다. 그럼 ListAction에서는 더이상 DB 연결이 필요 없고

BoardDao를 불러와서 쓰면 되겠습니다. 

ListAction에서 DB커넥션 부분을 지우고 BoardDao를 호출하여 사용하도록 해보겠습니다.


Model 부분을 떼어내고 나니 ListAction이 매우 간단해졌습니다. 

ListAction이 할 일은 DB에 있는 게시판 리스트들을 가져와서 뿌려주는 일만 하면 되므로

반환받을 변수를 선언하고 Dao객체로부터 해당 메소드를 사용하기만 하면 됩니다.

잘 실행되시겠죠? ( 잘 실행되시길.. )


흐름도를 보자면

List.do 요청 -> web.xml에서 url파악후 ControllerAction 전달 -> ControllerAction에서 Url 분석 후 ListAction으로 전달 ->

ListAction에서 Model로 게시판 전체목록 쿼리 실행 -> 필요한 값들을 view로 반환 (.jsp)


List뿐만 아니라 다른 기능들도 구현하고 Model로 분리해보시길 바랍니다.

이번 포스팅으로 MVC에서 M(Model)이 끝났습니다. 그러면 MVC를 다해본거네요? (짝짝짝)

List를 통해 MVC를 만들면서 느낄 수 있는 부분이 기능을 하나 추가하게 되면 손 볼 파일들이 많아지는 것입니다.

머릿속에서 흐름을 기억해두시면 추후 기능을 추가할 때 빠지는 부분이 없을거라 생각됩니다.

기존 블로그와 같이 다음 게시글부터는 못만든 기능(count, paging)과 외부 라이브러리를 사용해보도록 하겠습니다.

꼭 직접 손으로 일일이 코딩해보시는 걸 추천드립니다.(복붙만하면 정말 금방해요.. 필자는 손으로 치다보니 오타도 나고, 에러잡고하니 생각보다 오래 걸렸어요.. )
































반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기