Eggs Sunny Side Up
본문 바로가기
언어/JAVA

MVC 디자인 패턴

by guswn100059 2023. 3. 15.

MVC 디자인 패턴

: 기능에 따라 분리된 패턴

 

M(Model) : 데이터베이스에서 사용하고자 하는 데이터를 관리할 수 있는 클래스

V(View) : 실제 사용자가 이용할 수 있는 클래스

C(Controller) : Model과 View를 연결하거나 제어하기 위한 클래스

 

Model_DTO

package Model;

public class DTO {
	
	// DTO -> DataBase Transfer Object
	
	// Model : 데이터를 관리하는 곳
	// -> View나 Controller에 대한 정보는 어떤한 것도 알 수 없다.
	// -> 데이터에 관하여 변경이 일어난다면 처리할 수 있는 방법이 있어야 한다.
	
	// 회원의 정보를 관리할 수 있는 설계도 만들기
	private String id;
	private String pw;
	private String name;
	private int age;
	private int score;
	
	// 기본 생성자 메소드
	public DTO() {
		
	}
	
	//생성자 메소드
	public DTO(String id, String pw, String name, int age, int score) {
		this.id = id;
		this.pw = pw;
		this.name = name;
		this.age = age;
		this.score = score;
	}

	// getters/setters 메소드 생성
	public String getId() {
		return id;
	}


	public void setId(String id) {
		this.id = id;
	}


	public String getPw() {
		return pw;
	}


	public void setPw(String pw) {
		this.pw = pw;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public int getAge() {
		return age;
	}


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


	public int getScore() {
		return score;
	}


	public void setScore(int score) {
		this.score = score;
	}

}

 

Model_DAO

package Model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DAO {

	// DAO -> DataBase Access Object
	// 데이터베이스의 구동을 위한 작업장소

	Connection conn = null;
	PreparedStatement psmt = null;
	ResultSet rs = null;

	// 데이터베이스 연결을 위한 메소드
	public void getCon() {
		try {
			// 1. 드라이버 로딩
			// -> class.forName() -> 사전작업(classpath) 확인 필요
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2. 데이터베이스 연결
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "service";
			String password = "12345";

			conn = DriverManager.getConnection(url, user, password);

		} catch (ClassNotFoundException e) {

			System.out.println("드라이버 로딩 오류");
			e.printStackTrace();

		} catch (SQLException e) {

			System.out.println("데이터베이스 오류");
			e.printStackTrace();
		}

	}

	// 객체 종료를 위한 메소드
	public void close() {
		try {
			if (rs != null) {
				rs.close();
			}
			if (psmt != null) {
				psmt.close();
			}
			if (conn != null) {
				conn.close();
			}

		} catch (Exception e) {
			System.out.println("close 오류");

		}
	}

	// sql 실행결과를 담을 수 있는 변수
	int row = 0;

	// 1. 회원가입을 위한 메소드
	public int Join(DTO dto) {

		// 드라이버 로딩
		getCon();

		// 데이터베이스 연결

		// sql 전송
		String sql = "INSERT INTO BIGMEMBER VALUES(?, ?, ?, ?, ?)";

		try {
			psmt = conn.prepareStatement(sql);

			// ?에 들어갈 내용 연결하기
			psmt.setString(1, dto.getId());
			psmt.setString(2, dto.getPw());
			psmt.setString(3, dto.getName());
			psmt.setInt(4, dto.getAge());
			psmt.setInt(5, dto.getScore());

			// sql문장 실행
			row = psmt.executeUpdate();

		} catch (SQLException e) {

			e.printStackTrace();

		} finally {
			close();
		}

		return row;

	}

	// 2. 로그인을 위한 메소드
	public String login(String id, String pw) {

		String name = null;
		
		try {
			getCon();
			String sql = "SELECT * FROM BIGMEMBER WHERE ID = ? AND PW = ?";

			psmt = conn.prepareStatement(sql);

			psmt.setString(1, id);
			psmt.setString(2, pw);

			rs = psmt.executeQuery();
			
			if(rs.next() == true) {
				name = rs.getString("name");
			}

		}

		catch (Exception e) {

		} finally {
			close();
		}
		return name;
	}

	// 3. 회원 전체정보 조회 메소드
	public ArrayList<DTO> selectALL() {

		ArrayList<DTO> list = new ArrayList<DTO>();
		DTO dto = null;

		try {
			getCon();
			String sql = "SELECT * FROM BIGMEMBER";

			psmt = conn.prepareStatement(sql);

			rs = psmt.executeQuery();

			while (rs.next()) {

				String id = rs.getString("id");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				int score = rs.getInt("score");

				// 조회결과(rs)에 담겨있는 데이터를 DTO로 옮겨담기
				dto = new DTO(id, "", name, age, score);

				// ArrayList를 이용해서 결과 묶기
				list.add(dto);
			}

		} catch (SQLException e) {
			e.printStackTrace();

		} finally {
			close();
		}

		return list;

	}


	// 4. 회원정보 수정 메소드
	public int modify(String id, String pw, int score) {
		
		try {
			getCon();
			
			String sql = "UPDATE BIGMEMBER SET SCORE = ? WHERE ID = ? AND PW = ?";
			
			psmt = conn.prepareStatement(sql);
			
			psmt.setInt(1, score);
			psmt.setString(2, id);
			psmt.setString(3, pw);
			
			row = psmt.executeUpdate();	
			
		} catch(Exception e) {
			e.printStackTrace();
			
		} finally {
			close();
		}
		return row;
	}

	
	// 5. 회원 탈퇴 메소드
	public int delete(String id, String pw) {
		
		try {
			getCon();
			
			String sql = "DELETE FROM BIGMEMBER WHERE ID = ? AND PW = ?";
			
			psmt = conn.prepareStatement(sql);
			
			psmt.setString(1, id);
			psmt.setString(2, pw);
			
			row = psmt.executeUpdate();
			
		} catch (Exception e) {
			
			e.printStackTrace();
		} finally {
			close();
		}
		return row;
		
	}


}

 

Controller

package Controller;

import Model.DAO;
import Model.DTO;

public class Controller {
	
	//Controller : Model과 View를 연결하기 위한 기능
	// -> Model이나 View에 대한 접근 가능
	
	DAO con_dao = new DAO();
	DTO con_dto = new DTO();
	
	// 메소드 수행 결과를 담는 변수
	int result = 0; 
	
	String ans = null;
	
	// 회원가입에 대한 요청
	public String con_join(String id, String pw, String name, int age, int score) {
		con_dto = new DTO(id, pw, name, age, score);
		
		result = con_dao.Join(con_dto); // 성공 시 -> 1, 실패 시 -> 0
		
		if(result > 0) {
			ans = "회원가입 성공";
		} else {
			ans = "회원가입 실패";
		}
		
		return ans;
	}
	
	// 로그인에 대한 요청
	
	// 회원 조회에 대한 요청
	
	// 회원 정보 수정 요청
	
	// 회원 탈퇴 요청
	

}

 

View_Main

package View;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.ResourceBundle.Control;
import java.util.Scanner;

import Controller.Controller;
import Model.DAO;
import Model.DTO;

public class Main {

	public static void main(String[] args) {

		// View : 사용자가 사용을 하며, 시각적인 확인을 할 수 있는 용도로 쓰인다.
		// -> Model이 가지고 있는 데이터를 저장할 수 없다.
		// -> 단순히 표현만 가능할 뿐 다른 기능은 없다.
		Scanner sc = new Scanner(System.in);

		System.out.println("====회원관리 시스템====");

		// 1. 회원가입
		// 2. 로그인
		// 3. 회원전체조회
		// 4. 정보수정
		// 5. 회원탈퇴

		while (true) {
			System.out.print("[1]회원가입 \n[2]로그인 \n[3]전체조회 \n[4]정보수정 \n[5]회원탈퇴 \n[6]종료 \n선택 >> ");
			int choice = sc.nextInt();

			if(choice == 1) {
				System.out.println("회원가입");
				System.out.println("ID : ");
				String id = sc.next();
				
				System.out.println("PW : ");
				String pw = sc.next();
				
				System.out.println("Name : ");
				String name = sc.next();
				
				System.out.println("Age : ");
				int age = sc.nextInt();
				
				System.out.println("Score : ");
				int score = sc.nextInt();
				
				//입력받은 내용 Controller를 통하여 DAO로 전달
				Controller con = new Controller();
				String result = con.con_join(id, pw, name, age, score);
				
				System.out.println(result);
				
				
			} else if(choice == 2) {
				System.out.println("로그인");
					
				System.out.print("ID : ");
				String id = sc.next();
				
				System.out.print("PW : ");
				String pw = sc.next();
				
				DAO dao = new DAO();
				String name = dao.login(id, pw);
				
				if(name != null) {
					System.out.println("로그인 성공");
				} else {
					System.out.println("로그인 실패");
					System.out.println("아이디나 비밀번호를 확인해주세요");
				}
				
				
				
			} else if(choice == 3) {
				System.out.println("전체조회");
				
				// DAO가 가지고 있는 메소드 사용하기
				DAO dao = new DAO();
				ArrayList<DTO> list = dao.selectALL();
				
				// 결과 값을 가지고 아이디, 이름, 나이, 점수 출력
				System.out.println("ID \t 이름 \t 나이 \t 점수");
				
				for(DTO dto :list) {
					System.out.print(dto.getId()+" \t");
					System.out.print(dto.getName()+" \t");
					System.out.print(dto.getAge()+" \t");
					System.out.println(dto.getScore());
				}
				
			} else if(choice == 4) {
				System.out.println("정보수정");
				
				System.out.println("ID : ");
				String id = sc.next();
				
				System.out.println("PW : ");
				String pw = sc.next();
				
				System.out.println("Score : ");
				int score = sc.nextInt();
				
				DAO dao = new DAO();
				int row = dao.modify(id, pw, score);
				
				if(row == 0) {
					System.out.println("정보수정 실패");
				} else {
					System.out.println("정보수정 확인");
				}
				
				
				
			} else if(choice == 5) {
				System.out.println("회원탈퇴");
				
				System.out.print("ID : ");
				String id = sc.next();
				
				System.out.print("PW : ");
				String pw = sc.next();
				
				DAO dao = new DAO();
				int row = dao.delete(id, pw);
				
				if(row == 0) {
					System.out.println("회원탈퇴 불가");
				} else {
					System.out.println("회원탈퇴 완료");
				}
				
				
				
			} else {
				System.out.println("프로그램 종료");
				break;
			}
			System.out.println();
		}

		// 6번 종료가 눌렸을 때에만 프로그램 종료하기
		// 이외 메뉴들은 반복적으로 선택 가능

	}

}

※회원가입 메소드만 controller 사용해서 출력해본 케이스.

 

'언어 > JAVA' 카테고리의 다른 글

시험_회원관리 프로그램  (0) 2023.03.22
JDBC_로그인  (0) 2023.03.15
JDBC 기초_회원가입창 만들기  (2) 2023.03.14
Interface(인터페이스)  (0) 2023.03.13
OOP_추상화  (0) 2023.03.11

댓글