티스토리 뷰

MVC Pattern ?

모델-뷰-컨트롤러(Model–View–Controller, MVC)는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴입니다.

 

이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있습니다.

 

MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리합니다.

 

웹 어플리케이션을 개발할 때 MVC 패턴을 적용하면 Model, View, Controller 에 각각의 역할을 나누어 작업하고자 하는 일을 분담시키기 때문에 코드가 덜 복잡해지고, 뷰, 로직에 대한 명확한 역할 분담이 가능합니다.

 

뿐만 아니라 비즈니스 로직의 재사용성이 높아지고, 확장성 또한 높아져 유지보수가 수월한 프로그램을 개발할 수 있는 장점을 가지고 있습니다.

 

MVC 모델을 그림으로 표현하면 다음과 같습니다.

  • Model
    • 어플리케이션 로직을 담당하는 부분으로 데이터베이스와의 로직을 담당하는 부분입니다.
  • View
    • Client 에게 보여지는 부분이며 Model에서 생성된 Data를 Client에게 제공하는 역할을 담당 합니다.
  • Controller
    • 사용자의 요청을 받아서 요청에 해당하는 비즈니스 로직을 수행하도록 컨트롤 하고, 작업 결과에 따라 응답을 결정하는 역할을 합니다. 
    • Model 과 view 사이의 데이터 전달 역할을 합니다.

 


실습에 앞서,,,

진행할 실습은 MVC 패턴을 완전히 구현한 형태는 아닙니다. 

 

View 에 관련한 내용에서 Jsp, html 등의 코드를 통한 페이지를 생산해 내지 않고, 단순히 Console 창에 데이터를 뽑아내는 형식이기 때문입니다.

 

정확한 MVC패턴을 이용한 프로그램은 

 

https://chohyeonjunn.tistory.com/category/SW%20Project/Servlet

 

'SW Project/Servlet' 카테고리의 글 목록

 

chohyeonjunn.tistory.com

https://chohyeonjunn.tistory.com/category/SW%20Project/Basic_Board_Project

 

'SW Project/Basic_Board_Project' 카테고리의 글 목록

 

chohyeonjunn.tistory.com

위 링크를 통해 jsp / Servlet / html css JavaScript jquery 등과 관련한 내용이 추가된 프로젝트를 만나보실 수 있습니다. 

 

 

 


DB Table

DROP SEQUENCE SEQ_MYTEST_NO;
CREATE SEQUENCE SEQ_MYTEST_NO
	START WITH 102
	INCREMENT BY 1
	MAXVALUE 9999
	NOCYCLE
	NOCACHE;

DROP TABLE MYTEST PURGE;
CREATE TABLE MYTEST(
	NO NUMBER PRIMARY KEY,
	NAME VARCHAR2(100),
	NICKNAME VARCHAR2(200)
);
SELECT * FROM MYTEST;
INSERT INTO MYTEST VALUES(100, '조현준', '쟌쥰');
INSERT INTO MYTEST VALUES(101, '이순신', '불멸의이순신');


폴더 구조

폴더의 구조는 위 그림과 같습니다. 

 

Model 역할을 하는 DAO Class (DB와의 연결), DTO(VO) Class (계층 간 데이터 교환을 위한 객체)

 

Controller 역할을 담당할 Controller Class 로 나누어져 있습니다.

 

 


1. DTO(VO) 코드

package com.dto;

// DTO = Data Transfer Object
// VO = Value Object

// db 에 있는  data 를 전달
// db의 컬럼과 같은 이름으로 필드를 만든다.
public class DTO {
	// TABLE = KH 계정 - MYTEST
	/*
	 * NO NUMBER PRIMARY KEY,
	 * NAME VARCHAR2(100), 
	 * NICKNAME VARCHAR2(200)
	 */

	private int NO;
	private String NAME;
	private String NICKNAME;

	public DTO() {
		super();
	}

	public DTO(int nO, String nAME, String nICKNAME) {
		super();
		NO = nO;
		NAME = nAME;
		NICKNAME = nICKNAME;
	}

	public void setNO(int NO) {
		this.NO = NO;
	}

	public int getNO() {
		return NO;
	}

	public void setNAME(String NAME) {
		this.NAME = NAME;
	}

	public String getNAME() {
		return NAME;
	}

	public void setNICKNAME(String NICKNAME) {
		this.NICKNAME = NICKNAME;
	}

	public String getNICKNAME() {
		return NICKNAME;
	}

	@Override
	public String toString() {
		return " [NO=" + NO + ", NAME=" + NAME + ", NICKNAME=" + NICKNAME + "]";
	}
}

 

DTO(VO) 는 DAO 를 통해 전달받은 DB의 내용을 계층간에 전달하기 위한 객체로서 사용됩니다.

 

보통 DTO 의 필드는 원하는 DB Table의 컬럼과 똑같이 작성합니다.

 

이 외에 기본생성자 / 필드를초기화하는 생성자 / 모든 필드의 Getter,Setter / toString 을 작성합니다.

 

toString을 override 하면 중간중간 테스트시에 콘솔창에 데이터를 쉽게 뽑아낼 수 있습니다.

System.out.println(DTO 객체);

와 같은 간단한 코드를 통해 DTO 객체안의 모든 필드를 편하게 출력해 확일할 수 있습니다.


2. DAO 코드

package com.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.dto.DTO;

import common.JDBCTemplate;

// DAO = Data Access Object

public class DAO extends JDBCTemplate {

	// 전체 출력
	public List<DTO> selectList() {
		List<DTO> list = new ArrayList<DTO>();

		// 1. driver 연결
		// 2. 계정 연결
		Connection con = getConnection();
		Statement stmt = null;
		ResultSet rs = null;
		String sql = " SELECT NO, NAME, NICKNAME FROM MYTEST ";

		try {
			// 3. query 준비
			stmt = con.createStatement();
			// 4. 실행 및 리턴
			rs = stmt.executeQuery(sql);

			while (rs.next()) {
				DTO dto = new DTO();

				dto.setNO(rs.getInt("NO"));
				dto.setNAME(rs.getString("NAME"));
				dto.setNICKNAME(rs.getString("NICKNAME"));

				list.add(dto);
			}
		} catch (SQLException e) {

			e.printStackTrace();
		} finally {
			// 5. db 종료
			close(rs);
			close(stmt);
			close(con);
		}

		return list;
	}

	// 선택 출력
	public DTO selectOne(int no) {
		DTO dto = new DTO();

		// 1. driver 연결
		// 2. 계정 연결
		Connection con = getConnection();
		Statement stmt = null;
		ResultSet rs = null;
		String sql = " SELECT NO, NAME, NICKNAME FROM MYTEST " + " WHERE NO = " + no;

		try {
			// 3. query 준비
			stmt = con.createStatement();
			// 4. 실행 및 리턴
			rs = stmt.executeQuery(sql);

			while (rs.next()) {
				dto.setNO(rs.getInt("NO"));
				dto.setNAME(rs.getString("NAME"));
				dto.setNICKNAME(rs.getString("NICKNAME"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5. db 종료
			close(rs);
			close(stmt);
			close(con);
		}

		return dto;
	}

	// 추가
	public int insert(DTO dto) {
		// 1. driver 연결
		// 2. 계정 연결
		Connection con = getConnection();
		PreparedStatement pstmt = null;
		int res = 0;

		String sql = " INSERT INTO MYTEST VALUES(SEQ_MYTEST_NO.NEXTVAL,?,?)";

		try {
			// 3. query 준비
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, dto.getNAME());
			pstmt.setString(2, dto.getNICKNAME());

			// 4. 실행 및 리턴
			res = pstmt.executeUpdate();
			if (res > 0)
				commit(con);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5. db 종료
			close(pstmt);
			close(con);
		}

		return res;
	}

	// 수정
	public int update(DTO dto) {
		// 1. driver 연결
		// 2. 계정 연결
		Connection con = getConnection();
		PreparedStatement pstmt = null;
		int res = 0;

		String sql = " UPDATE MYTEST " + " SET NAME = ?, NICKNAME = ? " + " WHERE NO = ?";

		try {
			// 3. query 준비
			pstmt = con.prepareStatement(sql);
			// 4. 실행 및 리턴
			pstmt.setString(1, dto.getNAME());
			pstmt.setString(2, dto.getNICKNAME());
			pstmt.setInt(3, dto.getNO());

			res = pstmt.executeUpdate();

			if (res > 0)
				commit(con);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5. db 종료
			close(pstmt);
			close(con);
		}

		return res;
	}

	// 삭제
	public int delete(int no) {
		// 1. driver 연결
		// 2. 계정 연결
		Connection con = getConnection();
		PreparedStatement pstmt = null;
		int res = 0;

		String sql = " DELETE FROM MYTEST WHERE NO = ?";

		try {
			// 3. query 준비
			pstmt = con.prepareStatement(sql);
			// 4. 실행 및 리턴
			pstmt.setInt(1, no);

			res = pstmt.executeUpdate();

			if (res > 0)
				commit(con);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5. db 종료
			close(pstmt);
			close(con);
		}

		return res;
	}
}

DAO 에는 DB 와 연결을 통해 Select / Insert / Update / Delete 작업을 수행하는 Class 입니다. 

 

지금까지 진행했던 코드와 크게 다른점은 없고, 하나의 DAO 클래스 안에 각각의 기능을 메서드로 구현해 놓은 것이 전부입니다.

 


3. Controller 코드

package com.controller;

import java.util.List;
import java.util.Scanner;

import com.dao.DAO;
import com.dto.DTO;

// 요청이 들어오면 해당하는 페이지를 응답한다!!

// 여기서는 view를 따로 작성하지 않고 컨트롤러에서 Console 출력 하겠습니다!
public class Controller {

	private static Scanner sc = new Scanner(System.in);
	private static DAO dao = new DAO();

	public static int getMenu() {

		StringBuffer sb = new StringBuffer();
		int select = 0;

		sb.append("1. 전체 출력\n");
		sb.append("2. 선택 출력\n");
		sb.append("3. 추       가\n");
		sb.append("4. 수       정\n");
		sb.append("5. 삭       제\n");
		sb.append("6. 종       료\n");

		System.out.println(sb);
		System.out.println("번호 선택 : ");
		select = sc.nextInt();

		return select;
	}

	public static void main(String[] args) {

		int no = 0;

		do {
			no = getMenu();
			switch (no) {
			case 1:
				System.out.println("전체출력");
				selectList();
				break;
			case 2:
				System.out.println("선택출력");
				selectOne();
				break;
			case 3:
				System.out.println("추      가");
				insert();
				break;
			case 4:
				System.out.println("수      정");
				update();
				break;
			case 5:
				System.out.println("삭      제");
				delete();
				break;
			case 6:
				System.out.println("종      료");
				sc.close();
				System.exit(0);
			}
		} while (no != 6);
	}

	private static void selectList() {
		List<DTO> list = dao.selectList();

		for (DTO dto : list) {
			System.out.println(dto);
		}
	}

	public static void selectOne() {
		System.out.println("출력할 넘버 입력 : ");
		int num = sc.nextInt();

		///////////////////////////////////////
		DTO dto = dao.selectOne(num);
		System.out.println(dto);
	}

	public static void insert() {
		System.out.println("추가할 데이터 입력 (숫자, 이름, 별명) : ");
		int num = sc.nextInt();
		String name = sc.next();
		String nickname = sc.next();

		///////////////////////////////////////
		DTO dto = new DTO(num, name, nickname);
		if (dao.insert(dto) > 0) {
			System.out.println("insert 성공!!");
		} else {
			System.out.println("insert 실패!!");
		}
	}

	public static void update() {
		System.out.println("몇번 데이터를 수정? : ");
		int num = sc.nextInt();

		System.out.println("수정할 ~ (이름, 별명) : ");
		String name = sc.next();
		String nickname = sc.next();

		///////////////////////////////////////
		DTO dto = new DTO(num, name, nickname);
		if (dao.update(dto) > 0) {
			System.out.println("update 성공!!");
		} else {
			System.out.println("update 실패!!");
		}
	}

	public static void delete() {
		System.out.println("몇번 데이터를 삭제? : ");
		int num = sc.nextInt();

		///////////////////////////////////////
		if (dao.delete(num) > 0) {
			System.out.println("delete 성공!!");
		} else {
			System.out.println("delete 싶패!!");
		}
	}
}

 

본래 Controller는 View를 통해 사용자의 요청을 전달받아 각각의 경우에 맞는 비즈니스 로직을 수행하도록 하는 중앙 컨트롤러와 같은 역할을 수행합니다.

 

하지만 이번 실습에서는 view를 작성하지 않았기 때문에 Controller에서 간단하게 Console 출력을 하도록 하겠습니다.

 


프로그램 수행

프로그램의 최초 진입점은 Controller의 main 메서드 입니다. 

 

사용자로부터 원하는 작업을 메뉴에 따라 입력받고 이를 수행하는 프로그램입니다.

 

...

 


이로써 JAVA 와 Oracle DB 연동에 관련된 포스팅을 마치도록 하겠습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함