[35일 차] : JDBC_MVC패턴 적용(1)

서하루·2022년 11월 30일
0

(3) JDBC 공부기록

목록 보기
2/5


💡 MVC패턴이란?

  • M(Model) : 데이터 담당 데이터를 담기 위한 클래스 <데이터 담기 / DB접근>
  • V(View) : 사용자가 보게 될 시각적 요소인 화면 <입력문/출력문>
  • C(Controller) : 사용자의 요청을 받아 처리한 후 반환받은 결과에 따라 View결정

💡 MVC패턴 진행흐름

1). View에서 사용자가 보게될 화면(메뉴판, 도서메뉴 등)
2). Controller를 호출과 전달값 전달
3). Controller에서 사용자가 요청한 내용 처리 후, 가공할 데이터가 있다면 처리 후 Dao로 전달
4). Dao로 호출과 전달값 전달
5). Dao에서 DB접속, SQL구문 실행, SELECT | DML 결과 받고 Controller로 결과 리턴
6). Controller로 전달받은 결과에 따라 view 결정(성공 및 실패화면)
7). 값 입력 및 출력



📢 MVC패턴 적용하기_SELECT(조회)

파일 구성 확인 !
Model --> MemberDao
View --> MemberMenu
Controller --> MemberController
vo --> Member


(1) vo클래스

- sql의 해당 테이블 데이터명과 똑같이 기술(이클립스는 낙타표기법)

package com.br.model.vo;

import java.sql.Date;

public class Member {
	
	 private int userNo;
	 private String userId;
	 private String userPwd;
	 private String userName;
	 private String gender;
	 private int age;
	 private String email;
	 private String phone;
	 private String address;
	 private String hobby;
	 private Date enrollDate;
	
	 public Member() {}

public Member(String userId, String userPwd, String userName, String gender, int age, String email, String phone,
			String address, String hobby) {
		super();
		this.userId = userId;
		this.userPwd = userPwd;
		this.userName = userName;
		this.gender = gender;
		this.age = age;
		this.email = email;
		this.phone = phone;
		this.address = address;
		this.hobby = hobby;
	}

	public int getUserNo() {
		return userNo;
	}

	public void setUserNo(int userNo) {
		this.userNo = userNo;
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getUserPwd() {
		return userPwd;
	}

	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getHobby() {
		return hobby;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}

	public Date getEnrollDate() {
		return enrollDate;
	}

	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}

	@Override
	public String toString() {
		return "Member [userNo=" + userNo + ", userId=" + userId + ", userPwd=" + userPwd + ", userName=" + userName
				+ ", gender=" + gender + ", age=" + age + ", email=" + email + ", phone=" + phone + ", address="
				+ address + ", hobby=" + hobby + ", enrollDate=" + enrollDate + "]";
	}
	 
	 
}


(2) View 클래스

- 사용자가 보게될 첫 화면(메인화면)

public class MemberMenu {
	// 전역변수로 스캐너와 controller 매개변수 생성해주기
	private Scanner sc = new Scanner(System.in);
	private MemberController mc = new MemberController();
	public void mainMenu() {
		
		while(true) {
			
			System.out.println("\n === 회원관리 프로그램 === ");
			System.out.println("1. 회원 추가");
			System.out.println("2. 회원 전체 조회");
			System.out.println("3. 회원 아이디 검색");
			System.out.println("4. 회원 이름으로 키워드 검색");
			System.out.println("5. 회원 정보 변경");
			System.out.println("6. 회원 탈퇴");
			System.out.println("0. 프로그램 종료");
			
			System.out.print(">> 메뉴 선택 : ");
			int menu = sc.nextInt();
			sc.nextLine();
			
			
			
			switch(menu) {
			case 1 : inputMember(); break;
			case 2 : mc.selectList(); break;
			case 3 : String userId = inputMemberId(); 
					mc.selectByUserId(userId);
			
					break;
			case 4 : break;
			case 5 : break;
			case 6 : break;
			case 0 : System.out.println("\n이용해주셔서 감사합니다. 프로그램을 종료합니다."); return;
			default : System.out.println("\n메뉴를 잘못입력했습니다. 다시 입력해주세요");
			}
		}
	}

(2-1) 1번메뉴 회원추가 - view


public void inputMember() {
		System.out.println("\n ==== 회원추가 ==== ");
		
		// 아이디 ~ 취미 입력받기
		System.out.print("아이디 : ");
		String userId = sc.nextLine();
		
		System.out.print("비밀번호 : ");
		String userPwd = sc.nextLine();
		
		System.out.print("이름 : ");
		String userName = sc.nextLine();
		
		System.out.print("성별(M/F) : ");
		String gender = sc.nextLine().toUpperCase(); // 무조건 대문자로 반환
		
		System.out.print("나이 : ");
		String age = sc.nextLine();
		
		System.out.print("이메일 : ");
		String email = sc.nextLine();
		
		System.out.print("전화번호(-빼고 입력) : ");
		String phone = sc.nextLine();
		
		System.out.print("주소 : ");
		String address = sc.nextLine();
		
		System.out.print("취미(,로 연이어서 작성 가능) : ");
		String hobby = sc.nextLine();
		
		// 회원 추가 요청 == Controller 메소드 호출
		
		mc.insertMember(userId, userPwd, userName, gender, age, email, phone, address, hobby);
	}

(2-2) 1번메뉴 요청처리 - Controller

사용자가 요청한 기능에 대해 처리 / 해당 메소드로 전달된 데이터 [가공처리] => Dao메소드 호출 / Dao로부터 결과받은 후 성공 또는 실패 판단 후 View지정
public class MemberController {

 */
	public void insertMember(String userId, String userPwd, String userName,String gender, String age, String email,String phone, String address, String hobby) {

// 전달값을 Member객체에 담아서 통째로 Dao로 전달
// 방법 : 매개변수 생성자로 생성과 동시에 초기화 하기
// 근데 처음에 age 자료형을 String으로 받았기 때문에 파싱해야함
// Interger.parseInt(age)
// 파싱까지해도 오류남 why ? 처음에 생성한 클래스에는 총 11개의 변수가 있는데 현재 입력한 변수는 9개임 
// 해결방안 : Member 클래스에 가서 우리가 조회하고자 하는 것만 선택하여 매개변수생성자 추가로 생성하기 ! (쉬프트+알트+s + o)

Member m = new Member(userId, userPwd, userName, gender, Integer.parseInt(age), email, phone, address, hobby);

// Dao로 호출하면서 전달값 result변수에 담기 
int result = new MemberDao().insertMember(m);

// 성공인지 실패인지 판단 -> Ddo에서 값 전달받은 후 작성 --> view단에서 출력
 if(result > 0) {
 new MemberMenu().displaySuccess("성공적으로 회원이 추가됐습니다.");
}else {
new MemberMenu().displayFail("회원 추가를 실패했습니다.");
 }
}

(2-3) 1번메뉴 DB접근 - Dao

DB에 직접적으로 접근하여 사용자의 요청에 맞는 sql문 실행 후 결과받고 결과를 Controller로 반환(return)
public class MemberDao {
	public int insertMember(Member m) {
    
    //필요한 변수 셋팅
    int result = 0;
    Connection conn = null;
    Statement stmt = null;
    
    //실행할 sql문
    String sql = "INSERT INTO MEMBER VALUES(SEQ_USETR_NO.NEXTVAL, "
  					 + "'" + m.getUserId() 	  + "', "
					 + "'" + m.getUserPwd()   + "', "
					 + "'" + m.getUserName()  + "', "
					 + "'" + m.getGender()    + "', "
					  	   + m.getAge()		  +  ", "
					 + "'" + m.getEmail()	  + "', "
					 + "'" + m.getPhone()	  + "', "
					 + "'" + m.getAddress()	  + "', "
					 + "'" + m.getHobby()	  + "', SYSDATE)";
 
		try {
			// 1) jdbc driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			// 2) Connection 생성
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
			
			// 3) Statement 생성
			stmt = conn.createStatement();
			
			// 4 ~ 5) sql문 실행 후 결과 받기
			result = stmt.executeUpdate(sql);
			
			// 6) 트랜잭션 처리
			if(result > 0) {
				conn.commit();
			}else {
				conn.rollback();
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				// 7. 다쓴 자원 반납
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return result; // 성공시 1 , 실패시 0 반환
	} 

(2-4) 응답화면 출력 - view

Dao에서 서비스 요청 처리 후, 성공 / 실패시 보게 될 응답화면

// 서비스 요청 성공 시 출력화면
public void displaySuccess(String message) {
		System.out.println("\n서비스 요청 성공 : " + message);
	}
// 서비스 요청 실패 시 출력화면
	public void displayFail(String message) {
		System.out.println("\n서비스 요청 실패 : " + message);
		
	}

➡️ 출력화면

0개의 댓글