본문 바로가기

연습문제/JAVA

Java 와 DB 연동-1 내가 참고할 코드 (0805)

Main----------------------------------------------------------------------------------------------------------

 

public class Main {

public static void main(String[] args) throws Exception {
// 사용자의 입력을 Scanner로 받아 (clear)
// "1" 이외 데이터가 입력될 경우 "다시 입력해 주세요" 하고 다시 입력받을 수 있도록 한다. (clear)
// "1" 을 입력받을 경우 mariadb 에서 정의한 Student 테이블의 데이터를 모두 조회하여 출력 한다.
// "2" 를 입력 받을 경우 새로운 학생을 추가 한다.
String selectedNumber = new InputUtil().validateUserInput(); // 메소드 체이닝.
// 사용자의 입력을 받는다, "1" 이외의 입력이 들어오면 계속 반복하여 메뉴를 보여준다. , "1"의 입력이 들어오면 해당 값을 반환(return)한다.
System.out.println("선택된 번호 : " + selectedNumber);

// selectedNumber에 따라 학생 테이블을 전체 조회 한다.
DbProcess dp = new DbProcess(selectedNumber);
dp.startProcessing();
}
}

 

 

InputUntil---------------------------------------------------------------------------------------------------

public class InputUtil {

//static 런타임 실행시 바로바로 쓸수잇도록
//메모리에 적재해놓는 어떤것(변수 , , 등등..)

//strSc 멤버변수 접근제어자 default > 같은 패키지 내(input안에서) 접근이 가능
static Scanner strSc = new Scanner(System.in);

public static String getStringFromConsole(String defaultString) {
String result = strSc.next().trim();
if(result.equals("")){
result = defaultString;
}
//이메일의 형식에 맞는 형식인지 검사를 더 해봐야한다

return result;
}

// 콘솔에서 숫자 입력 받음
// 숫자 아닌 문자일 경우 경고 출력 하여 다시
public static int getIntFromConsole() {
String v = strSc.next();
if (!isNumber(v)) { //!(부정) 숫자가 아닐때
do { //do while do 실행후 while
System.out.println("숫자를 입력해 주세요, 나이는?..");
v = strSc.next();
} while (!isNumber(v));
}
return Integer.parseInt(v);
}

private static boolean isNumber(String v) {
return StringUtils.isNumeric(v);
}

// 사용자의 입력을 받아서 지정된 값 이외에는 "다시 입력해주세요" 라고 반복하여 물어봄.
public String validateUserInput() {
String userInputString = null; // 사용자가 입력한 데이터를 저장 하는 역할
Scanner sc = new Scanner(System.in); // 사용자의 입력을 받기 위한 Scanner 객체의 인스턴스를 불러온다.
// (인스턴스를 불러온다 -> 이 프로그램이 실행될 때 Scanner객체를 쓸 수 있도록 메모리에 적재 해라)

do { //do while
printInfo(); // 사용자의 안내를 출력하는 메소드
userInputString = inputFromUserFromConsole(sc);
} while (checkUserInputScope(userInputString)); // do - while 구문 : while 조건이 false 일때까지 do를 무한 반복한다.
return userInputString;
}

// 콘솔로부터 사용자의 입력을 받는 InputProcess에서만 쓸 수 있는 기능. (private)
private String inputFromUserFromConsole(Scanner sc) {
// private : 접근 제어자. 접근 : 해당 메소드가 선언된 클래스 이외의 다른 클래스에서 쓸수 있나 없나?
return sc.next(); // 사용자의 입력을 받은 데이터를 String으로 반환한다.
}

// 이 프로그램이 지정한 inputString에 속하는거면 false, 아니면 "다시 입력해 주세요" 하고 true 처리
private boolean checkUserInputScope(String inputString) {
switch (inputString) {
case "1": case "2": return false;
default :
System.out.println("잘못 입력 하셨습니다. ");
System.out.println("주어진 메뉴중 하나를 골라 주세요");
return true;
}
}

// 사용자가 메뉴를 고를 수 있도록 콘솔로 띄워줌.
private void printInfo() {
System.out.println("아래 내용중 선택하세요.");
System.out.println("1: 전체 학생 조회");
System.out.println("2: 새로운 학생 추가");
}
}

 

DBProcess-------------------------------------------------------------------------------------------------

 

 

public class DbProcess {
private static final String DB_URL = "jdbc:mariadb://localhost:3306/DGD"; //java에서는 db종류따라 스키마가 달라질수있다
private static final String DB_USER = "root";
private static final String DB_PW = "0000";

private final String selectedNumber;

// 생성자를 명시적으로 지정하면 기본생성자 DbProcess()는 호출될 수 없다. (따로 명시 해야 한다.)
public DbProcess(String selectedNumber) {
this.selectedNumber = selectedNumber;
}

public void startProcessing() throws SQLException { //코드를 수행하다가 문제가생기면 sqlex예외라면
//try.catch를 해야하는데 > 따로 입력이 필요없다
//빨리 디버깅 하기위해서 예외처리를 한다
// Connection, PreparedStatement, ResultSet interface 객체이다.
Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PW);
PreparedStatement pstmt = null;
ResultSet rs = null;

// selectedNumber에 따라 쿼리를 달리 한다.
switch (this.selectedNumber){
case "1":
pstmt = conn.prepareStatement("select * from Student");
rs = pstmt.executeQuery();
/* 쿼리날린 결과를 가지고 콘솔에 출력한다. */
while(rs.next()){
System.out.println(
rs.getInt(1) + " | "
+ rs.getString(2) + " | "
+ rs.getInt(3) + " | "
+ rs.getString(4) + " | "
+ rs.getString(5));
}
break;
case "2": // 신규 Student를 추가 한다.
// 이름은 뭔지 나이는 몇살인지 번호는 뭔지 이메일은 뭔지 입력을 받아서 쿼리 실행 하는 코드들..
//id값은 primary키라서 이미 차있는경우도 있으니 id값은 입력되어있어야한다
System.out.println("이름은?");
String name = InputUtil.getStringFromConsole("no name");
System.out.println("나이는?");
int age = InputUtil.getIntFromConsole();
System.out.println("번호는?");
String phone = InputUtil.getStringFromConsole("no phone number");
System.out.println("이메일은?");
String email = InputUtil.getStringFromConsole("no email");

// max id + 1을 가져온다, 새로운 id db insert 하기 위해
pstmt = conn.prepareStatement("select max(id) + 1 from Student");
rs = pstmt.executeQuery();
if(rs.next()){
int maxId = rs.getInt(1);
System.out.println("maxId = " + maxId);
pstmt = conn.prepareStatement("insert into Student values (?, ?, ?, ?, ?)");
pstmt.setInt(1, maxId);
pstmt.setString(2, name);
pstmt.setInt(3, age);
pstmt.setString(4, phone);
pstmt.setString(5, email);
System.out.println("INSERT 완료");

int updatedRows = pstmt.executeUpdate();
System.out.println("updatedRows: " + updatedRows);
}
break;
default :
System.out.println("nothing to do"); break;
}
}
}

 

 

 

 

1. 오늘 작성하는 어플리케이션을 어떻게 만들건지? 당장 필요한 기능순으로 정의

(테이블 조회, 수정)
2. 현재까지 쓴 조회 기능 코드를 가능한한 분리시켜서 커밋
3. 학생의 추가기능 작성 (id값은 자동으로 입력)
4. 요구사항 기능 범위 확정의 중요성. 비즈니스 로직과 코드 구조를 계속 공부해야하는 이유