JAVA

[자바/JAVA] 프로그래밍 - 종합 예제(MVC)

21종 2023. 6. 20. 19:20

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

		
	}

}

실행 결과

MVC.jar
0.02MB