ASP.NET2009.06.01 10:22
처음에 언급한것과 같이 테스트 해 보면서, 연재 하다 보니 오랜시간이 걸렸습니다. 지난 강좌에서 말씀드린 수정, 삭제를 구현하는부분에서 애매한 부분이 생겼는데, 억지로 라우팅을 변경하다보니 헤깔리는 부분이 많았습니다. 결론적으로, ASP.NET MVC에서는 라우팅 테이블이라는것이 존재하므로, 보통 웹 개발을 할때, 하나의 ASPX를 글쓰기, 수정하기 기능을 같이 넣는데, 이렇게 하는것은 좋지 않다는 결론을 내었습니다. 또한 validate 가 그리 녹녹하지는 않네요 ^^;

자 그럼 마지막 연재를 끝내보도록 하겠습니다.
구현해야 할 내용이 수정, 삭제 이고, 수정은 글쓰기의 view,  삭제는 view없이 이루어집니다.
그러면 글 읽기 화면에 수정, 삭제 기능을 추가해야 하므로, Detail.aspx 를 다음과 같이 수정합니다.
상단에 자바스크립트로, 1차적인 유효성 체크를 하고, 실제 post 액션이 발생했을때 맞는 패스워드 인지 또다시 체크를 하게 구현 하였습니다. post액션 발생시켜서 유효성 체크를 하는것이 구쓰리님의 ASP.NET MVC 책에 나오는 정석입니다.

상단에 Html.ValidationSummary("You must specify a password") 라는 메서드는 컨트롤러단에서 유효성 체크를 해서 ModelState.AddModelError() 메서드를 통해 값을 넣게 되면 나타나는 것인데, 랜더링이 되면 레이블 형태를 취합니다.

하단에 보면 약간 지저분해 보이는 코드가 있습니다. Html.Hidden(), Html.ValidationMessage() 메서드가 있는데, Html.Hidden() 메서드는 억지로 MVC 라우팅을 무시하고, POST 액션을 취하기 위한 방법인데, 앞으로는 수정 화면을 따로 View를 가져가도록 코드를 짜는것이 맞을것 같습니다. 그리고, Html.ValidationMessage()는 좀전에 얘기한 ModelState.AddModelError("pwd", "message") 라고 컨트롤러에서 오류값을 넣으면 Html.ValidationMessage("pwd")로 반환 받을 수 있습니다.

자... 그러면, 여기서 Modify, Delete 컨트롤러를 구현해야 합니다. BoardController.vb에 다음과 같이 구현하도록 합니다.


억지로 구현하다보니 컨트롤러가 좀 지저분해 졌습니다.
우선 HttpVerbs.Post 동작을 하는 Modify 메서드를 보면, ASPX에서 Hidden필드로 seq, password 필드로 pwd를 가져오기 위해 FormCollection을 받아옵니다.

우선 password가 유효한지 검사해서 유효하지 않으면 DetailController에 오류를 담아서 보내고, 유효하다면, 해당 seq로 게시물이 있는지 찾아서 게시물을 VO에 셋팅 합니다.

여기서 자세히 보면

이 구문이 write컨트롤러와 modify컨트롤러를 같이 쓰게될때 들어가게 되는 지저분한 코드 입니다.

만약 복잡한 화면에 코드가 많이 들어가야할 어쩔 수 없는 경우라면 이런 방법으로 하는것도 그리 나쁘진 않을것이지만, 유지보수 차원에서 그리 추천하는 코드는 아닙니다.

Delete 메서드를 보면 Modify 와 비슷합니다. 단지 Delete는 View가 없기 때문에 아래처럼 심플하게 구현되어 집니다.


자... 그러면, Modify, Delete 메서드에서 새롭게 추가된 Facade 객체의 메서드는 다음과 같이 3가지가 추가 되었습니다.
Me.sbFacade.getValidPwd(formValues)
Me.sbFacade.updateBoard(boardDetail, formValues)
Me.sbFacade.deleteBoard(id)

그러면, 이번에는 지금까지 했던 코딩 방식과는 다르게 반대로 코딩을 해 보겠습니다. 목적지 부터 해 봅니다.
(이렇게 하는것이 더 편하더라구요 ^^;)

Board.xml 을 다음과 같이 마지막에 3가지 statements를 추가 하도록 합니다.


그리고, 인터페이스 BoardListDAO.vb 를 다음처럼 코드를 추가 합니다.



SqlMapBoardListDAO.vb 클래스를 다음처럼 코드 추가 합니다.



getValidPwd 메서드는 FormCollection 을 받아서 해당게시물의 작성자 비밀번호가 맞는지 값을 Integer 타입으로 돌려주는것입니다. 맞으면 1, 틀리면 0

updateBoard 서브프로시져는 가져온 보드에 폼값을 받아서 업데이트 처리 해 줍니다. update이므로 반환값이 없습니다. 더욱 정교하게 설계를 한다면 반환값을 True, False으로 업데이트 성공유무를 오류메시지와 함께 표현해 주는것도 좋은 방법입니다.

deleteBoard 서브프로시져 마찬가지로 삭제 하고 받을 필요가 없습니다. 향상된 UI 에서는 "xx개 행에 적용되었습니다." 라는 메시지를 뿌려주곤 하는데, 이때도 마찬가지로 affectedRows 값을 받아와서 표현해 줄 수 있습니다.

아... 참고로, VB.NET 에서는 인터페이스에 메서드를 추가 하면, 구현하는 클래스는 Implements 인터페이스 부분에 파란 밑줄이 표시되는데, 이 파란 밑줄 젤 끝에서 엔터를 치면 자동으로 구현받는 메서드가 생성이 됩니다.

이제는 SpringBoardFacade.vb 인터페이스에 메서드를 추가할 차례입니다. 다음처럼 추가 합니다.


마지막으로 SpringBoardImpl.vb 클래스에서 인터페이스에 선언된 메서드를 구현 해야 합니다. 다음처럼 코드를 추가 하도록 하겠습니다.


 
여기까지가 ASP.NET MVC + SPRING.NET + iBATIS.NET 모두 합쳐서 만들어본 간단한 게시판의 하나의 LifeCycle 입니다. 제 생각에 Log On, About 클릭 하면 오류가 날건데요, BoardController 를 참조하여 해당 컨트롤러의 contructor injection을 objects.xml 에 구현해 주어도 됩니다. ^^;

원래는 이런거 안해줘도 잘 돌아가는데 왜 해주냐고요? 
음... 오픈소스 프레임웍이 모든걸 다 해주지는 못합니다. 훌륭한 닷넷 프레임웍 을 도울뿐이죠... 그러기 위해서는 약간의 수고가 따르는것 같네요.

단, iBATIS.NET은 정말 훌륭한것 같습니다. 서비스를 운영중에 어떤 쿼리가 변경되어야 한다고 할때 예전에 RDO 가 뜰때 sp기반의 어플리케이션을 작성할때 쿼리가 수정이 될때 sp만 수정하면 되었습니다. 하지만, 모두 sp로 때려넣다 보니, DB부하가 커지게 되죠.. 그러면 간단한 부분은 inline 쿼리로 처리 하게 되는데, inline쿼리로 구현했던 부분이 수정이 된다고 하면?
재배포 해야 합니다. 

하지만, iBATIS.NET을 붙이면 해당 xml 파일의 쿼리만 수정해 주면, Dynamic Loading 을 합니다. 트랜잭션관리 또한 우수합니다. SqlMapxxxxxDAO.vb 에서 메서드에서 Mapper.Instance().QueryForObject("blabla", vo) 부분 기억나실꺼에요..
이 매퍼를 통한 쿼리 호출시에 같은 메서드 안에서는 트랜잭션 처리가 됩니다.
예로, 첫번째 줄에 삭제, 두번째줄에 업데이트, 세번째 줄에 조회 라고 한다면, 하나라도 오류가 생기면 자동으로 롤백 처리가 됩니다.

오픈소스 프레임웍이 이처럼 좋긴 하나 모든걸 해결해 주지는 못합니다.

실생활에 비유를 하자면 제 생각엔 오픈소스 프레임웍은 망치 이고, 사람은 닷넷 프레임웍이라고 생각합니다.
사람은 손으로 컴퓨터도 다루고, 밥도 먹고, 운전도 할 수 있습니다. 하지만 특정한 도구 없이는 못을 박기에는 힘듭니다. 쉽게 해 주는것이 망치 이죠.. 단 벌레 한마리 잡는데 망치를 사용하는것이 맞는것일까요?

망치 매니아 라면 그러셔도 좋습니다.!! 단 유리에 붙어 있는 벌레를 잡으러 망치를 들다간 큰일 나겠죠? :)

지금까지 한 소스코드를 첨부 합니다. :)


 
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by dotnetpower

티스토리 툴바