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();
}
}

- Client 클래스
- 프로그램의 시작점으로, Controller를 생성하고 실행합니다.
- Controller 클래스
- Model(StudentDAO)과 View를 연결하는 중심 역할을 합니다.
- StudentDAO와 View 객체를 가지고 있습니다.
- View 클래스
- 사용자 인터페이스를 담당합니다.
- 메뉴 출력과 사용자 입력을 처리합니다.
- StudentDAO 클래스
- 데이터 접근 객체로, StudentDTO 객체들을 관리합니다.
- CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
- 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 |