구성 순서 :
DATABASE에 어떤 요소로 구분되어 저장되는지에 따라 DTO를 구성.
-> Account, Transaction, User DTO에 field값 부여.
-> DTO 필드값 이용하여 DAO interface구성(추상함수) - insert delete update 등. 예외처리 선언 해주기 시작. 제네릭 변수 지정.
-> DAO 기능 이용하여 Service interface구성(추상함수) - DAO의 함수를 이용하는 register, remove, modify 등. 고객이 접하는 메뉴와 비슷. 예외처리 선언 해주기 시작.
-> DAO, Service 인터페이스 이용한 UserDAO, UserService 구성. 제네릭에 들어갈 값 지정 및 예외처리 상황 지정.
-> DAO에서 지정한 예외사항은 Service에서는 처리하지 않고 App로 넘기기.
-> Service구성 시에는 DAO 함수를 사용함으로 선언을 해주고, App구성 시에는 Service함수를 사용함으로 선언을 해줘야한다.
UserDTO
package com.kbstar.dto;
public class UserDTO {
private String id;
private String pwd;
private String name;
private String email;
private String contact;
public UserDTO() {
}
public UserDTO(String id, String pwd, String name) {
this.id = id;
this.pwd = pwd;
this.name = name;
}
public UserDTO(String id, String pwd, String name, String email, String contact) {
this.id = id;
this.pwd = pwd;
this.name = name;
this.email = email;
this.contact = contact;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getContact() {
return contact;
}
public void setContact(String contact) {
this.contact = contact;
}
@Override
public String toString() {
return "UserDTO [id=" + id + ", pwd=" + pwd + ", name=" + name + ", email=" + email + ", contact=" + contact
+ "]";
}
}
package com.kbstar.dto;
public class AccountDTO {
private String accNum;
private double balance;
private String holder;
public AccountDTO() {
}
public AccountDTO(String accNum, double balance, String holder) {
this.accNum = accNum;
this.balance = balance;
this.holder = holder;
}
public String getAccNum() {
return accNum;
}
public void setAccNum(String accNum) {
this.accNum = accNum;
}
public double getBalance() {
return balance;
}
// public void setBalance(double balance) {
// this.balance = balance;
// }
public String getHolder() {
return holder;
}
public void setHolder(String holder) {
this.holder = holder;
}
@Override
public String toString() {
return "AccountDTO [accNum=" + accNum + ", balance=" + balance + ", holder=" + holder + "]";
}
}
package com.kbstar.dto;
public class TransactionDTO {
private String date;//primarykey 거래일시
private String accNo;
private double balance;
private String type;// I O 로 구분(인, 아웃)
private String desc;
public TransactionDTO() {
}
public TransactionDTO(String date, String accNo, double balance, String type, String desc) {
this.date = date;
this.accNo = accNo;
this.balance = balance;
this.type = type;
this.desc = desc;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getAccNo() {
return accNo;
}
public void setAccNo(String accNo) {
this.accNo = accNo;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "TransactionDTO [date=" + date + ", accNo=" + accNo + ", balance=" + balance + ", type=" + type
+ ", desc=" + desc + "]";
}
}
DAO
package com.kbstar.frame;
import java.util.List;
public interface DAO<K, V> {
//database의 입력, 삭제, 조회, 수정을 정의한 것이다.
public void insert(V v) throws Exception;
public void delete(K k) throws Exception;
public void update(V v) throws Exception;
public V select(K k) throws Exception;
public List<V> select() throws Exception;
}
package com.kbstar.frame;
import java.util.List;
public interface CRUDService<K, V> {
// 'app화면에서 어떤 기능들이 있다'를 구현하는 게 Service단락에서 해줌.
// 일반적인 가입, 조회, 삭제 기능이다. 추후 DAO와 연동하여 DATABASE에서 처리.
// 메일을 보내는 service를 추가한다 -> DAO에도 보내고 SMS서버에도 보내고.
// 이체서비스가 생긴다하면 추가해준다.
// insert, delete, update는 데이터베이스 처리 관점 용어이고
// register, remove, modify는 고객이 이용하는 서비스 관점 용어다.
public void register(V v) throws Exception;
public void remove(K k) throws Exception;
public void modify(V v) throws Exception;
public V get(K k) throws Exception;
public List<V> get() throws Exception;
}
package com.kbstar.frame;
public interface Notification {
public void sendEmail(String email, String msg) throws Exception;
public void sendSMS(String contact, String msg) throws Exception;
}
package com.kbstar.frame;
public class Msg {
//메세지도 별도고 관리하기 위해 만듬.
//properties를 이용해도 된다.
public static String registerMsg1 = "가입을 축하합니다.";
public static String registerMsg2 = "가입을 진심으로 축하합니다.";
public static String removeMsg1 = "탈퇴를 축하합니다.";
public static String removeMsg2 = "탈퇴를 진심으로 축하합니다.";
}
package com.kbstar.frame;
public class MakeMessage {
public static String makeMessage(String code) {
String result = "";
switch(code) {
case "ER0001" : result = "계좌개설 실패...";
break;
case "ER0002" : result = "음수 입력...";
break;
case "ER0003" : result = "잔액 부족...";
break;
case "ER0004" : result = "이미 있는 아이디입니다.";
break;
case "ER0005" : result = "삭제할 수 없는 아이디 입니다.";
break;
case "ER0006" : result = "수정할 수 없는 아이디입니다.";
break;
case "ER1001" : result = "이미 있는 상품번호입니다.";
break;
case "ER1002" : result = "삭제할 수 없는 상품번호입니다.";
break;
case "ER1003" : result = "수정할 수 없는 상품번호입니다.";
break;
default : result = "고객센터에 문의하세요...";
}
return result;
}
}
package com.kbstar.frame;
import java.util.Calendar;
public class MakeAccountNumber {
public static int cnt = 100;
public static int cnt2 = 100;
public static String makeTrNum() {
String trNum = "";
Calendar cal = Calendar.getInstance();
trNum = "" + cal.get(Calendar.YEAR)
+ (cal.get(Calendar.MONTH)+1)
+ cal.get(Calendar.DAY_OF_MONTH)
+ cal.get(Calendar.MILLISECOND)
+ cnt2;
cnt2++;
return trNum;
}
public static String makeAccNum() {
String accNum = "";
Calendar cal = Calendar.getInstance();
accNum = "" + cal.get(Calendar.YEAR)
+ (cal.get(Calendar.MONTH)+1)
+ cal.get(Calendar.DAY_OF_MONTH)
+ cnt;
cnt++;
return accNum;
}
}
UserDAO
package com.kbstar.dao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import com.kbstar.dto.UserDTO;
import com.kbstar.frame.DAO;
public class UserDAO implements DAO <String, UserDTO>{
//여기는 비즈니스 로직은 전혀 들어가지 않는다(회원가입시 ㅇㅇ를 체크하고 메일을 보내고 등)
//오직 데이터베이스 처리관련 명령어만 들어간다.
HashMap<String, UserDTO> db;
public UserDAO() {
db = new HashMap<>();
}
@Override
public void insert(UserDTO v) throws Exception {
if (db.containsKey(v.getId())) {//실제 데이터베이스에서는 자동으로 걸러줌.
throw new Exception("DB ERROR 이미 존재하는 아이디입니다.");
}
db.put(v.getId(), v);
}
@Override
public void delete(String k) throws Exception {
if(!db.containsKey(k)) {
throw new Exception("DB ERROR 존재하지 않는 아이디입니다.");
}
db.remove(k);
}
@Override
public void update(UserDTO v) throws Exception {
if(!db.containsKey(v.getId())) {
throw new Exception("DB ERROR 존재하지 않는 아이디입니다.");
}
db.put(v.getId(), v);
}
@Override
public UserDTO select(String k) throws Exception {
if(!db.containsKey(k)) {
throw new Exception("DB ERROR 존재하지 않는 아이디입니다.");
}
UserDTO obj = null;//유저정보를 데이터베이스에서 가져온다. 유저정보 객체를 만든다.
obj = db.get(k);
return obj;
}
@Override
public List<UserDTO> select() throws Exception {
if (db == null) {
throw new Exception("DB ERROR 등록된 정보가 없습니다.");
}
ArrayList<UserDTO> list = new ArrayList<UserDTO>();
Collection<UserDTO> col = db.values();
for (UserDTO obj : col) {
list.add(obj);
}
return list;
}
}
package com.kbstar.dao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import com.kbstar.dto.AccountDTO;
import com.kbstar.frame.DAO;
public class AccountDAO implements DAO<String, AccountDTO>{
HashMap<String, AccountDTO> db;
public AccountDAO() {
db = new HashMap<>();
}
@Override
public void insert(AccountDTO v) throws Exception {
if(db.containsKey(v.getAccNum())) {
throw new Exception("같은 계좌가 존재합니다.");
}
db.put(v.getAccNum(), v);
}
@Override
public void delete(String k) throws Exception {
if(!db.containsKey(k)) {
throw new Exception("입력하신 계좌는 없는 계좌입니다.");
}
db.remove(k);
}
@Override
public void update(AccountDTO v) throws Exception {
if(!db.containsKey(v.getAccNum())) {
throw new Exception("입력하신 계좌는 없는 계좌입니다.");
}
db.put(v.getAccNum(), v);
}
@Override
public AccountDTO select(String k) throws Exception {
if(!db.containsKey(k)) {
throw new Exception("입력하신 계좌는 없는 계좌입니다.");
}
AccountDTO obj= null;
obj = db.get(k);
return obj;
}
@Override
public List<AccountDTO> select() throws Exception {
if(db == null) {
throw new Exception("보유중인 계좌가 없습니다.");
}
List<AccountDTO> list = new ArrayList<AccountDTO>();
Collection<AccountDTO> col;
col = db.values();
for (AccountDTO obj : col) {
list.add(obj);
}
return list;
}
}
package com.kbstar.dao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import com.kbstar.dto.TransactionDTO;
import com.kbstar.frame.DAO;
public class TransactionDAO implements DAO<String, TransactionDTO>{
HashMap<String, TransactionDTO> db;
public TransactionDAO() {
db = new HashMap<>();
}
@Override
public void insert(TransactionDTO v) throws Exception {
if(db.containsKey(v.getDate())) {
throw new Exception("같은 거래내역이 존재합니다.");
}
db.put(v.getDate(), v);
}
@Override
public void delete(String k) throws Exception {
}
@Override
public void update(TransactionDTO v) throws Exception {
}
@Override
public TransactionDTO select(String k) throws Exception {
if(!db.containsKey(k)) {
throw new Exception("입력하신 계좌는 없는 계좌입니다.");
}
TransactionDTO obj= null;
obj = db.get(k);
return obj;
}
@Override
public List<TransactionDTO> select() throws Exception {
if(db == null) {
throw new Exception("보유중인 계좌가 없습니다.");
}
List<TransactionDTO> list = new ArrayList<TransactionDTO>();
Collection<TransactionDTO> col;
col = db.values();
for (TransactionDTO obj : col) {
list.add(obj);
}
return list;
}
}
package com.kbstar.noti;
import com.kbstar.frame.Notification;
public class NotificationImpl implements Notification {
@Override
public void sendEmail(String email, String msg) throws Exception {
System.out.printf("%s에게 %s 전송\n",email, msg);
}
@Override
public void sendSMS(String contact, String msg) throws Exception {
System.out.printf("%s에게 %s 전송\n",contact, msg);
}
}
UserService
package com.kbstar.service;
import java.util.List;
import com.kbstar.dao.UserDAO;
import com.kbstar.dto.UserDTO;
import com.kbstar.frame.DAO;
import com.kbstar.frame.Msg;
import com.kbstar.frame.Notification;
import com.kbstar.frame.CRUDService;
import com.kbstar.noti.NotificationImpl;
public class UserService implements CRUDService<String, UserDTO> {
// 처음에 선언하고 사용하는 것 눈에 익게 하기.
DAO<String, UserDTO> userDao;
Notification notification;
public UserService() {
userDao = new UserDAO();
notification = new NotificationImpl();
}
@Override
public void register(UserDTO v) throws Exception {
// 비밀번호 암호화
try {
userDao.insert(v);
} catch (Exception e) {
throw new Exception("회원가입이 실패하였습니다.(EX0001)");// DB에러를 바로 APP로 던지기 전에 예외처리를 자세히한 후 던짐.
}
notification.sendEmail(v.getEmail(), Msg.registerMsg1);
notification.sendSMS(v.getContact(), Msg.registerMsg2);
}
@Override
public void remove(String k) throws Exception {//비즈니스로직의 기본적인 이해
UserDTO user = null;//2. 받을준비해~
user = userDao.select(k);//3. 삭제전에 미리 받아놔~
try {
userDao.delete(k);
} catch(Exception e) {
throw new Exception("탈퇴오류입니다.");
}
notification.sendSMS(user.getContact(), Msg.removeMsg1 + Msg.removeMsg2);//1. 이메일을 입력해야하는데 k 말고, 전화정보를 받아야하네?
}
@Override
public void modify(UserDTO v) throws Exception {
try {
userDao.update(v);
} catch(Exception e) {
throw new Exception("수정오류입니다.");
}
}
@Override
public UserDTO get(String k) throws Exception {
UserDTO obj = null;// UserDTO타입을 받을준비해
obj = userDao.select(k);
return obj;
}
@Override
public List<UserDTO> get() throws Exception {
List<UserDTO> list = null;
try {
list = userDao.select();
} catch(Exception e) {
//throw new Exception("조회오류");
}
return list;
}
}
package com.kbstar.service;
import java.util.List;
import com.kbstar.dao.AccountDAO;
import com.kbstar.dto.AccountDTO;
import com.kbstar.frame.DAO;
import com.kbstar.frame.Notification;
import com.kbstar.frame.CRUDService;
import com.kbstar.noti.NotificationImpl;
public class AccountService implements CRUDService<String, AccountDTO>{
DAO<String, AccountDTO> accDao;
Notification notification;
public AccountService() {
accDao = new AccountDAO();
notification = new NotificationImpl();
}
@Override
public void register(AccountDTO v) throws Exception {
try {
accDao.insert(v);
//System.out.println(v);
}catch (Exception e) {
throw new Exception(e.getMessage());
}
}
@Override
public void remove(String k) throws Exception {
try {
accDao.delete(k);
}catch (Exception e) {
throw new Exception(e.getMessage());
}
}
@Override
public void modify(AccountDTO v) throws Exception {
try {
accDao.update(v);
}catch (Exception e) {
throw new Exception(e.getMessage());
}
}
@Override
public AccountDTO get(String k) throws Exception {
try {
AccountDTO obj = null;
obj = accDao.select(k);
return obj;
}catch (Exception e) {
throw new Exception(e.getMessage());
}
}
@Override
public List<AccountDTO> get() throws Exception {
try {
List<AccountDTO> list = null;
list = accDao.select();
return list;
}catch (Exception e) {
throw new Exception(e.getMessage());
}
}
}
package com.kbstar.service;
import java.util.List;
import com.kbstar.dao.TransactionDAO;
import com.kbstar.dto.TransactionDTO;
import com.kbstar.frame.CRUDService;
import com.kbstar.frame.DAO;
import com.kbstar.frame.Notification;
import com.kbstar.noti.NotificationImpl;
public class TransactionService implements CRUDService<String, TransactionDTO> {
DAO<String, TransactionDTO> transDao;
Notification notification;
public TransactionService() {
transDao = new TransactionDAO();
notification = new NotificationImpl();
}
@Override
public void register(TransactionDTO v) throws Exception {
try {
transDao.insert(v);
//System.out.println(v);
}catch (Exception e) {
throw new Exception(e.getMessage());
}
}
@Override
public void remove(String k) throws Exception {
}
@Override
public void modify(TransactionDTO v) throws Exception {
}
@Override
public TransactionDTO get(String k) throws Exception {
try {
TransactionDTO obj = null;
obj = transDao.select(k);
return obj;
}catch (Exception e) {
throw new Exception(e.getMessage());
}
}
@Override
public List<TransactionDTO> get() throws Exception {
try {
List<TransactionDTO> list = null;
list = transDao.select();
return list;
}catch (Exception e) {
throw new Exception(e.getMessage());
}
}
}
test
package com.kbstar.test;
import java.util.List;
import com.kbstar.dto.UserDTO;
import com.kbstar.frame.CRUDService;
import com.kbstar.service.UserService;
public class UserRegisterTest {
public static void main(String[] args) {
CRUDService<String, UserDTO> service = new UserService();
UserDTO obj =
new UserDTO("id01", "pwd01", "james", "a@naver.com", "010-9999-0292");
UserDTO obj2 =
new UserDTO("id02", "pwd02", "james", "a@naver.com", "010-9999-0292");
UserDTO obj3 =
new UserDTO("id03", "pwd03", "james", "a@naver.com", "010-9999-0292");
try {
service.register(obj);
service.register(obj2);
service.register(obj3);
} catch (Exception e) {
System.out.println(e.getMessage());
}
// get(k) test ------------------------------------
UserDTO user = null;
try {
user = service.get("id01");
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}
// get() test ------------------------------------
// Emp e = new Manager();
// List list = new ArrayList();
List<UserDTO> list = null;
try {
list = service.get();
for(UserDTO u: list) {
System.out.println(u);
}
} catch (Exception e) {
e.printStackTrace();
}
// remove() test ------------------------------------
try {
service.remove("id05");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
package com.kbstar.test;
import java.util.List;
import com.kbstar.dto.AccountDTO;
import com.kbstar.frame.CRUDService;
import com.kbstar.frame.MakeAccountNumber;
import com.kbstar.service.AccountService;
public class AccountRegisterTest {
public static void main(String[] args) {
CRUDService<String, AccountDTO> service = new AccountService();
AccountDTO obj =
new AccountDTO(MakeAccountNumber.makeAccNum(), 10000, "id01");
AccountDTO obj2 =
new AccountDTO(MakeAccountNumber.makeAccNum(), 20000, "id01");
AccountDTO obj3 =
new AccountDTO(MakeAccountNumber.makeAccNum(), 30000, "id02");
try {
service.register(obj);
service.register(obj2);
service.register(obj3);
} catch (Exception e) {
System.out.println(e.getMessage());
}
// get(k) test ------------------------------------
AccountDTO Account = null;
try {
Account = service.get("202339100");
System.out.println(Account);
} catch (Exception e) {
e.printStackTrace();
}
// get() test ------------------------------------
// Emp e = new Manager();
// List list = new ArrayList();
List<AccountDTO> list = null;
try {
list = service.get();
for(AccountDTO u: list) {
System.out.println(u);
}
} catch (Exception e) {
e.printStackTrace();
}
// remove() test ------------------------------------
try {
service.remove("id01");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
package com.kbstar.test;
import java.util.List;
import com.kbstar.dto.TransactionDTO;
import com.kbstar.frame.CRUDService;
import com.kbstar.frame.MakeAccountNumber;
import com.kbstar.service.TransactionService;
public class TransactionRegisterTest {
public static void main(String[] args) {
CRUDService<String, TransactionDTO> service = new TransactionService();
TransactionDTO obj =
new TransactionDTO(MakeAccountNumber.makeTrNum(),"20230309100",500,"O","국민카드");
TransactionDTO obj2 =
new TransactionDTO(MakeAccountNumber.makeTrNum(),"20230309100",600,"O","국민카드");
TransactionDTO obj3 =
new TransactionDTO(MakeAccountNumber.makeTrNum(),"20230309100",700,"O","국민카드");
try {
service.register(obj);
service.register(obj2);
service.register(obj3);
} catch (Exception e) {
System.out.println(e.getMessage());
}
// get(k) test ------------------------------------조회하기 어려움. 값이 계속 바뀜
TransactionDTO Transaction = null;
try {
Transaction = service.get("id01");
System.out.println(Transaction);
} catch (Exception e) {
e.printStackTrace();
}
// get() test ------------------------------------
// Emp e = new Manager();
// List list = new ArrayList();
List<TransactionDTO> list = null;
try {
list = service.get();
for(TransactionDTO u: list) {
System.out.println(u);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}