Back-End

[JAVA] 기초 공부 13 MVC

Minch13r 2025. 1. 22. 11:09

String을 Int로 바꿀 때 int i = Integer.parseInt(”10”); 이런식으로 진행한다.

parseInt는 객체와 무관한 static 형식이기 때문에 선언할 때 new를 하지 않아도 된다.

웹에서 모든 데이터는 문자열 타입으로 주고 받음. 그래서 parseInt를 많이 쓴다.

 

Model의 역할

  • 자료형(DTO, VO)을 정의
  • CRUD, 비즈니스 메서드, 핵심 관심, 핵심 기능
  • DB, DBMS, DATA 등을 관리

 

View의 역할

  • 화면(콘솔, 웹 브라우저, 사용자, 클라이언트)에 출력을 담당
  • 사용자(클라이언트, 화면, 콘솔, 웹 브라우저)로부터 입력을 받아오는 역할
  • 사용자와의 소통을 관리

Controller의 역할

  • Model과 View를 연결하는 역할
  • model과 view를 멤버변수로 가져야함 ex) Model model; View view;
  • 생성자에서 초기화를 해줘야 사용이 가능하다

MVC 예시

Model

package day016.model;

import java.util.ArrayList;

// DAO(Data Access Object)
// CRUD 메서드만 가짐
// DAO는 이와 같이 5개의 메서드만 가질 수 있음(고정)
// selectAll(list), selectOne(DTO), insert(boolean), update(boolean), delete(boolean)
// 자신한테 없는거는 외부에서 받아와야 함
public class StudentDAO {
    // DB의 역할
    private ArrayList<StudentDTO> datas;

    // 생성자
    public StudentDAO(){
        this.datas = new ArrayList<>();
        // 샘플 데이터 추가
        this.datas.add(new StudentDTO(1001, "티모", 98));
        this.datas.add(new StudentDTO(1002, "모르가나", 64));
        this.datas.add(new StudentDTO(1003, "오리아나", 40));
    }

    // 전체 다 받아오는 것
    public ArrayList<StudentDTO> selectAll() {
        // Controller에서 전체출력하겠다. 라고 하면
        // 내가 가지고 있던 DB의 내용을 모두
        // Controller로 전달
        ArrayList<StudentDTO> datas = new ArrayList<>();
        // selectAll 하면 리스트 형태를 모두 전달할거고
        // 리스트 안에는 DB 안에 있는 내용이 모두 들어가 있어야 한다.
        // datas 리스트의 크기만큼 반복해서 모든 내용 출력
        for(int i=0; i<this.datas.size(); i++){
            int num = this.datas.get(i).getNum();
            String name=this.datas.get(i).getName();
            int score=this.datas.get(i).getScore();
            datas.add(new StudentDTO(num, name, score));
        }
        // datas 값 반환(모든 내용 출력해야 하니까)
        return datas;
    }

    // 한가지만 받아오는 거
    public StudentDTO selectOne(int num) {
        // 검색할게 없으면 안 나와야 하니까 null 맞음
        StudentDTO data = null;
        // 처음부터 끝까지 돌면서
        for(int i=0; i<this.datas.size(); i++){
            // 같은 번호 발견하면
            if(num == this.datas.get(i).getNum()){
                String name=this.datas.get(i).getName();
                int score=this.datas.get(i).getScore();
                data = new StudentDTO(num, name, score);
            }
        }
        // 반환(한개만)
        return data;
    }
    /*
    selectAll이랑 selectOne 차이점이 뭐냐면 All은 반복문을 다 돌면서
    모든 내용을 다 출력하는거임. 하지만 One은 반복문을 다 돌면서 들어온 값에
    해당되는 번호를 선택해서 그 번호 안에 있는 정보'만' 출력하는거임
    */
    
    // 학생 생성 메서드
    public boolean insert(String name, int score, int num){
        // 이름이랑 정수를 받아서
        // 그것에 해당하는 학생을 생성
        // 배열(db)에 추가
        this.datas.add(new StudentDTO(num, name, score));
        return true;
    }

    // 학생 수정 메서드
    public boolean update(int num, String name){
        for(int i=0; i<this.datas.size(); i++){
            if(num == this.datas.get(i).getNum()){
                this.datas.get(i).setName(name);
                return true;
            }
        }
        return false;
    }

    // 학생 삭제 메서드
    public boolean delete(int num){
        for(int i=0; i<this.datas.size(); i++){
            if(num == this.datas.get(i).getNum()){
                this.datas.remove(i);
                return true;
            }
        }
        return false;
    }
}
package day016.model;

// VO(Value Object), DTO(Data Transfer Object)
public class StudentDTO {
    private int num; // pk(primary key)
    private String name;
    private int score;

    public StudentDTO(int num, String name, int score){
        this.num = num;
        this.name = name;
        this.score = score;
    }

    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }

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

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

    @Override
    public String toString() {
        return "StudentDTO{" + "num=" + num + ", name='" + name + '\'' + ", score=" + score + '}';
    }
}

 

View

package day016.view;

import day008.class02.Student;
import day016.model.StudentDTO;

import java.util.ArrayList;
import java.util.Scanner;

public class View { // printMenu를 숨길 이유가 없어서 public이 붙음
    // 공통적으로 값을 가지고 있는 공유자원이기 때문에 멤버변수로 지정
    private Scanner sc;
    // new는 생성자에서 진행
    public View(){
        this.sc = new Scanner(System.in);
    }


    public int inputNum(){
        System.out.print("학생번호입력 >>");
        int num = this.sc.nextInt();
        return num;
    }

    public void printData(StudentDTO data){
        if(data == null){
            System.out.println("출력할 결과가 없습니다!");
            return;
        }
        System.out.println(data);
    }

    public String inputName() {
        System.out.print("학생이름 >>");
        String name = this.sc.next();
        return name;
    }

    public int inputScore(){
        System.out.print("학생성적 입력 >>");
        int score = this.sc.nextInt();
        return score;
    }

    public void printInsertTrue(){
        System.out.println("학생추가가 완료되었습니다!");
    }

    public void printUpdateTrue(){
        System.out.println("학생이름 변경이 완료되었습니다!");
    }

    public void printUpdateFalse(){
        System.out.println("학생이름 변경에 실패했습니다...");
    }

    public void printDeleteTrue(){
        System.out.println("학생 삭제가 완료되었습니다!");
    }

    public void printDeleteFalse(){
        System.out.println("학생 삭제가 실패했습니다...");
    }

    public void printDatas(ArrayList<StudentDTO> datas){
        if(datas==null || datas.size()<=0) {
            System.out.println("출력할 결과가 없습니다!");
            return;
        }

        for(StudentDTO v : datas){
            System.out.println(v);
        }
    }
    public void printMenu(){
        System.out.println("=== 학생부 ===");
        System.out.println("1. 학생추가");
        System.out.println("2. 전체출력");
        System.out.println("3. 학생번호로검색");
        System.out.println("4. 학생이름변경");
        System.out.println("5. 학생삭제");
        System.out.println("0. 프로그램종료");
    }
    public int inputMenuNum(){
        System.out.print("메뉴번호입력 >> ");
        int num = sc.nextInt();
        return num;
    }

    public void printShutdown() {
        for(int i=0; i<3; i++) {
            System.out.print(".");
            try {
                Thread.sleep(500);
            } catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        System.out.println("학생부 종료!");
        System.out.println("이용해주셔서 감사합니다.");
    }
}

 

Controller

package day016.controller;

import day016.model.StudentDAO;
import day016.model.StudentDTO;
import day016.view.View;

import java.util.ArrayList;

public class Controller {
    private StudentDAO model;
    private View view;
    private int NUM;
    public Controller(){
        this.model = new StudentDAO();
        this.view = new View();
        this.NUM = 1004;
    }

    public View getView() {
        return view;
    }

    public void setView(View view) {
        this.view = view;
    }

    public void startApp(){
        while(true){
            this.view.printMenu();
            int menuNum = this.view.inputMenuNum();

            // 프로그램 종료
            if(menuNum == 0){
                this.view.printShutdown();
                break;
            }

            // 학생추가
            else if (menuNum==1) {
                String name = this.view.inputName();
                int score = this.view.inputScore();
                boolean flag = this.model.insert(name, score, this.NUM++);

                if(flag){
                    this.view.printInsertTrue();
                }
            }

            // 전체출력
            else if (menuNum==2) {
                ArrayList<StudentDTO> datas = this.model.selectAll();
                this.view.printDatas(datas);
            }

            // 학생번호로검색
            else if (menuNum==3) {
                int num = this.view.inputNum();
                StudentDTO data = this.model.selectOne(num);
                this.view.printData(data);
            }

            // 학생이름변경
            else if (menuNum==4) {
                /*사용자에게 번호받아서
                * 해당번호의 학생 새로운 이름 받고 변경한 후에 변경완료 화면 띄우기*/
                int num = this.view.inputNum();
                String name = this.view.inputName();
                boolean flag = this.model.update(num, name);

                if(flag){
                    this.view.printUpdateTrue();
                } else {
                    this.view.printUpdateFalse();
                }
            }

            // 학생삭제
            else if (menuNum==5) {
                int num = this.view.inputNum();
                boolean flag = this.model.delete(num);

                if(flag){
                    this.view.printDeleteTrue();
                } else {
                    this.view.printDeleteFalse();
                }
            }
        }
    }
}

 

Controller는 Model와 View를 합친거라고 보면 된다. 음식점에서는 요리사가 Model이고 주문하는게 View, 웨이터가 Controller라고 생각하면 된다. 웨이터한테 주문 넣고 그 주문 처리를 요리사가 하고 주문한 음식을 주문한 사람한테 웨이터가 주는 과정이다.

 

Main

package day016.client;

import day016.controller.Controller;

public class Client {
    public static void main(String[] args) {
        Controller app = new Controller();
        app.startApp();
    }
}

UML

  1. Client 클래스
    • 프로그램의 시작점으로, Controller를 생성하고 실행합니다.
  2. Controller 클래스
    • Model(StudentDAO)과 View를 연결하는 중심 역할을 합니다.
    • StudentDAO와 View 객체를 가지고 있습니다.
  3. View 클래스
    • 사용자 인터페이스를 담당합니다.
    • 메뉴 출력과 사용자 입력을 처리합니다.
  4. StudentDAO 클래스
    • 데이터 접근 객체로, StudentDTO 객체들을 관리합니다.
    • CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
  5. StudentDTO 클래스
    • 데이터 전송 객체로, 학생 정보를 캡슐화합니다.
    • 기본적인 getter/setter 메서드를 제공합니다.

화살표와 선의 의미:

  • : 의존 관계 
  • -- : 집합 관계 (Aggregation)

 

가장 최근에 갱신된 코드는 제 깃허브에서 확인 가능합니다. 가장 하단으로 가면 관련사이트를 클릭하면 확인할 수 있습니다.

'Back-End' 카테고리의 다른 글

[JAVA] 기초 공부 15 크롤링  (5) 2025.01.24
[JAVA] 기초 공부 14 MVC-1  (1) 2025.01.23
[JAVA] 기초 공부 12 File I/O  (2) 2025.01.21
[JAVA] 기초공부 11 제네릭과 컬렉션  (1) 2025.01.20
[JAVA] 3중 상속과 인터페이스  (4) 2025.01.17