헬린코린이
비나이다 비나이다 본문
MVC패턴과 크롤링을 이용하여 작은 프로젝트를 진행했습니다. 기간은 1주일 정도 걸렸고
정말 열심히 했습니다.
client
package client;
import ctrl.Ctrl;
public class Client {
public static void main(String[] args) {
Ctrl app=new Ctrl();
app.startApp();
}
}
ctrl
package ctrl;
import model.Crawling;
import model.MemberDAO;
import model.MemberVO;
import model.ScheduleDAO;
import model.ScheduleVO;
import view.View;
// 컨트롤은 모델과 뷰를 멤버변수로 가짐
public class Ctrl {
private View view;
private MemberDAO mdao;
private ScheduleDAO sdao;
private Crawling crawling;
public Ctrl() { // 생성자
// DAO를 다 만들고나서 크롤링만드는것 맞는것
// 이 두개는 개별적이고 컨트롤에서 조합해야함
view=new View(); // 객체화하기
mdao=new MemberDAO(); // 객체화하기
sdao=new ScheduleDAO(); // 객체화하기
crawling =new Crawling(); // 크롤링 객체 가지고 있어야함
}
// 앱 시작
public void startApp() {
// 뷰에서 메인메뉴 출력가져오기
// 받은 액션에따라
while(true){ // 메인메뉴 반복
int act=view.printStart();
if(act==1){ // 로그인
MemberVO mvo = new MemberVO(); // 로그인정보 확인할 일회성 mvo 객체화
mvo.setID(view.getId()); // 입력받은 id 세팅
mvo.setPw(view.getPw()); // 입력받은 pw 세팅
mvo = mdao.hasMember(mvo); // 해당하는 기존 mvo 반환
if(mvo==null) {
view.loginFalse(); // 로그인 실패
continue;
}
view.loginTure(mvo);// 로그인성공 출력문구에 해당이름을 넣기위한 인자 mvo
// 현재 로그인한 사람 == mvo
// 관리자모드
if(mvo.getID().equals("sixsense")) {// id가 "sixsense"라면 관리자모드
while(true){
act=view.adminMenu(); // 관리자 메뉴출력 선택값 act반환
if(act==1){// 1. 출력
// sdao에서 반환된 목록 리스트를 뷰에게 출력 요청
view.adminselectAll(sdao.loadSchedules(null));
}
else if(act==2){ // 2. 일정삭제
ScheduleVO svo=new ScheduleVO();
// 일정전체목록을 view로 넘겨서 전체출력 후 true반환
if(view.adminselectAll(sdao.loadSchedules(null))) {
// 일정 전체 목록을 뷰에게 넘겨주고 삭제할일정 입력받고 svo에 세팅
// sdao의 삭제메서드로 svo넘겨줌
svo.setpNum(view.deleteNum(sdao.loadSchedules(null)));
if(sdao.isDeleteSchedule(svo)) { // 삭제 성공한다면
view.scheduleDeleteTrue(); // 성공멘트출력
}
else {
view.scheduleDeleteFalse(); // 실패멘트출력
}
}
}
else if(act==3) { // 3. 로그아웃
// 뷰에게 로그아웃 멘트 호출
view.logOut();
break; // 관리자모드 반복문 종료
}
}
}
else { // 회원로그인
while(true){
// 로그인성공시
act=view.printMenu();
if(act==1){ // 1. 일정추가
ScheduleVO svo=new ScheduleVO(); // 모델에 인자로 넘길 svo 객체화
svo.setYear(view.year()); // 년도 입력받아서 세팅
svo.setMonth(view.mon(svo.getYear())); // 월 입력받아서 세팅
svo.setDay(view.day(svo.getYear(),svo.getMonth())); // 일 입력받아서 세팅
svo.setID(mvo.getID()); // 회원ID를 일정vo에 FK로 세팅
svo.setMemo(view.diary()); // 일정추가
// 크롤링에서 구리스트 반환 - 뷰에서 출력, 선택된 값으로 세팅
// 세팅된 구를 크롤링 동에 넘겨주고 - 동 리스트 반환 - 뷰에서 출력, 선택된 값으로 세팅
svo.setGu(view.gu(crawling.getGu())); // 구 저장
svo.setDong(view.dong(crawling.getDong(svo.getGu())));
// 스케줄리스트를 가지고있는 객체와 일정세팅된 객체 크롤링으로 보냄 -크롤링에서 dao로 전달
crawling.setWeather(sdao ,svo); // 세팅된 객체를 크롤링으로 보냄
view.scheduleTrue(); // 일정등록 성공
}
else if(act==2){ //2.전체 일정 출력
// 로그인한 mvo넘겨주고 해당 회원의 일정리스트를 뷰에게 전달후 출력
view.selectAll(sdao.loadSchedules(mvo));
}
else if(act==3){ //3.일정 변경
// 로그인한 mvo넘겨주고 해당 회원의 일정리스트를 뷰에게 전달후 출력
if(view.selectAll(sdao.loadSchedules(mvo))) {
// sdao에서 회원의 일정리스트를 뷰에게 전달 - 변경할 일정과 sdao를 크롤링에 넘겨주고 세팅
if(crawling.setWeather(sdao, view.changeDiary(sdao.loadSchedules(mvo)))) { // 변경성공한다면
view.scheduleChangeTrue(); // 성공멘트출력
}
else {
view.scheduleChangeFalse();; // 실패멘트출력
}
}
}
else if(act==4){ //4.일정 삭제
ScheduleVO svo=new ScheduleVO(); // 모델에 인자로 넘길 svo 객체화
// 로그인한 mvo넘겨주고 해당 회원의 일정리스트를 뷰에게 전달후 출력
if(view.selectAll(sdao.loadSchedules(mvo))) {
// sdao에서 회원의 일정리스트를 뷰에게 전달 - 삭제할 일정pk 세팅
svo.setpNum(view.deleteNum(sdao.loadSchedules(mvo)));
if(sdao.isDeleteSchedule(svo)) { // 해당 일정 삭제 성공한다면
view.scheduleDeleteTrue(); // 성공멘트출력
}
else {
view.scheduleDeleteFalse(); // 실패멘트출력
}
}
}
else if(act==5) { // 5. 회원변경
// 뷰에서 변경할정보를 입력받고 세팅된 vo를 모델로 보내서 확인 후 변경
if(mdao.isModifyMember(view.updateMember(mvo))) { // 변경성공한다면
view.memberChangeTrue(); // 성공멘트출력
break;
}
view.memberChangeFalse(); // 실패멘트출력
}
else if(act==6) { // 6. 회원탈퇴
if(view.getCheck(mvo)) { // 탈퇴여부 입력받고 반환
if(mdao.isDeleteMember(mvo)) { // ID확인후 회원삭제 성공한다면
sdao.memberDeleteScheduleAll(mvo); // ID확인후 삭제
view.memberDeleteTrue(); // 탈퇴성공멘트출력
break;
}
}
view.memberDeleteFalse(); // 탈퇴실패멘트출력
}
else{
break; // 로그인반복문 탈출하고 메인메뉴로
}
}
}
}
else if(act==2){ // 회원가입
MemberVO mvo=new MemberVO(); // 회원가입할 일회성 mvo 객체화
mvo.setID(view.getId()); // 입력받은 id 세팅
mvo.setPw(view.getPw()); // 입력받은 pw 세팅
mvo.setName(view.getName()); // 입력받은 이름 세팅
if(mdao.isInputMember(mvo)) { // 세팅된 mvo를 넘겨주고 회원가입 성공한다면
view.joinTure(); // 성공멘트출력
}
else {
view.idFalse(); // 실패한다면 아이디 중복 멘트 출력
}
}
else{ // 프로그램 종료
view.powerOff();
return;
}
}
}
}
model
ScheduleVO
package model;
public class ScheduleVO {
private String weather; //날씨.
private int year; //년.
private int month; //달.
private int day; //일.
private String highTemperature; //최고기온.
private String lowTemperature; //최저기온.
private String pmRainfall; //최대 강우량.
private String amRainfall; //최소 강우량.
private String memo;
private String ID; //FK
private int pNum; //PK
private String gu;
private String dong;
public int getpNum() {
return pNum;
}
public void setpNum(int pNum) {
this.pNum = pNum;
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String getHighTemperature() {
return highTemperature;
}
public void setHighTemperature(String highTemperature) {
this.highTemperature = highTemperature;
}
public String getLowTemperature() {
return lowTemperature;
}
public void setLowTemperature(String lowTemperature) {
this.lowTemperature = lowTemperature;
}
public String getPmRainfall() {
return pmRainfall;
}
public void setPmRainfall(String pmRainfall) {
this.pmRainfall = pmRainfall;
}
public String getAmRainfall() {
return amRainfall;
}
public void setAmRainfall(String amRainfall) {
this.amRainfall = amRainfall;
}
public String getGu() {
return gu;
}
public void setGu(String gu) {
this.gu = gu;
}
public String getDong() {
return dong;
}
public void setDong(String dong) {
this.dong = dong;
}
}
ScheduleDAO
package model;
import java.util.ArrayList;
public class ScheduleDAO {
private ArrayList<ScheduleVO> svo;
private int PK;
public ScheduleDAO() {
PK=101;
svo=new ArrayList<ScheduleVO>(); //생성자에서 초기화하는 것이아니라로그인을 하면 그떄 초기화 하면 되는 거 아님?
}
public void memberDeleteScheduleAll(MemberVO vo) { //
for(int i = 0; i < svo.size(); i++) {
if(vo.getID().equals(svo.get(i).getID())) { // 동일 아이디 체크
svo.remove(i--); // 연속으로 같은 아이디일때 일정삭제를 위한 i--
}
}
}
//C
public boolean isInputSchedule(ScheduleVO vo) { //일정 추가. 날짜 메모입력 받고 PK는 여기서 설정. 날씨는 안 받음.
try {
ScheduleVO data = new ScheduleVO();
data = vo;
data.setpNum(PK++); //PK
svo.add(data);
return true;
}catch (Exception e) {
return false;
}
}
//R
public ArrayList<ScheduleVO> loadSchedules(MemberVO vo){ //회원의 일정 전체 목록 출력.
if(vo == null) { //관리자모드일때 사용.
return svo; //전체 목록 출력.
}
ArrayList<ScheduleVO> exSvo = new ArrayList<>();// 임시 배열리스트.
for(int i=0; i<svo.size(); i++) { //리스트 size만큼 돌아서.
if(svo.get(i).getID()/*FK*/.equals(vo.getID()/*PK*/)) { //아이디가 같은 것을 찾는다.
exSvo.add(svo.get(i)); //같으면 임시 배열리스트에 저장.
}
}
return exSvo; //id가 같은 목록만 출력.
}
//R
public ScheduleVO loadSchedule(MemberVO vo) { //PK번호 입력받아서 하나의 목록만 출력.
for(int i=0; i<svo.size(); i++) { //리스트 size만큼 돌아서.
if(svo.get(i).getID().equals(vo.getID())) { //pk값이 동일하다면.
return svo.get(i); // 그 값을 리턴해준다.
}
}
return null; //PK가 없다면 null을 반환한다.
}
//U
public boolean isModifySchedule(ScheduleVO vo) { //일정 변경.
for(int i=0; i<svo.size(); i++) { //리스트 size만큼 돌아서.
if(svo.get(i).getpNum()==vo.getpNum()) { //PK값이 맞다면.
if(vo.getMemo() != null) { //메모가 null이 아니라면.
svo.get(i).setMemo(vo.getMemo()); //메모가 변경된다.
return true; //true 리턴해준다.
}else {
svo.get(i).setYear(vo.getYear()); //년을 바꿔주고.
svo.get(i).setMonth(vo.getMonth()); // 달을 바꿔주고.
svo.get(i).setDay(vo.getDay()); //일을 바꿔준다.
svo.get(i).setLowTemperature(vo.getLowTemperature());
svo.get(i).setHighTemperature(vo.getHighTemperature());
svo.get(i).setAmRainfall(vo.getAmRainfall());
svo.get(i).setPmRainfall(vo.getPmRainfall());
return true; //true를 리턴해준다.
}
}
}
return false; //false를 리턴해준다.
}
//D
public boolean isDeleteSchedule(ScheduleVO vo) { //삭제하기.
for(int i=0; i<svo.size(); i++) { //리스트 size만큼 돌아서.
if(svo.get(i).getpNum()==vo.getpNum()) { //PK값이 맞다면.
svo.remove(i); //PK값에 해당하는 객체를 삭제.
return true;//true를 리턴해준다.
}
}
return false; //false를 리턴해준다.
}
}
MemberVO
package model;
public class MemberVO {
private String ID; //PK
private String pw; //비밀번호.
private String name; //이름.
//ArrayList<ScheduleVO> sArrayList ;
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MemberVO() { } //기본생성자
public MemberVO(String ID, String pw, String name) { //관리자 샘플데이터를 위해 작성.
this.ID=ID;
this.pw=pw;
this.name=name;
}
}
MemberDAO
package model;
import java.util.ArrayList;
public class MemberDAO {
private ArrayList<MemberVO> mvo; // MemberVO를 담고있는 배열.
public MemberDAO(){
mvo=new ArrayList<MemberVO>();
mvo.add(new MemberVO("sixsense","1234","완벽")); //관리자 정보.
}
// C
public boolean isInputMember(MemberVO vo) { //회원가입.
for(int i=0; i<mvo.size(); i++) { //리스트 size만큼 돌아서
if(mvo.get(i).getID().equals(vo.getID())) { //id가 이미 저장된 VO에 있으면 false
return false; // false를 리턴해준다.
}
}
MemberVO data=new MemberVO(); //일회용.
data.setID(vo.getID()); // MemberVO의 아이디를 설정해준다.
data.setName(vo.getName()); //MemberVO의 이름을 설정해준다.
data.setPw(vo.getPw()); //MemberVO의 비밀번호를 설정해준다.
mvo.add(vo);
return true; //같은 아이디가 존재하지 않다면 true 반환
}
//R
public MemberVO hasMember(MemberVO vo) {// 로그인 로직
for(int i=0;i<mvo.size();i++) { //mvo사이즈만큼 돌아서
if(mvo.get(i).getID().equals(vo.getID())) { //아이디가 있다면
if(mvo.get(i).getPw().equals(vo.getPw())) { //비밀번호가 있다면
return mvo.get(i); //그 값을 반환한다.
}
return null; //null반환
}
}
return null; //null반환
}
//U
public boolean isModifyMember(MemberVO vo) { //정보변경.
for(int i=0; i<mvo.size(); i++) { //리스트 size만큼 돌아서.
if(mvo.get(i).getID().equals(vo.getID())) { //id가 있으면.
if(vo.getPw()!=null) { //비밀번호가 null이 아니라면.
mvo.get(i).setPw(vo.getPw()); //비밀번호를 변경한다.
return true; //true를 반환한다.
}else if(vo.getName()!=null) { // 이름이 null이 아니라면.
mvo.get(i).setName(vo.getName()); //이름을 변경한다.
return true; //true를 반환한다.
}
}
}
return false; //id가 없다면 false를 반환한다.
}
//D
public boolean isDeleteMember(MemberVO vo) { // 회원 탈퇴.
for(int i=0; i<mvo.size(); i++) { //리스트size만큼 돌아서.
if(mvo.get(i).getID().equals(vo.getID())) { //ID가 맞다면 if문 실행
mvo.remove(i); //삭제.
return true; //true 반환
}
}
return false; // 같은 아이디가 존재하지 않다면 false 반환
}
}
Crawling
package model;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class Crawling {
private Map<String, ArrayList<String>> map; // 멤버변수 map
// 강남구 : [신사동, 압구정동, ... ]
// 강동구 : [강일동, 상일동, ...]
// ... 와 같이 키값은 구, 밸류값은 동리스트로 이루어져 있는 맵을 저장할 공간
public Crawling(){ // 생성자
map = getMap();
// 크롤링 객체를 만드는 순간 getMap() 메서드를 호출하여 반환값을 멤버변수 map에 저장한다
}
public Map<String, ArrayList<String>> getMap () { // 크롤링 한 map을 리턴할 메서드
Map<String, ArrayList<String>> map = new HashMap<>();
// 리턴해줄 map 생성
final String url = "https://www.seoul.go.kr/seoul/autonomy_sub.do";
// 서울 특별시 자치구별 동 현황 사이트 주소 url
Document doc = null;
try {
doc = Jsoup.connect(url).get();
// 해당 url의 페이지 정보를 문서 객체에 저장
} catch (IOException e) {
e.printStackTrace();
}
Elements eles = doc.select("div.district.tabcont");
// 크롤링할 정보가 들어있는 div 쿼리셀렉터
for(Element str : eles) {
Elements gu = str.select("h5");
// 구
ArrayList<String> list = new ArrayList<String>(Arrays.asList(gu.text().split("\\(")));
// '(' 기준으로 스플릿
// ex) '1) 강남구', '江南區) - 행정동', '行政洞) 22,법정동', '法定洞) 14'
ArrayList<String> list2 = new ArrayList<String>(Arrays.asList(list.get(0).split("\\) ")));
// 위에서 ( 기준으로 스플릿한 것 중 첫번째의 값을
// ex) '1) 강남구'
// ') ' 기준으로 스플릿
// ex) '1', '강남구'
Elements dongs = str.select("tbody > tr > td:nth-child(2)");
// tbody > tr > td:nth-child(2) 목록
ArrayList<String> listD = new ArrayList<>(); // 동 리스트
for(Element e : dongs) {
ArrayList<String> myList = new ArrayList<>(Arrays.asList(e.text().split(", ")));
// ', ' 기준으로 스플릿
// ex) '신사동(新沙洞)', '압구정동(狎鷗亭洞)'
for(String dong : myList) {
ArrayList<String> myList2 = new ArrayList<>(Arrays.asList(dong.split("\\(")));
// '(' 기준으로 스플릿
// '신사동', '新沙洞)'
if(!listD.contains(myList2.get(0))) {
listD.add(myList2.get(0));
// 위의 값 중 첫번째 값을
// ex) '신사동'
// 동 리스트에 저장
}
}
}
map.put(list2.get(1), listD);
// 맵에 구와 동리스트를 저장
}
return map;
// 맵 리턴
}
public ArrayList<String> getGu() { // 구 리스트를 리턴하는 메서드
ArrayList<String> guList = new ArrayList<String>(map.keySet());
Collections.sort(guList);
return guList;
// 맵의 키값들을 뽑아서 배열리스트에 저장 후 소트해서 리턴
}
public ArrayList<String> getDong(String gu){ // 동 리스트를 리턴하는 메서드
ArrayList<String> dongList = map.get(gu);
Collections.sort(dongList);
return dongList;
// 인자로 받은 구와 키값이 같은 밸류 배열리스트를 소트해서 리턴
}
public boolean setWeather(ScheduleDAO sdao, ScheduleVO svo) { // 날씨를 크롤링하여 svo에 저장 후 sdao로 보내는 메서드
if(svo.getDay() != 0) {
LocalDate now = LocalDate.now();
// 오늘 날짜 now
LocalDate when = LocalDate.of(svo.getYear(), svo.getMonth(), svo.getDay());
// 인자로 받은 날짜 when
long betweenDay = ChronoUnit.DAYS.between(now, when);
// 오늘 날짜와 인자로 받은 날짜의 차이 betweenDay
String url = "https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=" + svo.getDong() + "+기상예보";
// 인자로 받은 동 정보를 getSelect 메서드에 넣어서 크롤링할 url을 리턴받아온다
Document doc = null;
try {
doc = Jsoup.connect(url).get();
// 해당 url의 페이지 정보를 문서 객체에 저장
} catch (IOException e) {
e.printStackTrace();
}
// 크롤링
String bday = String.valueOf(betweenDay + 1);
Elements lowestTemp = doc.select("li:nth-child("+ bday +") > div > div.cell_temperature > span > span.lowest");
Elements highestTemp = doc.select("li:nth-child("+ bday +") > div > div.cell_temperature > span > span.highest");
Elements amRainfall = doc.select("li:nth-child(" + bday + ") > div > div.cell_weather > span:nth-child(1) > span > span");
Elements pmRainfall = doc.select("li:nth-child(" + bday + ") > div > div.cell_weather > span:nth-child(2) > span > span");
svo.setLowTemperature(lowestTemp.text()); // 최저기온
svo.setHighTemperature(highestTemp.text()); // 최대기온
svo.setAmRainfall(amRainfall.text()); // 오전강수량
svo.setPmRainfall(pmRainfall.text()); // 오후강수량 세팅
}
if(svo.getpNum() == 0) { // 일정추가
sdao.isInputSchedule(svo); // 인자로 받은 객체의 날씨를 세팅하고 나서 DAO클래스의 일정추가 메서드의 인자로 보낸다
}
else { // 일정변경
sdao.isModifySchedule(svo);
}
return true;
}
}
view
package view;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import model.MemberVO;
import model.ScheduleVO;
public class View {
//----------------------------------------------------------------
//메인메뉴 출력 로직
public Scanner sc ;
public View(){
sc = new Scanner(System.in);
}
public int printStart(){
int act;
while(true) {
try{
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 비나이다 비나이다 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.println("1. 로그인");
System.out.println("2. 회원가입");
System.out.println("3. 종료");
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
act = sc.nextInt();
}catch(Exception e){
sc.nextLine();
System.out.println("✖︎ ✖︎ 입력 범위로 입력해주세요! ✖ ︎✖︎");
continue;
}
if(1<=act && act <=3){
break;
}
System.out.println();
System.out.println();
System.out.println("✖ ︎✖︎ 입력 범위로 입력해주세요! ✖︎ ✖︎");
System.out.println();
System.out.println();
}
return act;
}
//-----------------------------------------------------------
// 프로그램 종료문구 로직
public void powerOff() {
for(int i=0;i<3;i++) {
System.out.println(" . ");
}
System.out.println("프로그램이 종료되었습니다.");
System.out.println("안녕히가세요. : D");
}
//-----------------------------------------------------------------
//로그아웃 종료문구 로직
public void logOut() {
System.out.println("로그아웃되었습니다. ");
System.out.println("안녕히가세요 : D ");
}
//-------------------------------------------------------
//로그인 id 입력 로직
public String getId() {
System.out.print("ID : ");
String id=sc.next();
return id;
}
//-------------------------------------------------------------------------
//로그인 pw 입력 로직
public String getPw() {
System.out.print("PW : ");
String pw=sc.next();
// 비밀번호 재입력 (유효성 검사) 추가하기
return pw;
}
//---------------------------------------------------------
//로그인 name 입력 로직
public String getName() {
System.out.print("NAME : ");
String pw=sc.next();
return pw;
}
//////////////////////////////////////
// 회원가입 로그인 성공
public void joinTure() {
System.out.println("회원가입 성공되었습니다.");
System.out.println("로그인 해주세요 : D ");
}
//////////////////////////////////////////////////////
// 회원가입 중복시 로직
public void idFalse() {
System.out.println("✖︎ ✖︎ 중복된 아이디 입니다. ✖︎ ✖︎");
}
//---------------------------------------------------------------------------------------------
//로그인 실패시 로직
public void loginFalse() {
System.out.println("✖ ︎✖︎ 로그인 실패... ✖︎ ✖︎");
System.out.println("아이디 or 비밀번호를 다시 확인해보세요!");
}
//---------------------------------------------------------------------------------------------
//로그인 성공 로직
public void loginTure(MemberVO vo) {
System.out.println();
System.out.println("로그인 되었습니다.");
System.out.println(vo.getName()+"님 안녕하세요 : D ");
}
//------------------------------------------------------------------------------------
//로그인후 회원 메뉴 출력로직
public int printMenu() { //로그인후 회원 메뉴 출력
int act;
while(true) {
try {
System.out.println();
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("6. 회원탈퇴");
System.out.println("7. 로그아웃");
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
act = sc.nextInt();
} catch(Exception e) {
sc.nextLine(); //에러값을 먹어준다
System.out.println("✖︎ ✖︎ 입력 범위로 입력해주세요! ✖ ︎✖");
continue;
}
if(1<=act && act <=7) {
break;
}
System.out.println("✖︎ ✖︎ 입력 범위로 입력해주세요! ✖ ︎✖");
System.out.println();
}
return act;
}
///////////////////////////////////////////////////////////////////////////////////
// 일정 구 입력 로직
public String gu(ArrayList<String>datas) {
String gu;
boolean flag=false;
System.out.println(datas);
//유효성검사
while(true) {
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 구 입력 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
gu=sc.next();
for(int i=0;i<datas.size();i++) {
if(datas.get(i).equals(gu)) {
flag=true;
break;
}
}
if(flag) {
break;
}
}
return gu;
}
///////////////////////////////////////////////////////////////////////////////////
// 일정 동 입력 로직
public String dong(ArrayList<String>datas) {
String dong;
boolean flag=false;
System.out.println(datas);
//유효성검사
while(true) {
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 동 입력 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
dong=sc.next();
for(int i=0;i<datas.size();i++) {
if(datas.get(i).equals(dong)) {
flag=true;
break;
}
}
if(flag) {
break;
}
}
return dong;
}
//-----------------------------------------------------------------
//연도 입력 로직
public int year() {
LocalDate now = LocalDate.now();
int year;
int nowyear = now.getYear();//현재 연도
while(true) {
System.out.println();
System.out.println("날씨정보는 10일 까지만 표시됩니다. : D");
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 연도 입력 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
try{
year=sc.nextInt();
}catch(Exception e){
sc.nextLine(); //에러값을 먹어준다
System.out.println("✖︎ ✖︎ 입력하신 연도를 다시 확인해주세요! ✖ ︎✖");
continue;
}
if(year<nowyear) { //현재 연보다 작을경우 컨티뉴
System.out.println("✖︎ ✖︎ 입력하신 연도를 다시 확인해주세요! ✖ ︎✖");
continue;
}
break;
}
return year;
}
///////////////////////////////////////////////////////////
/// 일정 월 입력 로직
public int mon(int year) {
LocalDate now = LocalDate.now();
int mon;
while(true) {
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 월 입력 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
try {
mon=sc.nextInt();
}catch (Exception e) {
sc.nextLine(); //에러값을 먹어준다
System.out.println("✖︎ ✖︎ 입력하신 월을 다시 확인해주세요! ✖ ︎✖");
continue;
}
if(mon<1 || mon>12 ) {
System.out.println("✖︎ ✖︎ 입력하신 월을 다시 확인해주세요! ✖ ︎✖");
continue;
}
if(year==now.getYear()) {
//현재 월보다작으면 과거이니 다시입력.
if(mon<now.getMonthValue()) {
System.out.println("✖︎ ✖︎ 지나간 시간은 다시 되돌릴 수 없습니다..✖︎ ✖︎");
continue;
}
}
break;
}
return mon;
}
///////////////////////////////////////////////////////////////////////////////////
// 일정 일 입력 로직
public int day(int year,int mon) {
LocalDate now = LocalDate.now();
int day;
while(true) {
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 일 입력 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
try {
day=sc.nextInt();
}catch (Exception e) {
sc.nextLine(); //에러값을 먹어준다
System.out.println("✖︎ ✖︎ 입력하신 일을 다시 확인해주세요! ✖ ︎✖");
continue;
}
if(mon==1 || mon==3|| mon==5 || mon==7 || mon==8 || mon==10 || mon==12 ) {
if(day<1 || day>31) {
System.out.println("✖︎ ✖︎ 입력하신 일을 다시 확인해주세요! ✖ ︎✖");
continue;
}
if(year==now.getYear() && mon==now.getMonthValue()&& day<now.getDayOfMonth()) {
System.out.println("✖︎ ✖︎ 지나간 시간은 다시 되돌릴 수 없습니다.. ✖︎ ✖︎");
continue;
}
else {
break;
}
}
else if(mon==4 || mon==6 || mon==9 || mon==11) {
if(day<1 || day>30) {
System.out.println("✖︎ ✖︎ 입력하신 일을 다시 확인해주세요! ✖ ︎✖");
continue;
}
if(year==now.getYear() && mon==now.getMonthValue()&& day<now.getDayOfMonth()) {
System.out.println("✖︎ ✖︎ 지나간 시간은 다시 되돌릴 수 없습니다.. ✖︎ ✖︎");
continue;
}
else {
break;
}
}
else if(mon==2) {
if(day<1 || day>29) {
System.out.println("✖︎ ✖︎ 입력하신 일을 다시 확인해주세요! ✖ ︎✖");
continue;
}
if(year==now.getYear() && mon==now.getMonthValue()&& day<now.getDayOfMonth()) {
System.out.println("✖︎ ✖︎ 지나간 시간은 다시 되돌릴 수 없습니다.. ✖︎ ✖︎");
continue;
}
else {
break;
}
}
}
return day;
}
////////////////////////////////////////////////////
/// 일정 입력 로직
public String diary() {
System.out.println();
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 메모 입력 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
sc.nextLine();
String dia= sc.nextLine();
return dia;
}
////////////////////일정 등록 성공로직
//---------------------------------------------------------------------------------
public void scheduleTrue() { //
System.out.println();
System.out.println("일정이 등록되었습니다! : D");
}
//////////////////////////////////////
/// 일정 삭제 로직
public int deleteNum(ArrayList<ScheduleVO> datas) {//인자필요 일정객체배열리스트
int num;
while(true) {
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 삭제 일정 입력 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.print(" ::: ");
try {
num = sc.nextInt();
} catch (Exception e) {
sc.nextLine(); //에러값을 먹어준다
System.out.println("✖︎ ✖︎ 삭제하실 일정을 다시 확인해주세요! ✖ ︎✖");
continue;
}
if(num<1 || num>datas.size()) {
System.out.println("✖︎ ✖︎ 삭제하실 일정을 다시 확인해주세요! ✖ ︎✖");
continue;
}
break;
}
//실질적인 데이터의 pk값 대입
int pk=datas.get(num-1).getpNum();
return pk;
}
/////////////////////////////////////////////////////////////////////////////////
//// 강수량, 기온정보로 이모지 설정로직
public String getEmoji(int rain, String temp) { // 강수량이랑 기온을 인자로 받음. 기온에 따라 눈과 비를 표시해줌
String emoji = "";
if(rain<=0) {
emoji= "☀︎";
}
else if(rain<=60) {
emoji="☁";
}
else { // 최저기온+숫자+도씨
ArrayList<String> alTemp_ = new ArrayList<>(Arrays.asList(temp.split("기온"))); // "기온"을 기준으로 자름: "최저" 0인덱스,"숫자+도씨"가 1번인덱스
ArrayList<String> alTemp = new ArrayList<>(Arrays.asList(alTemp_.get(1).split("°"))); // 1번인덱스에서 도씨로 자름 => String "숫자"만 남음
int intTemp = Integer.parseInt(alTemp.get(0)); // String "숫자"를 int로 변환
if(intTemp > 0) {
emoji="☂︎";
}
else {
emoji="☃︎";
}
}
return emoji;
}
/////////////////////////////////////////////////////////////////////
//////////// 관리자 일정 출력
public boolean adminselectAll(ArrayList<ScheduleVO> datas) {
if(datas.isEmpty()) {
System.out.println("아직 일정이 없습니다.");
return false;
}
/*전체 출력*/
for(int i=0;i<datas.size();i++) {
if(!datas.get(i).getLowTemperature().isEmpty()) {
if(datas.get(i).getAmRainfall().isEmpty()) {
datas.get(i).setAmRainfall("0");
}
if(datas.get(i).getPmRainfall().isEmpty()) {
datas.get(i).setPmRainfall("0");
}
ArrayList<String> amList = new ArrayList<>(Arrays.asList(datas.get(i).getAmRainfall().split("%")));
ArrayList<String> pmList = new ArrayList<>(Arrays.asList(datas.get(i).getPmRainfall().split("%")));
int amRain=Integer.parseInt(amList.get(0));
int pmRain=Integer.parseInt(pmList.get(0));
String amEmoji = getEmoji(amRain, datas.get(i).getLowTemperature());
String pmEmoji = getEmoji(pmRain, datas.get(i).getLowTemperature());
//i. 월/일 어디어디어디어디 일정 날씨
System.out.println((i+1)+". [ "+datas.get(i).getID()+" / "+datas.get(i).getMonth() +"월"+datas.get(i).getDay()+"일 ] \n " +datas.get(i).getGu()+" "+datas.get(i).getDong()+"\n "
+datas.get(i).getLowTemperature()+" / "+datas.get(i).getHighTemperature()+" 오전:"+amEmoji+ " 오후:"+pmEmoji+"\n 📄 "+datas.get(i).getMemo() + " ⌟ ");
System.out.println();
}
else {
System.out.println((i+1)+". [ "+datas.get(i).getID()+" / "+datas.get(i).getMonth() +"월"+datas.get(i).getDay()+"일 ]"+" \n 📄"+datas.get(i).getMemo()+" ⌟\n 제공되는 날씨 정보 없음");
System.out.println(); }
}
return true;
}
//////////////////////////////////////////////////////////////////
/////회원 일정 전체출력
public boolean selectAll(ArrayList<ScheduleVO> datas) {
if(datas.isEmpty()) { // 일정이 없을때
System.out.println("아직 일정이 없습니다.");
return false;
}
/*전체 출력*/
for(int i=0;i<datas.size();i++) {
if(!datas.get(i).getLowTemperature().isEmpty()) { // 최저기온이 비어있지않다면(날씨정보가 있다면)
if(datas.get(i).getAmRainfall().isEmpty()) { // 오전강수량이 비어있다면
datas.get(i).setAmRainfall("0"); // 0으로 나오게 세팅
}
if(datas.get(i).getPmRainfall().isEmpty()) { // 오후강수량이 비어있다면
datas.get(i).setPmRainfall("0"); // 0으로 나오게 세팅
}
// 이모지출력을 위한 코드 - 강수량만 ( 예를들어 80% -> %기준으로 자른다)
ArrayList<String> amList = new ArrayList<>(Arrays.asList(datas.get(i).getAmRainfall().split("%"))); // ArryList안에 String80
// String값인 미니레인풀을 %기준으로 스플릿하여 배열리스트에저장
ArrayList<String> pmList = new ArrayList<>(Arrays.asList(datas.get(i).getPmRainfall().split("%")));
int amRain=Integer.parseInt(amList.get(0)); // int80 으로 바꿔줌
int pmRain=Integer.parseInt(pmList.get(0));
String amEmoji = getEmoji(amRain, datas.get(i).getLowTemperature()); // (80, 최저기온)인자로 넘겨줌
String pmEmoji = getEmoji(pmRain, datas.get(i).getLowTemperature());
//i. 월/일 어디어디어디어디 일정 날씨
System.out.println((i+1)+". [ "+datas.get(i).getMonth() +"월"+datas.get(i).getDay()+"일 ] \n " +datas.get(i).getGu()+" "+datas.get(i).getDong()+"\n "
+datas.get(i).getLowTemperature()+" / "+datas.get(i).getHighTemperature()+" 오전:"+amEmoji+ " 오후:"+pmEmoji+"\n 📄 "+datas.get(i).getMemo() + " ⌟ ");
System.out.println();
}
else {
System.out.println((i+1)+". [ "+datas.get(i).getMonth() +"월"+datas.get(i).getDay()+"일 ]"+" \n 📄"+datas.get(i).getMemo()+" ⌟\n 제공되는 날씨 정보 없음");
System.out.println();
}
}
return true;
}
///////////////////////////////////////////////////////////////////////////////
//// 변경할 일정 변경 로직
public ScheduleVO changeDiary(ArrayList<ScheduleVO>datas) {
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.println("변경하실 일정번호를 입력해주세요");
System.out.print("입력 : ");
int pknum;
while(true) {
int len;
len=datas.size();
try {
pknum = sc.nextInt();
} catch (Exception e) {
sc.nextLine(); //에러값을 먹어준다
System.out.println("번호를 다시한번 확인해주세요.");
continue;
}
if(pknum<1 || pknum>len) {
System.out.println("번호를 다시한번 확인해주세요.");
continue;
}
break;
}
ScheduleVO svo=new ScheduleVO();
//실질적인 데이터의 pk값 대입
int pk=datas.get(pknum-1).getpNum();
int num;
while(true) {
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.println("1.메모변경 2.날짜변경");
try {
num = sc.nextInt();
} catch (Exception e) {
sc.nextLine(); //에러값을 먹어준다
System.out.println("번호를 다시한번 확인해주세요.");
continue;
}
if(num<1 || num>2) {
System.out.println("번호를 다시한번 확인해주세요.");
continue;
}
break;
}
if(num == 1) {
System.out.println("변경하실 일정메모를 입력해 주세요");
sc.nextLine();
String dia=sc.nextLine();
//객체에 pk번호 세트
svo.setpNum(pk);
//객체에 새로운 일정세트
svo.setMemo(dia);;
}
else if(num == 2){
svo.setYear(year());
svo.setMonth(mon(svo.getYear()));
svo.setDay(day(svo.getYear(), svo.getMonth()));
svo.setDong(datas.get(pknum-1).getDong());
// 일정변경할때 그 일정의 위치를 그대로 가져와서 날씨정보를 다시 검색하기위해서(크롤링하기위해서!)
svo.setpNum(pk);
}
return svo;
}
// public boolean deleteDiary() { // 이건 어디있나요
// System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 삭제 [Y/N] ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
// System.out.print(" ::: ");
// String ans=sc.next();
// if(ans.equalsIgnoreCase("Y")) {
// return true;
// }
// return false;
// }
//-----------------------------------------------------------------------------------------------------------
// 회원 탈퇴 로직
public boolean getCheck(MemberVO vo) {
while(true) {
System.out.println(vo.getName()+"님, 정말 탈퇴하시겠습니까? [Y/N]");
String ans = sc.next();
if(ans.equalsIgnoreCase("Y")) {
return true;
}
else if(ans.equalsIgnoreCase("N")) {
return false;
}
}
}
//-----------------------------------------------------------------------------------------------------------
// 회원 변경 로직
public MemberVO updateMember(MemberVO vo) {
int num;
System.out.println();System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 회원 변경 입력 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
while(true){
System.out.println("1. 비밀번호");
System.out.println("2. 이름");
System.out.print(" ::: ");
try {
num=sc.nextInt();
} catch (Exception e) {
sc.nextLine(); //에러값을 먹어준다
System.out.println("✖︎ ✖︎ 번호를 다시 확인해주세요! ✖ ︎✖");
System.out.print(" ::: ");
continue;
}
if(num<1 || num>2) {
System.out.println("✖︎ ✖︎ 번호를 다시 확인해주세요! ✖ ︎✖");
System.out.print(" ::: ");
continue;
}
break;
}
if(num==1) {
System.out.println("새로운 비밀번호를 입력해주세요.");
String pw=sc.next();
vo.setPw(pw);
}
else {
System.out.println("새로운 이름을 입력해주세요.");
String nm=sc.next();
vo.setName(nm);
}
return vo;
}
//--------------------------------------------------------------------------------------------
// 일정변경 성공
public void scheduleChangeTrue() {
System.out.println("일정을 변경 완료하였습니다 :D");
}
//--------------------------------------------------------------------------------------------
// 일정변경 실패
public void scheduleChangeFalse() {
System.out.println("✖︎ ✖︎ 일정이 변경되지 않았습니다! ✖ ︎✖");
}
//--------------------------------------------------------------------------------------------
// 회원정보변경 성공
public void memberChangeTrue() {
System.out.println("회원 정보가 변경되었습니다.");
}
//--------------------------------------------------------------------------------------------
// 회원정보변경 실패
public void memberChangeFalse() {
System.out.println("✖︎ ✖︎ 회원정보가 변경되지 않았습니다! ✖ ︎✖");
}
//--------------------------------------------------------------------------------------------
// 일정 삭제 성공
public void scheduleDeleteTrue() {
System.out.println("일정이 삭제되었습니다.");
}
//--------------------------------------------------------------------------------------------
// 일정 삭제 실패
public void scheduleDeleteFalse() {
System.out.println("✖︎ ✖ 일정이 삭제되지않았습니다. ✖︎ ✖");
}
//--------------------------------------------------------------------------------------------
// 회원 탈퇴성공
public void memberDeleteTrue() {
System.out.println("회원탈퇴에 성공했습니다.");
System.out.println("다음에 다시 만나요 :D");
}
//----------------------------------------------------------------------------------------
// 회원탈퇴 실패
public void memberDeleteFalse() {
System.out.println("✖︎ ✖ 회원탈퇴에 실패하였습니다. ✖︎ ✖");
}
//---------------------------------------------------------------------------------
// 관리자 메뉴
public int adminMenu() { //로그인후 회원 메뉴 출력
int act;
while(true) {
try {
System.out.println();
System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 관리자 메뉴 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
System.out.println("1. 일정출력");
System.out.println("2. 일정삭제");
System.out.println("3. 로그아웃");
System.out.print(" ::: ");
act = sc.nextInt();
} catch(Exception e) {
sc.nextLine(); //에러값을 먹어준다
System.out.println("✖︎ ✖︎ 입력 범위로 입력해주세요! ✖ ︎✖︎");
continue;
}
if(1<=act && act <=3) {
break;
}
System.out.println("✖︎ ✖︎ 입력 범위로 입력해주세요! ✖ ︎✖︎");
}
return act;
}
}
Comments