VO, DAO, Service 패턴, Persentation Layer

2019. 4. 11. 10:57JAVA

----------------------------------VO / DAO, DAO, Service-----------------------------

VO / DAO 패턴

VO(Value Object)
- 데이터베이스의 한 레코드를 담는 객체
- 필드, 생성자, Getter/Setter 메소드 구성
- 레코드(행)의 갯수만큼 생성해서 사용한다.
- (필드 클래스)
   * VO객체, Domain객체, DTO객체, 자바빈즈 라고 부른다.

DAO(Database Access Object)
- Database Access 작업을 담당하는 객체
- 추가(Insert) / 삭제(Delete) / 변경(Update) / 조회(Select) 작업과 관련된 메소드들 구성
  * CRUD 기능을 구현한다.
  * Create, Retrieve, Update, Delete
- 업무로직이 존재하디 않는다. (if, for 등 만 사용하는 다른 메소드)
 * 단순한 JDBC 코딩만 존재한다.
 * ibatis / mybatis / hibernate / jpa 등의 DB Access 작업을 
   단순화시켜주는 프레임워크를 활용해서 주로 개발된다.
 - Persistence Layer 라 한다.

Service
- 업무로직을 관련된 작업을 담당하는 객체
- 사용자가 입력한 값을 전달받아서 적절한 업무로직을 수행하고
  업무로직의 수행결과를 DAO를 활용해서 DataBase에 영구적으로 보관한다.
  * 업무로직은 보통 1번 이상의 DB Access작업을 필요로 한다.
  * Service객체의 메소드들은 DAO에 구현된 DB Access작업을 활용해서 
    업무로직에 필요한 정보를 획득하거나, 업무로직의 수행결과를 DB에 반영한다.
- Service Layer 라 한다.

Persentation Layer
- 서비스를 사용하는 레이어 
 * App 자바 파일 등







예시 1-1) 우선 db.utils 패키지를 만들고 그안에 ConnectionUtils.java 파일을 만든다.==========

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectionUtils {
public static Connection getConnection() throws Exception {

Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "zxcv1234");
return conn;
}
}









예시 1-2) UserDAO========================================================

import db.utils.ConnectionUtils;

public class UserDAO {

// 사용자정보 변경하기
public void updateUser(UserVO user) throws Exception {
String sql = "update store_user set user_name = ?, user_pwd = ?, user_phone = ?, user_email = ?, user_point = ? where user_id = ?";

Connection conn = ConnectionUtils.getConnection();
PreparedStatement ptmt = conn.prepareStatement(sql);

ptmt.setString(1, user.getName());
ptmt.setString(2, user.getPwd());
ptmt.setString(3, user.getPhone());
ptmt.setString(4, user.getEmail());
ptmt.setInt(5, user.getPoint());
ptmt.setString(6, user.getId());

ptmt.executeUpdate();

ptmt.close();
conn.close();

}

// 새로운 사용자 정보 추가하기
public void addUser(UserVO user) throws Exception {
String sql = "insert into ( user_id, user_name, user_pwd, user_phone, user_emaile, user_point ) "+
"values (?, ?, ?, ?, ? , 0)";

Connection conn = ConnectionUtils.getConnection();

PreparedStatement ptmt = conn.prepareStatement(sql);

ptmt.setString(1, user.getId());
ptmt.setString(2, user.getName());
ptmt.setString(3, user.getPwd());
ptmt.setString(4, user.getPhone());
ptmt.setString(5, user.getEmail());

ptmt.executeUpdate();

ptmt.close();
conn.close();

}


// 지정된 아이디에 해당하는 사용자 정보 삭제하기
public void deleteUser(String id) throws Exception{
String sql = "delete from store_user where user_id = ?";

Connection con = ConnectionUtils.getConnection();

PreparedStatement ptmt = con.prepareStatement(sql);

ptmt.setString(1, id);
ptmt.executeUpdate();

ptmt.close();
con.close();
}

// 지정된 이름에 해당하는 사용자 정보 조회하기
public ArrayList searchUserByName(String name) throws Exception{
ArrayList users = new ArrayList();

String sql = "select * from store_user where = ?";
Connection conn = ConnectionUtils.getConnection();
PreparedStatement ptmt = conn.prepareStatement(sql);

ptmt.setString(1,  name);

ResultSet rs = ptmt.executeQuery();

while(rs.next()) {
UserVO user = new UserVO();

user.setId(rs.getString("user_id"));
user.setName(rs.getString("user_name"));
user.setPwd(rs.getString("user_pwd"));
user.setPhone(rs.getString("user_phone"));
user.setEmail(rs.getString("user_email"));
user.setPoint(rs.getInt("user_point"));
user.setCreateDate(rs.getDate("user_create_date"));

users.add(user);
}

rs.close();
ptmt.close();
conn.close();
return users;


// 저정된 아이디에 해당하는 사용자 정보 조회하기
public UserVO findUserById(String id) throws Exception{
UserVO user = null; 
// 하나만 조회면 초기값을 null로 한다.

String sql = "select * from store_user where user_id = ? ";
Connection conn = ConnectionUtils.getConnection();
PreparedStatement ptmt = conn.prepareStatement(sql);
ptmt.setString(1, id);
ResultSet rs = ptmt.executeQuery();

while(rs.next()) {
user = new UserVO();
// next로 커서를 내리는데 그위치에 있으면 null값인걸 UserVO로 새로 만든다.

user.setId(rs.getString("user_id"));
user.setName(rs.getString("user_name"));
user.setPwd(rs.getString("user_pwd"));
user.setPhone(rs.getString("user_phone"));
user.setEmail(rs.getString("user_email"));
user.setPoint(rs.getInt("user_point"));
user.setCreateDate(rs.getDate("user_create_date"));

}

rs.close();
ptmt.close();
conn.close();

// Service에서 user를 get하면 값을 사용
return user;
}
// 전체 사용자 정보 조회하기
public ArrayList getAllUsers() throws Exception{
ArrayList users = new ArrayList();
// 값을 담아 Service에 넘겨주기위해 ArrayList사용

String sql = "select * from store_user order by user_id ";
Connection conn = ConnectionUtils.getConnection();
PreparedStatement ptmt = conn.prepareStatement(sql);
ResultSet rs = ptmt.executeQuery();

while(rs.next()) {

// 바로담기가 가능하다.
UserVO user = new UserVO();
user.setId(rs.getString("user_id"));
user.setName(rs.getString("user_name"));
user.setPwd(rs.getString("user_pwd"));
user.setPhone(rs.getString("user_phone"));
user.setEmail(rs.getString("user_email"));
user.setPoint(rs.getInt("user_point"));
user.setCreateDate(rs.getDate("user_create_date"));

users.add(user);
}
rs.close();
ptmt.close();
conn.close();
return users;
}
}





예시1-3) UserService.java====================================


import java.util.ArrayList;

public class UserService {
UserDAO userDao = new UserDAO();

// 사용자 등록
public void addNewUser(UserVO user) throws Exception {

// 이미 등록된 사용자인지 조회
UserVO dbUser = userDao.getUserById(user.getId());
if (dbUser != null) {
throw new Exception("동일한 아이디를 가진 사용자가 이미 존재합니다.");
}
userDao.addUser(user);
}

// 사용자 전체 조회
public ArrayList getAllUsers() throws Exception{
ArrayList users = userDao.getAllUsers();

return users;
}

// 사용자 이름으로 조회
public ArrayList searchUsers(String name) throws Exception{
ArrayList users = userDao.searchUserByName(name);

if ( users == null) {
throw new Exception("["+name+"]에 해당하는 이름이 없습니다.");
}

// 검색된 정보가 있을 경우에만 정보를 반환함
return users;
}

// 사용자 아이디로 조회
public UserVO findUserById(String id) throws Exception{
UserVO user = userDao.getUserById(id);

if ( user == null ) {
throw new Exception("["+id+"에 해당하는 ID가 없습니다.]");
}
return user;
}

// 사용자 삭제
public void deleteUser(String id) throws Exception{

UserVO dbUser = userDao.getUserById(id);
if (dbUser == null) {
throw new Exception("해당하는 아이디가 없습니다.");
}
userDao.deleteUser(id);
}

// 사용자 정보 변경
public void updateUser(UserVO newUser) throws Exception{

UserVO user = userDao.getUserById(newUser.getId());
if (user == null) {
throw new Exception("해당하는 아이디가 없습니다.");
}
user.setName(newUser.getName());
user.setPhone(newUser.getPhone());
user.setEmail(newUser.getEmail());

userDao.updateUser(newUser);
}

}

 



예시 1-4)UserApp.java========================================


import java.util.ArrayList;
import java.util.Scanner;

public class UserApp {

public static void main(String[] args) throws Exception {

Scanner sc = new Scanner(System.in);

UserService service = new UserService();

while (true) {
try {
System.out.println("1.가입 | 2.전체조회 | 3.이름검색 | 4.아이디검색 | 5.삭제 | 6.정보변경 | 0.종료");
System.out.print("선택 > ");
int select = sc.nextInt();
System.out.println();

if (select == 1) {
System.out.println("[회원가입]");
System.out.print("아이디 입력 >");
String id = sc.next();
System.out.print("이름 입력 >");
String name = sc.next();
System.out.print("비밀번호 입력 >");
String pwd = sc.next();
System.out.print("연락처 입력 >");
String phone = sc.next();
System.out.print("이메일 입력 >");
String email = sc.next();

UserVO user = new UserVO(id, name, pwd, phone, email);

service.addNewUser(user);
} else if (select == 2) {
System.out.println("[전체 조회]");

ArrayList users = service.getAllUsers();
if(users.isEmpty()) {
System.out.println("조회된 사용자 정보가 없습니다.");
} else {
for(UserVO user : users) {
System.out.println("아이디 : "+user.getId());
System.out.println("이름 : "+user.getName());
System.out.println("비밀번호 : "+user.getPwd());
System.out.println("연락처 : "+user.getPhone());
System.out.println("이메일 : "+user.getEmail());
System.out.println("포인트 : "+user.getPoint());
System.out.println("만든날짜 : "+user.getCreateDate()+"\n");
}
}
} else if (select == 3) {
System.out.println("[이름으로 검색]");
System.out.print("검색할 이름 > ");
String name = sc.next();
System.out.println();

ArrayList users = service.searchUsers(name);

for(UserVO user : users) {
System.out.println("아이디 : "+user.getId());
System.out.println("이름 : "+user.getName());
System.out.println("비밀번호 : "+user.getPwd());
System.out.println("연락처 : "+user.getPhone());
System.out.println("이메일 : "+user.getEmail());
System.out.println("포인트 : "+user.getPoint());
System.out.println("만든날짜 : "+user.getCreateDate()+"\n");
}
} else if (select == 4) {
System.out.println("[아이디로 검색]");
System.out.print("검색할 아이디 > ");
String id = sc.next();
System.out.println();

UserVO user = service.findUserById(id);

System.out.println("아이디 : "+user.getId());
System.out.println("이름 : "+user.getName());
System.out.println("비밀번호 : "+user.getPwd());
System.out.println("연락처 : "+user.getPhone());
System.out.println("이메일 : "+user.getEmail());
System.out.println("포인트 : "+user.getPoint());
System.out.println("만든날짜 : "+user.getCreateDate()+"\n");

} else if (select == 5) {
System.out.println("[아이디 삭제]");
System.out.print("삭제할 아이디 > ");
String id = sc.next();
System.out.println();

service.deleteUser(id);
} else if (select == 6) {
System.out.println("[아이디로 변경]");
System.out.print("변경할 아이디 > ");
String id = sc.next();
System.out.print("이름 > ");
String name = sc.next();
System.out.print("연락처 > ");
String phone = sc.next();
System.out.print("이메일 > ");
String email = sc.next();
System.out.println();

UserVO user = new UserVO();
user.setId(id);
user.setName(name);
user.setPhone(phone);
user.setEmail(email);

service.updateUser(user);
} else if (select == 0) {
System.out.println("시스템 종료");
break;
}
} catch (Exception e) {
// System.err.println("오류 메시지 : "+e.getMessage());
e.printStackTrace();
}
}
}
}