1. MVC Model2 인터페이스 이용
- MethodView가 삭제되고 ViewInterface 생성
- MethodView 대신에 view 클래스를 인터페이스에 상속하여 execute 메소드 실행상태 개선
import com.human.model.Model;
public interface IConsoleView {
public void execute(Model model);
}
import java.util.ArrayList;
import com.human.dto.HumanDto;
import com.human.model.Model;
public class SelectResultView implements IConsoleView {
@Override
public void execute(Model model) {
System.out.println("-------------------------------------");
for (HumanDto dto : (ArrayList<HumanDto>)model.getAttribute("resultDtos")) {
System.out.println(dto);
}
}
}
import com.human.dto.HumanDto;
import com.human.model.Model;
import com.human.util.UserInput;
public class InsertInputView implements IConsoleView {
public void execute(Model model) {
System.out.println("------------------------------------------");
HumanDto dto = new HumanDto();
dto.setName(UserInput.inputString("이름 입력"));
dto.setAge(UserInput.inputInt("나이 입력"));
dto.setHeight(UserInput.inputDouble("키 입력"));
dto.setBirthday(UserInput.inputLocalDateTime("생일 입력"));
}
}
import com.human.model.Model;
import com.human.util.UserInput;
public class DeleteInputView implements IConsoleView {
@Override
public void execute(Model model) {
System.out.println("---------------------------------------------");
System.out.println("삭제할 데이터 입력");
String name = UserInput.inputString("이름 입력");
model.setAttribute("name", name);
}
}
import com.human.model.Model;
import com.human.util.UserInput;
public class UpdateInputView implements IConsoleView {
@Override
public void execute(Model model) {
System.out.println("-------------------------------------------------");
String updateName = UserInput.inputString("수정할 이름 입력");
int updateAge = UserInput.inputInt("수정할 나이 입력");
model.setAttribute("updateName", updateName);
model.setAttribute("updateAge", updateAge);
}
}
import com.human.model.Model;
public class EXITOutputView implements IConsoleView {
@Override
public void execute(Model model) {
System.out.println("-----------------------------------------");
System.out.println("프로그램을 종료합니다.");
model.setAttribute("input", 5);
}
}
import com.human.model.Model;
public class ErrorOutputView implements IConsoleView {
@Override
public void execute(Model model) {
System.out.println("보기에 있는 숫자를 입력하세요");
}
}
import com.human.model.Model;
import com.human.util.UserInput;
public class MainMenuView implements IConsoleView {
@Override
public void execute(Model model) {
String strMainMenu = "-HumanTable 관리프로그램------------------------\n";
strMainMenu += "| 1.출력 | 2.입력 | 3.삭제 | 4.수정 | 5.종료 |\n" ;
strMainMenu += "메뉴 번호 ";
model.setAttribute("input", UserInput.inputInt(strMainMenu));
}
}
2. 실습 및 프로젝트 연습
(1) customer 실습
1. CustomerDao
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import com.human.dto.CustomerDto;
import com.human.util.DBConn;
public class CustomerDao {
public ArrayList<CustomerDto> select() {
ArrayList<CustomerDto> resultDtos=new ArrayList<CustomerDto>();
ResultSet rs=DBConn.statementQuery(String.format("select * from customer"));
try {
while(rs.next()) {
resultDtos.add(new
CustomerDto(rs.getInt("id"), rs.getString("name"), rs.getDouble("height"),
rs.getTimestamp("birthday").toLocalDateTime()));
}
}catch (SQLException e) {
e.printStackTrace();
}
return resultDtos;
}
public CustomerDto selectId(int id) {
CustomerDto resultDtos=new CustomerDto();
ResultSet rs=DBConn.statementQuery(String.format("select * from customer where id=%d", id));
if(rs!=null) {
try {
rs.next();
resultDtos=new CustomerDto(rs.getInt("id"),rs.getString("name"),rs.getDouble("height"),
rs.getTimestamp("birthday").toLocalDateTime());
}catch (SQLException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}
}
return resultDtos;
}
public void insert(CustomerDto dto) {
String sql=String.format("insert into customer values("+"%d,'%s',%f,to_date('%s','yyyy-mm-dd HH24:mi:ss'))",
dto.getId(),dto.getName(),dto.getHeight(),dto.getBirthday().format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss")));
DBConn.statementUpdate(sql);
System.out.println("[입력 완료]");
}
public void update(String updatename, int updateid) {
String sql=String.format("update customer set id = %d where name='%s'",updateid,updatename);
DBConn.statementUpdate(sql);
System.out.println("[수정 완료]");
}
public void delete(int id) {
String sql = String.format("delete customer where id=%d", id);
DBConn.statementUpdate(sql);
System.out.println("[삭제 완료]");
}
public ArrayList<Integer> getIds() {
ArrayList<Integer> ids=new ArrayList<Integer>();
ResultSet rs=DBConn.statementQuery(String.format("select * from customer"));
try {
while(rs.next()) {
ids.add(rs.getInt("id"));
}
}catch (SQLException e) {
e.printStackTrace();
}
return ids;
}
public int getMaxId() {
int maxIdValue=-1;
ResultSet rs=DBConn.statementQuery(String.format("select max(id) as maxId from customer"));
if(rs!=null) {
try {
rs.next();
maxIdValue=rs.getInt("maxId");
}catch (SQLException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}
}
return maxIdValue;
}
}
2. CustomerDto
package com.human.dto;
import java.time.LocalDateTime;
import java.util.Objects;
public class CustomerDto {
private Integer id;
private String name;
private Double height;
private LocalDateTime birthday;
public CustomerDto() {}
public CustomerDto(Integer id, String name, Double height, LocalDateTime birthday) {
super();
this.id = id;
this.name = name;
this.height = height;
this.birthday = birthday;
}
@Override
public String toString() {
return "CustomerDto [id=" + id + ", name=" + name + ", height=" + height + ", birthday=" + birthday + "]";
}
@Override
public int hashCode() {
return Objects.hash(birthday, height, id, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CustomerDto other = (CustomerDto) obj;
return Objects.equals(birthday, other.birthday) && Objects.equals(height, other.height)
&& Objects.equals(id, other.id) && Objects.equals(name, other.name);
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
public LocalDateTime getBirthday() {
return birthday;
}
public void setBirthday(LocalDateTime birthday) {
this.birthday = birthday;
}
}
3. DBConn
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBConn {
private DBConn() {}
private static Connection dbConn = null;
private static Statement st = null;
private static ResultSet rs = null;
public static Connection getInstance() {
if(dbConn == null) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id = "c##human";
String pw = "human";
dbConn = DriverManager.getConnection(url,id,pw);
System.out.println("DBConnection...");
} catch (Exception e) {
e.printStackTrace();
}
}
return dbConn;
}
public static void dbClose() {
try {
if(rs != null) rs.close();
if(st != null) st.close();
if(dbConn != null) dbConn.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
rs = null;
st = null;
dbConn = null;
}
}
public static int statementUpdate(String sql) {
DBConn.getInstance();
int rValue = -1;
if(dbConn != null) {
try {
if(st == null) st = dbConn.createStatement();
rValue = st.executeUpdate(sql);
} catch(SQLException e) {
e.printStackTrace();
}
} else {
System.out.println("not connected...");
}
return rValue;
}
public static ResultSet statementQuery(String sql) {
DBConn.getInstance();
if(DBConn.dbConn != null) {
try {
if(st == null) st = dbConn.createStatement();
rs = st.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
} else {
System.out.println("not connected....");
}
return rs;
}
}
4. UserInput
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
public class UserInput {
private static Scanner sc = new Scanner(System.in);
public static int inputInt(String st) {
System.out.println(st + "정수 입력");
return Integer.parseInt(sc.nextLine());
}
public static double inputDouble(String st) {
System.out.println(st + "실수 입력");
return Double.parseDouble(sc.nextLine());
}
public static String inputString(String st) {
System.out.println(st + "문자 입력");
return sc.nextLine();
}
public static LocalDateTime inputLocalDateTime(String str) {
System.out.println(str + "시간 입력(yyyy-MM-dd HH:mm:ss");
return LocalDateTime.parse(sc.nextLine(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
public static String dateToString(LocalDateTime date) {
return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
5. CustomerService
import java.util.ArrayList;
import com.human.dao.CustomerDao;
import com.human.dto.CustomerDto;
public class CustomerService {
private CustomerDao dao = new CustomerDao();
public ArrayList<CustomerDto> select() {
return dao.select();
}
public void insert(CustomerDto dto) {
dao.insert(dto);
}
public void update(String updatename, int updateid) {
dao.update(updatename, updateid);
}
public void delete(int id) {
dao.delete(id);
}
}
6. Model
import java.util.HashMap;
public class Model {
private HashMap<String, Object> hashmap = new HashMap<String, Object>();
public void setAttribute(String key, Object value) {
hashmap.put(key, value);
}
public Object getAttribute(String key) {
return hashmap.get(key);
}
public void removeAttribute(String key) {
hashmap.remove(key);
}
}
7. ViewInterface
package com.human.view;
import com.human.model.Model;
public interface ViewInterface {
public void execute(Model model);
}
8. SelectResultView
import java.util.ArrayList;
import com.human.dto.CustomerDto;
import com.human.model.Model;
public class SelectResultView implements ViewInterface {
@Override
public void execute(Model model) {
System.out.println("---------------------------------------------");
for(CustomerDto dto : (ArrayList<CustomerDto>)model.getAttribute("resultDtos")) {
System.out.println(dto);
}
}
}
9. InsertInputView
import com.human.dto.CustomerDto;
import com.human.model.Model;
import com.human.util.UserInput;
public class InsertInputView implements ViewInterface {
@Override
public void execute(Model model) {
System.out.println("---------------------------------------------");
System.out.println("생성할 Customer 데이터 입력");
CustomerDto dto = new CustomerDto();
dto.setId(UserInput.inputInt("id 입력"));
dto.setName(UserInput.inputString("이름 입력"));
dto.setHeight(UserInput.inputDouble("키 입력"));
dto.setBirthday(UserInput.inputLocalDateTime("생일 입력"));
model.setAttribute("dto", dto);
}
}
10. UpdateInputView
import com.human.model.Model;
import com.human.util.UserInput;
public class UpdateInputView implements ViewInterface {
@Override
public void execute(Model model) {
System.out.println("-------------------------------------------");
String updatename = UserInput.inputString("수정할 이름 입력");
int updateid = UserInput.inputInt("수정할 id 입력");
model.setAttribute("updateid", updateid);
model.setAttribute("updatename", updatename);
}
}
11. DeleteInputView
import com.human.model.Model;
import com.human.util.UserInput;
public class DeleteInputView implements ViewInterface {
@Override
public void execute(Model model) {
System.out.println("-----------------------------------");
System.out.println("삭제할 데이터 입력");
int id = UserInput.inputInt("id 입력");
model.setAttribute("id", id);
}
}
12. MainMenuView
import com.human.model.Model;
import com.human.util.UserInput;
public class MainMenuView implements ViewInterface {
@Override
public void execute(Model model) {
String strMainMenu = "~ Customer Service 프로그램 ~";
strMainMenu += " | 1. Select | 2. Insert | 3. Update | 4. Delete | 5. Exit |";
model.setAttribute("input", UserInput.inputInt(strMainMenu));
}
}
13. ExitOutputView
import com.human.model.Model;
public class ExitOutputView implements ViewInterface {
@Override
public void execute(Model model) {
System.out.println("--------------------------------");
System.out.println("프로그램을 종료합니다.");
model.setAttribute("input", 5);
}
}
14. ErrorOutputView
import com.human.model.Model;
public class ErrorOutputView implements ViewInterface {
@Override
public void execute(Model model) {
System.out.println("보기에 있는 숫자를 입력하세요");
}
}
15. DBConnEx
import java.util.ArrayList;
import com.human.dto.CustomerDto;
import com.human.model.Model;
import com.human.service.CustomerService;
import com.human.view.DeleteInputView;
import com.human.view.ErrorOutputView;
import com.human.view.ExitOutputView;
import com.human.view.InsertInputView;
import com.human.view.MainMenuView;
import com.human.view.SelectResultView;
import com.human.view.UpdateInputView;
import com.human.view.ViewInterface;
public class DBConnEx {
public static void main(String[] args) throws Exception {
CustomerService customerService = new CustomerService();
ViewInterface view = null;
int input = 0;
while(input != 5) {
Model model = new Model();
view = new MainMenuView();
view.execute(model);
input = (int)model.getAttribute("input");
switch(input) {
case 1:
ArrayList<CustomerDto> resultDtos = customerService.select();
model = new Model();
model.setAttribute("resultDtos", resultDtos);
view = new SelectResultView();
view.execute(model);
break;
case 2:
model = new Model();
view = new InsertInputView();
view.execute(model);
customerService.insert((CustomerDto)model.getAttribute("dto"));
break;
case 3:
model = new Model();
view = new UpdateInputView();
view.execute(model);
customerService.update((String)model.getAttribute("updatename"), (int)model.getAttribute("updateid"));
break;
case 4:
model = new Model();
view = new DeleteInputView();
view.execute(model);
customerService.delete((int)model.getAttribute("id"));
break;
case 5:
model = new Model();
view = new ExitOutputView();
view.execute(model);
input = (int)model.getAttribute("input");
break;
default:
model = new Model();
view = new ErrorOutputView();
view.execute(model);
break;
}
}
}
}