웹 크롤링을 추가해서 연습.
View
package view;
import java.util.ArrayList;
import java.util.Scanner;
import model.MemberVO;
import model.MusicVO;
public class ClientView {
// [멤버변수]
private static Scanner sc = new Scanner(System.in);
// [함수]
public int tryCatch() {
// try-catch
int retry = 0;
while (true) {
try {
if(retry != 0) {
System.out.print("재");
}
System.out.print("입력 : ");
int action = sc.nextInt();
if(action < 0 ) {
System.out.println("\n'0'이상의 숫자만 입력 가능합니다.");
retry++;
continue;
}
return action;
}
catch (Exception e) {
sc.nextLine();
System.out.println("\n숫자만 입력 가능합니다.");
retry++;
}
}
}
public int printMain() {
// 웹페이지 안내 출력
System.out.println();
System.out.println("===== 웹페이지 =====");
System.out.println("1. 로그인");
System.out.println("2. 회원가입");
System.out.println("0. 프로그램 종료");
System.out.println("==================");
return 2;
}
public int printMusic(MemberVO mVO) {
// 멜론 메뉴 출력
System.out.println();
System.out.println("========== 멜 론 ==========");
System.out.println(mVO.getName() + " 님 환영합니다.");
System.out.println("1. 노래 목록 출력");
System.out.println("2. 플레이리스트");
System.out.println("3. 최고 스트리밍 횟수 노래 출력");
System.out.println("4. 최저 스트리밍 횟수 노래 출력");
System.out.println("5. 노래 검색");
System.out.println("6. 노래 재생");
System.out.println("7. 노래 랜덤 재생");
System.out.println("8. 마이 페이지");
System.out.println("0. 로그아웃");
System.out.println("==========================");
return 8;
}
public int printMyPageMenu() {
// 마이페이지 메뉴 출력
System.out.println();
System.out.println("===== 마 이 페 이 지 =====");
System.out.println("1. 비밀번호 변경");
System.out.println("2. 이름 변경");
System.out.println("0. 뒤로가기");
System.out.println("=======================");
return 2;
}
public int getNum(int tryCatchNum) {
// 실행 번호 입력
int retry = 0;
while(true) {
if (retry != 0) {
System.out.print("재");
}else {
System.out.print("번호 ");
}
int action = tryCatch();
if (action > tryCatchNum) {
// 목록당 최대로 입력 할 수 있는 번호.
System.out.println("\n번호가 일치하지 않습니다.");
retry++;
continue;
}
return action;
}
}
public int getMusicNum(int action) {
int retry = 0;
while(true) {
if (retry != 0) {
System.out.print("재");
}
else {
if(action == 2 || action == 4) {
System.out.print("추가할");
}
else if(action == 6) {
System.out.print("재생할");
}
System.out.println(" 노래 번호 ");
}
int num = tryCatch();
if (action > 101) {
// 최대 노래 개수를 넘길 수 없다.
System.out.println("\n번호가 일치하지 않습니다.");
retry++;
continue;
}
return num;
}
}
public void exitNum() {
// 나가기 문구
System.out.println("\n[나가기 0번]");
System.out.println();
}
public void exitNumEnd() {
// 나가기 완료
System.out.println("\n나가기 성공 !");
}
public void programEnd() {
// 프로그램 종료
System.out.println("\n프로그램 종료 !");
}
public void playMusic(MusicVO vo) {
// 재생 완료.
System.out.println();
System.out.println("[" + vo.getArtist() + " - " + vo.getTitle() + "] 재생합니다.");
}
public void printMusicList(ArrayList<MusicVO> datas,int action) {
// 각 상황에 맞게 리스트 출력.
System.out.println();
if(datas.isEmpty()) {
System.out.println("===== 노 래 없 음 =====");
return;
}
else if(action == 1) {
System.out.println("===== 노 래 목 록 =====");
}
else if(action == 2) {
System.out.println("===== 플 레 이 리 스 트 =====");
}
else if(action == 3) {
System.out.println("===== 최고 스트리밍 횟수 =====");
}
else if(action == 4) {
System.out.println("===== 최저 스트리밍 횟수 =====");
}
else if(action == 5) {
System.out.println("===== 검 색 결 과 =====");
}
for(MusicVO data : datas) {
System.out.println(data);
}
}
// 플레이리스트
public void printPlayListEmpty () {
// 플리 출력 실패
System.out.println("\n===== 노 래 없 음 =====");
}
public void printPlayListStart () {
// 플리 출력 시작
System.out.println("\n===== 플 레 이 리 스 트 =====");
}
public void printPlayListEnd () {
// 플리 출력 완료
System.out.println("============================");
}
public void printMusicOne(MusicVO vo) {
// 노래 한개 출력
System.out.println(vo);
}
public void isAddPlayList() {
// 플리 추가할번호 문구
System.out.println("\n플레이리스트에 추가할 번호를 입력해주세요.");
}
public void addPlayListFailDuplicate() {
// 플리 추가 실패 - 중복
System.out.println("\n이미 플레이리스트에 저장되어 있습니다.");
}
public void addPlayListFailNum() {
// 플리 추가 실패 - 번호
System.out.println("\n검색결과에 없는 번호입니다.");
}
public void addPlayListTrue(MusicVO vo) {
// 플리 추가 성공
System.out.println("\n[" + vo.getArtist() + " - " + vo.getTitle() + "] 추가합니다.");
}
public MemberVO signUp() {
// 회원 가입
System.out.println();
System.out.println("===== 회 원 가 입 =====");
System.out.print("아이디 입력 : ");
String mID = sc.next();
System.out.print("비밀번호 입력 : ");
String mPW = sc.next();
System.out.println("비밀번호 확인");
String mPWCheck = sc.next();
if(mPW.equals(mPWCheck)) {
System.out.print("이름 입력 : ");
String name = sc.next();
return new MemberVO(mID,mPW,name);
}
System.out.println("log : ClientView : signUp() : 비밀번호가 동일 하지 않습니다.");
return null;
}
public void signUpTrue() {
System.out.println();
System.out.println("회원가입 성공 !");
}
public void signUpFalse() {
System.out.println();
System.out.println("회원가입 실패...");
}
// 마이페이지
public String getMpw() {
// 비번 입력값
System.out.println("\n===== 비 밀 번 호 확 인 =====");
System.out.print("비밀번호 입력 : ");
String mpw = sc.next();
return mpw;
}
public void getMpwFalse() {
// 비밀번호 불일치
System.out.println("\n비밀번호 불일치...");
}
public String getSetMpw() {
// 새 비밀번호 설정
System.out.print("\n새 비밀번호 입력 : ");
String mpw = sc.next();
return mpw;
}
public void printSetMpwTrue() {
// 새 비밀번호 설정 성공
System.out.println("\n비밀번호 변경 성공 !");
}
public void printSetMpwFalse() {
// 새 비밀번호 설정 실패
System.out.println("\n비밀번호 변경 실패...");
}
public String getSetMname() {
// 새 이름 설정
System.out.print("\n새 이름 입력 : ");
String mpw = sc.next();
return mpw;
}
public void printSetMnameTrue() {
// 새 이름 설정 성공
System.out.println("\n이름 변경 성공 !");
}
public void printSetMnameFalse() {
// 새 이름 설정 실패
System.out.println("\n이름 변경 실패...");
}
public MemberVO signIn() {
System.out.println();
System.out.println("===== 로 그 인 =====");
System.out.print("아이디 입력 : ");
String mID = sc.next();
System.out.print("비밀번호 입력 : ");
String mPW = sc.next();
return new MemberVO(mID,mPW,null);
}
public void signInTrue() {
System.out.println();
System.out.println("로그인 성공 !");
}
public void signInFalse() {
System.out.println();
System.out.println("로그인 실패...");
}
public void logout() {
System.out.println();
System.out.println("===== 로 그 아 웃 =====");
}
public void printMusicEnd() {
System.out.println();
System.out.println("===== 멜 론 종 료 ====");
}
public String getSearchContent() {
System.out.println();
System.out.println("===== 노 래 검 색 =====");
System.out.println("검색어 입력 : ");
String search = sc.next();
return search;
}
} // ClientView
Model
package model;
import java.util.ArrayList;
public class MemberVO {
// [멤버변수]
private String mID;
// 회원 PK.
private String mPW;
// 비밀번호.
private String name;
// 이름(닉네임).
private ArrayList<Integer> playList;
// 각 회원마다 가져야할 플레이리스트라서 VO의 멤버변수로 설정.
// [생성자]
public MemberVO(String mID,String mPW,String name) {
// 아이디는 사용자로부터 입력받기 때문에 중복 검사 필수.
this.mID = mID;
this.mPW = mPW;
this.name = name;
this.playList = new ArrayList<Integer>();
}
// [함수]
public boolean insert(MusicVO vo) {
// Create =>
// 플레이리스트를 의미하는 배열리스트에
// 번호를 (노래번호(PK)) 추가하기 위한 메서드.
boolean flag = true;
for(int i = 0; i < playList.size(); i++) {
if(playList.get(i) == vo.getNum()) {
flag = false;
break;
}
}
if(!flag) {
System.out.println("log : MemberVO : insert() : 이미 존재하는 노래(번호) 입니다.");
return false;
}
playList.add(vo.getNum());
// 중복된 노래(번호)가 없으면,
// 플레이리스트 배열리스트에 그 번호 추가 ~
return true;
}
@Override
public boolean equals(Object obj) {
// 기존에 생성되어있는 아이디와
// 회원가입 하려고 입력받은 아이디가 같은지
// 비교하기 위한 equals() 재정의.
MemberVO mVO = (MemberVO)obj;
if(this.mID.equals(mVO.getmID())) {
return true;
}
return false;
}
@Override
public String toString() {
// toString() 재정의.
return this.name + "님 환영 합니다.";
}
public ArrayList<Integer> getPlayList() {
return playList;
}
public void setPlayList(ArrayList<Integer> playList) {
this.playList = playList;
}
public String getmID() {
return mID;
}
public void setmID(String mID) {
this.mID = mID;
}
public String getmPW() {
return mPW;
}
public void setmPW(String mPW) {
this.mPW = mPW;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} // MemberVO
package model;
import java.util.ArrayList;
// 회원목록출력
// 회원가입, 로그인,
// 마이페이지 (비밀번호 변경 기능, 이름 변경 기능),
// 로그아웃, 회원탈퇴.
public class MemberDAO {
// 예외적으로 PK(아이디)는 사용자로 부터 입력을 받기 때문에 멤버변수 XXX
// [멤버변수]
ArrayList<MemberVO> datas;
// 회원을 담을 배열리스트.
// [생성자]
public MemberDAO() {
datas = new ArrayList<MemberVO>();
datas.add(new MemberVO("admin","1234","관리자"));
datas.add(new MemberVO("user","1234","일반유저"));
datas.add(new MemberVO("1","1","테스트"));
}
// [함수]
public ArrayList<MemberVO> selectAll(MemberVO vo) {
// Read => 회원목록출력.
if(vo == null) {
return datas;
}
return null;
}
public MemberVO selectOne(MemberVO vo) {
// Read => 로그인 했을 때 사용자 (객체)를 의미.
for(MemberVO data : datas) {
if(data.getmID().equals(vo.getmID())) {
if(data.getmPW().equals(vo.getmPW())) {
return data;
}
System.out.println("log : MemberDAO : selectOne() : 비밀번호가 일치 하지 않습니다.");
return null;
}
}
System.out.println("log : MemberDAO : selectOne() : 존재 하지 않는 아이디 입니다.");
return null;
}
public boolean insert(MemberVO vo) {
// Create => 회원가입. // 중복 검사 필수.
boolean flag = true;
for(MemberVO data : datas) {
if(data.getmID().equals(vo.getmID())) {
flag = false;
System.out.println("log : MemberDAO : insert() : 존재하는 아이디 입니다.");
break;
}
}
if(!flag) {
return false;
}
datas.add(new MemberVO(vo.getmID(),vo.getmPW(),vo.getName()));
return true;
}
public boolean update(MemberVO vo) {
// Update => 마이페이지 기능 => 1. 비밀번호 변경. 2. 이름 변경.
if(vo.getName().equals("비밀번호변경")) {
for(MemberVO data : datas) {
if(data.equals(vo)) {
data.setmPW(vo.getmPW());
return true;
}
}
}
if(vo.getmPW().equals("이름변경")) {
for(MemberVO data : datas) {
if(data.equals(vo)) {
data.setName(vo.getName());
return true;
}
}
}
return false;
}
public boolean delete(MemberVO vo) {
// Delete => 회원탈퇴.
for(int i = 0; i < datas.size(); i++) {
if(datas.get(i).equals(vo)) {
datas.remove(i);
return true;
}
}
return false;
}
} // MemberDAO
package model;
public class MusicVO {
// [멤버변수]
private int num;
// 노래 고유 번호.
private String artist;
// 노래 가수.
private String title;
// 노래 제목.
private int cnt;
// 스트리밍 횟수.
// [생성자]
public MusicVO(int num,String artist,String title,int cnt) {
this.num = num;
this.artist = artist;
this.title = title;
this.cnt = cnt;
}
// [함수]
@Override
public boolean equals(Object obj) {
// 노래 고유 번호가 맞는지를
// 비교 하기 위한 equals() 재정의.
MusicVO MusicVO = (MusicVO)obj;
if(this.num == MusicVO.num) {
return true;
}
return false;
}
@Override
public String toString() {
// toString() 재정의.
String msg = this.num + ". [" + this.artist + " - " + this.title + "] [플레이 수 : " + this.cnt + "]";
return msg;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
} // MusicVO
package model;
import java.util.ArrayList;
// 노래목록출력, 노래이름검색,
// 노래 최고 스트리밍 횟수 검색,
public class MusicDAO {
// [멤버변수]
private ArrayList<MusicVO> datas;
// 노래를 담을 배열리스트.
// [생성자]
public MusicDAO() {
datas = new ArrayList<MusicVO>();
datas = Crawling.sample();
// 기존 ArrayList<MusicVO> 에 덮어씌우는 개념 이다.
// .add() 가 아니다.
datas.add(new MusicVO(Crawling.PK++,"볼빨간사춘기","좋다고말해",Crawling.cnt));
// 테스트용 샘플.
}
// [함수]
public ArrayList<MusicVO> selectAll(MusicVO vo) {
// Read => 1. 노래목록출력. 2. 이름검색. 3. 스트리밍 횟수 검색.
if(vo == null) {
return datas;
}
else if(vo.getCnt() == 1) {
// 밖에서 준 객체 묶음 안의
// cnt 부분이 1이면 "이름 검색" == KeyWord.
ArrayList<MusicVO> mdatas = new ArrayList<MusicVO>();
for(MusicVO data : datas) {
if(data.getArtist().contains(vo.getArtist()) || data.getTitle().contains(vo.getTitle())) {
mdatas.add(data);
}
}
return mdatas;
}
else if(vo.getNum() == 1) {
// 밖에서 준 객체 묶음 안의
// num 부분이 1이면
// "최고 스트리밍 횟수 검색" == KeyWord.
ArrayList<MusicVO> maxCntDatas = new ArrayList<MusicVO>();
int max = datas.get(0).getCnt();
// 스트리밍 횟수가 제일 높은 아이를
// 0번째 노래(객체)로 설정.
/*
for(MusicVO data : datas) {
if(max < data.getCnt()) {
max = data.getCnt();
}
}
int index = 0;
for(MusicVO data : datas) {
index++;
if(max == data.getCnt()) {
maxCntDatas.add(datas.get(index));
}
}
*/
for(int i = 0; i < datas.size(); i++) {
if(max < datas.get(i).getCnt()) {
max = datas.get(i).getCnt();
}
}
for(int i = 0; i < datas.size(); i++) {
// 최고를 구했는데,
// 동일한게 있으면 걔네를 배열리스트에 추가 해줘.
if(max == datas.get(i).getCnt()) {
maxCntDatas.add(datas.get(i));
}
}
return maxCntDatas;
}
else if(vo.getNum() == -1) {
// 밖에서 준 객체 묶음 안의
// num 부분이 -1이면
// "최저 스트리밍 횟수 검색" == keyWord.
ArrayList<MusicVO> minCntDatas = new ArrayList<MusicVO>();
int min = datas.get(0).getCnt();
// 스트리밍 횟수가 제일 낮은 아이를
// 0번째 노래(객체)로 설정.
for(MusicVO data : datas) {
if(min > data.getCnt()) {
min = data.getCnt();
}
}
for(int i = 0; i < datas.size(); i++) {
// 최저를 구했는데,
// 동일한게 있으면 걔네를 배열리스트에 추가 해줘.
if(min == datas.get(i).getCnt()) {
minCntDatas.add(datas.get(i));
}
}
return minCntDatas;
}
return null;
}
public MusicVO selectOne(MusicVO vo) {
// Read => 노래 1개 출력.
if(vo.getArtist().equals("플리추가")) {
// 노래번호만 받고 노래를 return 해주는 기능.
for(MusicVO data : datas) {
if(data.getNum() == vo.getNum()) {
MusicVO playListVO = new MusicVO(data.getNum(),data.getArtist(),data.getTitle(),data.getCnt());
return playListVO;
}
}
}
else if(vo.getArtist().equals("일반재생") || vo.getArtist().equals("랜덤재생")) {
for(int i = 0; i < datas.size(); i++) {
if(datas.get(i).getNum() == vo.getNum()) {
return datas.get(i);
}
}
System.out.println("log : MusicDAO : selectOne() : 노래 번호가 유효 하지 않습니다.");
return null;
}
return null;
}
public boolean insert(MusicVO vo) {
// Create => 노래 생성.
return false;
}
public boolean update(MusicVO vo) {
// Update => 노래 재생, 노래 랜덤 재생. 될때마다 스트리밍 횟수 증가.
if(vo.getArtist().equals("일반재생") || vo.getArtist().equals("랜덤재생")) {
for(MusicVO data : datas) {
if(data.getNum() == vo.getNum()) {
data.setCnt(data.getCnt() + 1);
return true;
}
}
System.out.println("log : MusicDAO : update() : 해당하는 번호의 노래가 없습니다.");
return false;
}
return false;
}
public boolean delete(MusicVO vo) {
// Delete => 노래 삭제.
for(int i = 0; i < datas.size(); i++) {
if(datas.get(i).getCnt() == vo.getNum()) {
// 노래 고유 번호로 삭제하기.
datas.remove(i);
return true;
}
}
return false;
}
} // MusicDAO
Controller
1. 메인화면을 V가 Client에게 보여주고, Client는 사용할 메뉴를 선택 하기 위해 숫자를 입력.
2. V는 Client가 입력한 숫자를 받아서, C에게 넘기기.
3. Client가 입력한 숫자가
1이면, 로그인.
2이면, 회원가입.
0이면 프로그램 종료 이다.
4. Client가 1번을 눌렀을 경우,
V가 Client에게 아이디, 비밀번호를 입력받고, C에게 넘겨준다.
5. 아이디가 없는 아이디거나, 틀렸거나, 비밀번호가 틀렸으면, V는 Client 에게 로그인 실패를 알리고
continue 문구를 통해 처음으로 돌아간다.
정상적으로 로그인에 성공했다면, 사용자모드로 진입 한다.
1. 사용자 모드에 진입하면, V는 Client 에게 아래와 같이 목록을 보여 준다.
2. V는 사용자로부터 숫자를 받아서 C에게 넘겨준다.
3. C가 받은 숫자가
1이면 노래 목록 출력.
2이면 플레이리스트 메뉴.
3이면 ...
...
0이면 로그아웃 이다.
4. 플레이 리스트 ?
우선 플레이리스트에 해당하는 배열리스트가 비어있으면
V는 Client에게 플리가 비어있다고 안내해준다.
5. 비어있지 않으면 C는 회원이 가지고있는
플레이리스트에 해당하는 배열리스트를 돌면서
그 배열리스트가 가지고있는 각 요소를 M에게 보내서 selectOne() 메서드가
PK (노래번호)와 동일한지 확인하고, 맞으면 return 값으로 노래를 C에게 보내 준다.
6. 보낼때는 번호만 보냈지만 노래 원본 (객체)을 받은 C는
V에게 그 노래 원본 (객체)을 보내줘서 Client에게 노래를 출력 시켜 준다.
출력이 전부 끝났으면, V는 Client에게 플레이리스트를 다 보여줬다고 안내해 준다.
(사용자 편의성을 고려한 안내)
여기까지가 사용자가 들어왔을 때
자동으로
플레이리스트가 비어있으면 출력 XXX
플레이리스트가 비어있지 않으면 출력 OOO
이다.
플레이리스트가 비어져있을 때 노래를 추가 해야하는 기능도 있어야 하니,
(ArrayList<integer> playList 배열에 번호만 추가하는게 선행 되어야 하는 로직)
아래를 확인 하기.
1. 0번을 누르면 플레이리스트에 노래를 추가하지 않고 나갈 수 있음을 알려주는 V.
2. V는 Client에게 숫자를 받아서, 0이면 뒤로가기.
3. 1이상이면,
노래 번호를 객체 묶음의 PK에 해당하는 인자의 자리에 넣어서,
C가 M에게 정보를 보내 준다.
4. 만약에 Client가 입력한 노래번호가 이미 플레이리스트에 해당하는 배열리스트에 존재하면,
return 값으로 false를 반환하고,
중복되는 노래가 없으면 return값으로 true를 반환한다.
5. C는 M에게 true or false를 받는다.
6. true이면, 문제될게 없으니,
ArrayList<Integer> playList 배열리스트에 노래원본의 PK에 해당하는 번호만 저장을 하게 된다.
7. false이면 V가 Client에게 이미 있는 노래라고 안내를 해주고,
continue 문구를 통해 아래의 코드를 실행 하지 않고, 위로 올라간다.
이런식으로 로직을 짠 이유 :
1. 각각의 사용자가 ArrayList<Integer> playList가 아니라,
ArrayList<MusicVO> playList 였다고 가정을 해보면,
아래와 같은 코드가 될 것이다.
1) selectOne() 메서드를 통해 ArrayList<MusicVO> playList 에
노래를 직접 저장.
2) 직접 저장된 playList 배열을 읽어서 플리 안의 노래를 출력.
하지만 이 코드는 문제점과 단점이 존재 하게 된다.
1) 노래의 번호를 받는게 아니라, 노래 자체를 얻는 로직이 된다.
만약에 노래를 원본을 플리에 넣었는데,
서버에서 노래가 삭제됬거나, 가수 이름이 바뀌였거나 했을 때 문제가 발생된다.
2) 설령 문제가 발생하는 것을 고려해서 기능을 구현했다고 하자.
그러면 원본을 가져왔다는건데,
원본은 데이터 용량이 크다.
이는 용량이 커져서 메모리의 성능 저하를 유발 한다.
사용자 1명만 있다면 크게 문제가 되지 않겠지만,
사용자가 10명, 100명, 10000명 .. 엄청 많다고 한다면,
모든 사용자는 전부 원본 데이터를 플리에 넣은 상황이 되는 것이다.
하지만, int 타입으로 배열리스트를 만들어서 노래의 PK만 가져온다면 ?
int타입은 4byte 이기 때문에 용량도 적고 효율적이라고 볼 수 있다.
1. ArrayList<integer> playList 로 부터 받은 번호를 selectOne() 메서드가 기능을 수행해서
원본 노래를 return 해주는 것을 저장할 임시 배열리스트를 만든것을 확인 할 수 있다.
ArrayList<MusicVO> playList = new ArrayList<MusicVO>();
// 임시로 만든 MusicVO 타입의 플레이리스트 배열리스트를 의미.
2. MusicVO infoVO = null; 코드는
view.addPlayListTrue() 함수를 위해 만든 상황.
3. 101번째 줄부터 코드를 해석 하자면, 아래와 같다.
각 회원이 가지고 있는 integer 타입의 플레이리스트를 의미하는 배열리스트를 돌면서,
musicDAO의 selectOne 메서드의 인자로 객체묶음을 주기 위해서,
MusicVO 타입의 vo = new MusicVO(각 회원이 가지고 있는 integer 배열의 n번째 요소(번호), 키워드, null, 0);
로 해서 selectOne 메서드의 인자로 보내는 것이다.
1) 각 회원이 가지고 있는 integer 배열의 n번째 요소
==
말 그대로 각각의 사용자의 ArrayList<integer> playList 안에 저장 되어있는 노래의 번호를 의미한다.
2) "플리추가"
==
musicDAO의 selectOne 메서드는 ArrayList<integer> playList의 번호만 보내줘도 노래(객체) 원본을
return 해줄 수 있는 기능 이기에,
사용하지 않는 인자를 keyWord로 사용한 모습.
3) null, 0
==
사용하지 않는 인자는 null과 0으로 해서 객체 묶음으로 전달 한다.
4. 사용자가 ArrayList<integer> 배열에 추가한 노래번호를 musicDAO.selectOne() 메서드가 받아,
노래번호만 받았지만, 노래 원본을 return 해줘서,
임시로 만든 ArrayList<MusicVO> playList 배열리스트에 add()를 한다.
어떻게 ?
노래 "하나하나씩"을 add() 하는 코드.
5. 노래가 ArrayList<MusicVO> playList에 추가 될 때 마다,
V는 Client에게 아래와 같이 플리에 추가됬다는 정보를 안내 해 준다.
[ 정리 ]
1. Client가 플리 메뉴에 들어 왔을 때,
플리에 노래를 추가 하고 싶은 상황.
2.
Client가 노래원본(객체)의 PK를 바로 직접 입력해서,
MusicDAO.selectOne()을 통해 노래원본 (객체)를 받아서, ArrayList<musicVO> playList
에 바로 추가하는 로직이 아니다.
3. Client가 노래원본(객체)의 번호를 확인해서,
ArrayList<integer> playList 배열리스트에
노래원본(객체)의 번호를 의미하는 번호만 따로 저장한 다음에,
4. 곧바로,
그 번호를 C가 MusicDAO.selectOne()에게 넘겨줘서 노래원본(객체)를 받고,
ArrayList<MusicVO> playList에 add() 하는 그런 로직 이다.
5.
즉, 노래원본의 번호를 입력하고 그게 바로 플리에 저장 되는 구조가 아니라,
노래원본의 번호에 해당하는 번호를 int 타입의 배열리스트에 먼저(따로) 저장하고,
그 번호를 넘겨줘서 노래원본을 플리에 저장 되게 하는 구조 !
그외로, 사용자 모드 안에 다른 메뉴들이 존재 한다.
사용자 모드 종료.
외부 메뉴.
[ Console ]
++
느낀점 :
1. null pointer exception 에러
null로 뭘 하려고 하니까 자꾸 발생함.
'Java (국비) > Java 과제' 카테고리의 다른 글
MVC (Model-View-Controller) 과제 2 (0) | 2023.06.04 |
---|---|
MVC (Model-View-Controller) 과제 Client 파트 (0) | 2023.05.30 |
MVC (Model-View-Controller) 과제 Controller 파트 (0) | 2023.05.30 |
MVC (Model-View-Controller) 과제 Model 파트 (0) | 2023.05.30 |
MVC (Model-View-Controller) 과제 View 파트 (0) | 2023.05.30 |