MVC패턴 : 각 클래스마다 역할을 부여해서 작업(데이터, 화면, 요청처리)을 부여해서 작업
=> 유지보수 용이하다
- M(Model) : 데이터를 담당하는 역할(데이터를 담기위한 클래스, 비즈니스 로직 처리하기 위한 클래스, 데이터가 보관되어 있는 보관함과 연결해서 입출력)
- V(view) : 화면을 담당하는 역할 즉, 사용자에게 보여지는 시각적인 요소 (출력문(print), 입력문(Scanner))
- C(controller) : 사용자가 요청한 내용을 처리한 후 그 결과를 돌려주는 역할 (출력문 같은 거 안쓸꺼임!!)
예제)
메뉴
1. 새로운 곡 추가
2. 곡 전체 조회
3. 특정곡 삭제
4. 특정곡 검색
5. 특정곡 수정
0. 프로그램 종료
Music Class
package com.kh.chap01_list.part02_mvc.model.vo;
public class Music {
private String title;
private String artist;
public Music() {
}
public Music(String title, String artist) {
super();
this.title = title;
this.artist = artist;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
@Override
public String toString() {
return "Music [title=" + title + ", artist=" + artist + "]";
}
}
MusicController Class
package com.kh.chap01_list.part02_mvc.controller;
import java.util.ArrayList;
import com.kh.chap01_list.part02_mvc.model.vo.Music;
// 사용자의 요청 처리해주는 클래스!! 출력문 쓰지 않기!
public class MusicController {
private ArrayList<Music> list = new ArrayList<>(); // []
{
// 초기화 블럭
list.add(new Music("Attention", "뉴진스")); // [Music [Attention, 뉴진스]]
list.add(new Music("새삥", "지코"));
list.add(new Music("새삥 말고 헌삥", "이원종"));
}
public void insertMusic(String title, String artist) {
list.add(new Music(title, artist));
}
public ArrayList<Music> selectMusic() {
// 돌려준다 => return
return list;
}
// 1. 간단버전
public int deleteMusic(String title) {
int result = 0;
for(int i = 0; i < list.size(); i++) {
if(list.get(i).getTitle().equals(title)) {
list.remove(i);
result = 1;
break;
}else {
result = 0;
}
}
return result;
}
// 2. 심화버전
public ArrayList<Music> searchMusic(String keyword) {
ArrayList<Music> searchList = new ArrayList<Music>(); // 변수가 아닌 arrayList를 생성한 이유 : 검색결과가 여러개 있을 수도 있기 때문에
for(int i = 0; i < list.size(); i++) {
if(list.get(i).getTitle().contains(keyword)) {
searchList.add(list.get(i));
}
}
// searchList => 텅비어있을 수도 있음 | 검색된 Music 객체들이 담겨있을수도 있음
return searchList;
}
public ArrayList<Music> searchMusic(int menu, String keyword) {
ArrayList<Music> searchList = new ArrayList<>();
if(menu == 1) { // 1. 제목으로 검색
for(int i = 0; i < list.size(); i++) {
if(list.get(i).getTitle().contains(keyword)) {
searchList.add(list.get(i));
}
}
}else { // 2. 가수명으로 검색
for(int i = 0; i < list.size(); i++) {
if(list.get(i).getArtist().contains(keyword)) {
searchList.add(list.get(i));
}
}
}
return searchList;
/* // 메뉴가 2개일때 switch문은 별로다.
switch(menu) {
case 1 : // 1. 제목으로 검색
for(int i = 0; i < list.size(); i++) {
if(list.get(i).getTitle().contains(keyword)) {
searchList.add(list.get(i));
}
}
break;
case 2 : // 2. 가수명으로 검색
for(int i = 0; i < list.size(); i++) {
if(list.get(i).getArtist().contains(keyword)) {
searchList.add(list.get(i));
}
}
break;
}
return searchList;
*/
}
public int updateMusic(String title, String upArtist, String upTitle) {
/*
boolean flag = false;
for(int i = 0; i < list.size(); i++) {
if(list.get(i).getTitle().equals(title)) {
list.get(i).setArtist(upArtist);
list.get(i).setTitle(upTitle);
flag = true;
}
}
return flag;
*/
int result = 0;
for(int i = 0; i < list.size(); i++) {
Music m = list.get(i);
if(m.getTitle().equals(title)) {
m.setTitle(upTitle);
m.setArtist(upArtist);
result = 1;
break;
}
}
return result;
}
}
MusicMenu Class
package com.kh.chap01_list.part02_mvc.view;
import java.util.ArrayList;
import java.util.Scanner;
import com.kh.chap01_list.part02_mvc.controller.MusicController;
import com.kh.chap01_list.part02_mvc.model.vo.Music;
// 화면을 담당하는 클래스 (출력문, 입력문)
/**
* @author lwj
* @since 2023.06.20
* @version 1.0
*
*/
public class MusicMenu {
private MusicController mc = new MusicController();
private Scanner sc = new Scanner(System.in);
// 메인화면 : 프로그램 실행시 처음 보여주는 화면
public void mainMenu() {
while(true) {
System.out.println("\n============== Welcome 별밤 ================");
System.out.println("1. 새로운 곡 추가");
System.out.println("2. 곡 전체 조회");
System.out.println("3. 특정곡 삭제");
System.out.println("4. 특정곡 검색");
System.out.println("5. 특정곡 수정");
System.out.println("0. 프로그램 종료");
System.out.print(">> 메뉴선택 : ");
int menu = sc.nextInt();
sc.nextLine(); // 메뉴선택한 후 buffer에 남아있는 개행 제거
switch(menu) {
case 1 :
insertMusic();
break;
case 2 :
selectMusic();
break;
case 3 :
deleteMusic();
break;
case 4 :
searchMusic();
break;
case 5 :
updateMusic();
break;
case 0 :
System.out.println("프로그램을 종료합니다. 이용해줘서 감사합니다.");
return;
default :
System.out.println("메뉴를 잘못 선택했습니다. 다시 선택해주세요.");
break;
}
}
}
// alt + shift + j 메소드 주석
/**
* 1. 새로운 곡 추가하는 서브화면
*/
public void insertMusic() {
System.out.println("\n============== 새로운 곡 추가 ================");
System.out.print("제목 입력 : ");
String title = sc.nextLine();
System.out.print("가수 입력 : ");
String artist = sc.nextLine();
// 곡 추가 요청 보내기! (사용자의 요청 처리해주는 컨트롤러단에!)
// 사용자가 입력한 곡명, 가수명 같이 넘기면서!!
// 즉, Controller 메소드 호출
mc.insertMusic(title, artist);
System.out.println("성공적으로 곡이 추가되었습니다.");
}
/**
* 2. 전체 곡 조회용 서브화면
*/
public void selectMusic() {
System.out.println("\n============== 전체 곡 리스트 ================");
// 전체곡 조회 요청! (controller 메소드 호출)
ArrayList<Music> list = mc.selectMusic();
/* 리스트가 비어있을 때는 이 for문이 안돈다. .size가 0이기 때문
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
*/
if(list.isEmpty()) { // 현재 리스트가 비어있을 경우
System.out.println("현재 존재하는 곡이 없습니다.");
}else { // 그게 아닐 경우(즉, 뭐라도 담겨 있을 경우)
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
/**
* 3. 특정 곡 삭제시켜주는 서브화면
*/
public void deleteMusic() {
System.out.println("\n============== 특정 곡 삭제 ================");
System.out.print("삭제하고자 하는 곡 명 : ");
String title = sc.nextLine();
int result = mc.deleteMusic(title);
if(result == 1) { // 삭제가 잘 된 경우
System.out.println("성공적으로 삭제됐습니다.");
selectMusic();
}else { // 삭제가 안 된 경우
System.out.println("삭제할 곡을 찾지 못했습니다.");
}
}
/**
* 4. 특정 곡 검색해주는 서브화면
*/
public void searchMusic() {
System.out.println("\n============== 특정 곡 검색 ================");
/* 1. 간단버전
System.out.println("검색할 곡 명 (키워드만도 가능) : ");
String keyword = sc.nextLine();
ArrayList<Music> searchList = mc.searchMusic(keyword);
*/
// 2. 심화버전
System.out.println("1) 제목으로 검색");
System.out.println("2) 가수명으로 검색");
System.out.print(">> 메뉴 선택 : ");
int menu = sc.nextInt();
sc.nextLine();
System.out.print("검색 키워드 : ");
String keyword = sc.nextLine();
ArrayList<Music> searchList = mc.searchMusic(menu,keyword);
System.out.println("\n============== 검색 결과 ================");
if(searchList.isEmpty()) { // 텅 비어있을 경우
System.out.println("검색 결과가 없습니다.");
}else { // 뭐라도 있는 경우
for(int i = 0; i < searchList.size(); i++) {
System.out.println(searchList.get(i));
}
}
}
/**
* 5. 특정 곡 수정해주는 서브화면
*/
public void updateMusic() {
System.out.println("\n============== 특정 곡 수정 ================");
System.out.print("수정 하고자 하는 곡명 : ");
String title = sc.nextLine();
System.out.print("수정 내용(가수) : ");
String upArtist = sc.nextLine();
System.out.print("수정 내용(곡명) : ");
String upTitle = sc.nextLine();
/*
// mc의 updateMusic(title, upArtist, uptitle)
boolean result = mc.updateMusic(title, upArtist, upTitle);
// 수정이 잘됐다고 하면
// 성공적으로 수정되었습니다.
if(result == true) {
mc.selectMusic();
System.out.println("성공적으로 수정되었습니다.");
selectMusic();
}else {
System.out.println("수정할 곡을 찾지 못했습니다.");
}
// 수정할 곡을 찾지 못했습니다.
*/
int result = mc.updateMusic(title, upArtist, upTitle);
if(result > 0) {
System.out.println("성공적으로 수정 되었습니다.");
selectMusic();
}else {
System.out.println("수정할 곡을 찾지 못했습니다.");
}
}
}
MVCRun Class
package com.kh.chap01_list.part02_mvc.run;
import com.kh.chap01_list.part02_mvc.view.MusicMenu;
public class MVCRun {
public static void main(String[] args) {
MusicMenu mm = new MusicMenu();
mm.mainMenu();
}
}
실행 결과