- 締切済み
2点質問があります。
2点質問があります。 ●1点目 Struts + Springで開発を行っています。 その開発チーム内では、DBから一覧画面用のデータを取得する際に SimpleJdbcTemplateのqueryForList()を用い、 上記メソッドより返されたList<Map<String, Object>>型のデータを そのままAction、JSP等で利用しています。 queryForList()の使い方を調べてみると、 Map<String, Object>型のデータをDTOのようなオブジェクトに入れ替えて 再度リスト化してJSP等で利用している例を見かけます。 (http://www.techscore.com/tech/Others/Spring/5-4.htmlなど) 私の開発チームでは、Map<String, Object>型をDTOに入れ替えると その分余計なクラス(DTO)を作らなければならないため、 Map<String, Object>型のまま使っているのですが、 DTOに入れ替えない場合に保守性、性能面等で問題はあるのでしょうか? ●2点目 1点目の質問でMap<String, Object>型のまま利用することに重大な問題点がない という回答が頂けた場合の話です。 登録内容変更画面にて、 以前登録した内容をDBから取得してテキストボックス内に表示し 画面上で値を変更しDBを更新する処理を行う際に、 入力項目が繰り返し入力フィールドとなっています。 この場合、以前の登録内容がDBよりList<Map<String, Object>>型で返され、 JSPで表示する場合に以下のようにして表示が可能でした。 <nested:iterate property="dataList"> <nested:text property='dataString1'/> <nested:text property='dataString2'/> </nested:iterate> またActionFormは以下のように定義しています。 public class DataForm extends ActionForm { private List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>(); //以下dataListのgetter、setter } しかし、画面にてdataString1、dataString2に入力した内容を DataForm.dataListで受け取ることはできませんでした。 ActionFormにて配列やオブジェクトで各入力項目を一旦受け取り List<Map<String, Object>>型に入れなおすのではなく、 直接List<Map<String, Object>>型フィールドで値を受け取ることは不可能なので しょうか? ※これも余計なクラスやフィールドを作成しないという考えに基づいています。 尚、Struts、Springのバージョンは以下の通りです。 Struts:1.2.9 Spring:2.0.8
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- askaaska
- ベストアンサー率35% (1455/4149)
保守面の問題ね。 DBの結果をダイレクトに取得するMAPをJSPで利用する てことはDB周りの実装をする人とJSPの実装をする人の 密接な連携が必要だわ。 間にデータオブジェクトをはさめば DB周りの実装をする人は結果をDTOに入れて返せばいい。 JSP実装者はDBの結果を気にせずDTOから取得すればいい。 テーブルのカラム名なんかが変わってもDTOがあればJSPはそのまま使えるけど DTOを使わないとJSPも変更が必要だわ。 JSPとDB周りが1対1ならまだいいけど多対1だと テーブルのカラム1つ変更がJSPをいくつも修正することになっちゃう。 小規模プロジェクトならいいけど大規模プロジェクトではDTOは必須ね。 また、DTOを使うと便利な点があるわ。 あるひとつのデータが文字列型だけど数値として利用したい場合 MAPから取得する場合、取得後変換する必要があるわね。 その処理箇所が多いと、変換処理があっちこちに出現してコードが見づらくなるわ。 DTOを使うことで、その処理をDTO内に入れてしまうこともできるわ。 そうするとコードがすっきりして保守性が高まるのよ。
お礼
確かに全ておっしゃる通りですね。 私自身も感覚的にDTOを使う方が良いと感じていたのですが、 明確な根拠がわかっていませんでした。 頂いた回答をもとにチームメンバーを説得して、 保守性の高いコーディングを心掛けたいと思います。 ご回答ありがとうございました。