DAO
저번에 repository와 mapper의 차이를 설명할때 잠깐 나왔지만 다시 말해보자면
Data Access Object의 약자로, 데이터베이스의 데이터에 접근하기 위해 생성하는 객채이다.
DB에 접속해서 데이터의 CRUD(생성, 읽기, 갱신, 삭제) 작업을 시행하는 클래스인것이다.
JSP 및 Servlet페이지 내에 로직을 기술하여 사용할 수 있다
특별한 경우가 아니라면 Singleton 패턴을 적용하는 것이 좋다. DB가 변경 되는 작업이 없다면 Singleton 패턴이 필요없다
DB에 변경을 가하지 않는 작업은 동시에 몇개가 수행되어도 문제가 없지만, DB에 변경을 가하는 작업은 동시에 2개 이상이 수행되지 않는 것이 바람직 하다.
코드의 간결화 및 모듈화, 유지보수 등의 목적을 위해 별도의 DAO클래스를 생성해서 사용하는것이 좋다.
즉, DAO는 DB를 사용하여 데이터의 조회 및 조작하는 기능을 전담하는 오브젝트이다
코드를 잠깐 보자면
pakage dao;
import java.sql.*;
import java.util.ArrayList;
public class user_dao {
private Connection con = null;
private Statement stmt = null;
private ResultSet rs = null;
// 드라이버 로딩 딱 1번만 수행된다.
public user_Dao() {
try {
Class.forName("org.mariadb.jdbc.Driver");
} catch ( ClassNotFoundException e) {
System.err.println("<JDBC 오류> Driver load 오류: " + e.getMessage());
e.printStackTrace();
}
}
// Select 구문
public ArrayList<User_dto> User_Select() {
String server = "jdbc:mariadb://127.0.0.1:3306"; // 서버 주소
String database = "******" // DATABASE 이름
String Suser_name = "******" // 서버 아이디
String Spassword = "******" // 서버 비밀번호
ArrayList<user_dto> dtos = new ArrayList<user_dto>();
// 연결
try {
con = DriverManager.getConnection(server + "/" + database + "?useSSL=false", Suser_name, Spassword);
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT * FROM USER");
System.out.println("Connect completed");
while(rs.next()) {
int num = rs.getInt("num");
String id = rs.getString("id");
String password = rs.getString("password");
String name = rs.getname("name");
String nickname = rs.getnickname("nickname");
String email = rs.getemail("email");
user_dto dto = new user_dto(num, id, password, name, nickname, email);
dtos.add(dto);
)
} catch(SQLException e) {
System.err.println("con 오류: " + e.getMessage());
e.printStackTrace();
} finally {
try { // 종료
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return dtos;
}
}
이런식으로 저장해 주어야한다. 정말 간단하게 적은거지만 이것또한 굉장히 복잡할수 있다. 이중 Select 구문을 이용했다.
변경을 가하는 구문은 1개로 두는것이 가장 좋다.
DTO
그렇다면 DTO는 무엇일까
Data Transfer Object의 약자로, 계층간 데이터 전송을 위해 도메인 모델 대신 사용되는 객체이다.
여기서 계층은 Presentation( View, Controller), Business(Service), Persistence(DAO, Repository)를 의미한다.
DTO는 순수하게 데이터를 저장하고, 데이터에 대한 getter,setter만을 가져야한다
여기서도 코드로 예시를 들자면
package dao;
public class user_dto {
private int num;
private String id;
private String password;
private String name;
private String nickname;
private String email;
//생성자
public user_dto(int num, String id, String password, String name, String nickname, String email){
this.num = num;
this.id = id;
this.password = password;
this.name = name;
this.nickname = nickname;
this.email = email;
}
//getter, setter
public int getNum() {
return num;
}
public String getID() {
return id;
}
public String getPassword(){
return password;
}
public String getName(){
return name;
}
public String getNickname(){
return nickname;
}
public String getEmail(){
return email;
}
public void setID(String id){
this.id = id;
}
public void setPassword(String password) {
this.password = password;
}
public void setName(String name){
this.name = name;
}
public void setNickname(String nickname){
this.nickname = nickname;
}
public void setEmail(String email){
this.email = email;
}
}
이런식의 구성이다 딱 봐도 각 객체를 지정하고 getter,setter를 해준것에 불과한 파일인것이다.
도메인 대신 DTO를 사용하면 좋은 이유
DTO 대신 도메인 모델을 계층간 전달에 사용하면, UI 계층에서 도메인 모델의 메서드를 호출하거나 상태를 변경시킬수있다. 또 UI화면마다 사용하는 도메인 모델의 정보는 다르다.
하지만 많은 정보를 가지고 있는 모든 도메인 모델 속성이 외부에 노출되면 보안의 문제가 생기는것이다.
DTO를 통해 도메인 모델을 캡슐화 해서 보호하는것이다.
도메인 모델을 계층간에 전송하면 모델과 뷰가 강하게 결합한다. 뷰가 도메인의 코드를 변경하게 되는 경우는 좋지않다.
DTO를 통해 이 강한 결합을 느슨하게 만들수 있다.
'Spring' 카테고리의 다른 글
Spring Security - Exception (0) | 2023.03.22 |
---|---|
인증(Authentication) 과 인가(Authorization) (0) | 2023.03.22 |
어노테이션과 어노테이션의 종류 (0) | 2023.03.21 |
websecurityconfigureradapter가 deprecated되었다 (0) | 2023.03.21 |
템플릿 엔진 ( Mustache 와 JSP 그리고 Thymeleaf) (2) | 2023.03.21 |