Travel Club UI, Service Layer - Step1

지환·2023년 10월 9일
0

JAVA

목록 보기
24/39
post-thumbnail

ClubMenu

package menu;

import java.util.Scanner;

import console.ClubConsole;

public class ClubMenu {
	private Scanner sc;
	//클럽 콘솔을 호출하기 위해서 추가하는 것
	private ClubConsole console;
	
	public ClubMenu()
	{
		this.sc = new Scanner(System.in);
		this.console = new ClubConsole();
	}
	
	public void show()
	{
		int inputNumber = 0;
		
		while(true)
		{
			displayMenu();
			inputNumber = selectMenu();
			
			System.out.println(inputNumber);
			switch(inputNumber)
			{
			case 1:
				console.register();
				break;
			
			case 2:
				console.findAll();
				break;
				
			case 3:
				console.findId();
				break;
				
			case 4:
				console.findName();
				break;
				
			case 5:
				console.modify();
				break;
				
			case 6:
				console.remove();
				break;
				
			case 0:
				return;
			default:
				System.out.println("Choose agin!!");
			}
		}
	}

	
	private void displayMenu()
	{
		System.out.println("=======================");
		System.out.println("Club Menu");
		System.out.println("=======================");
		System.out.println("1. Register");
		System.out.println("2. Find(All)");
		System.out.println("3. Find(ID)");
		System.out.println("4. Find(Name)");
		System.out.println("5. Modify");
		System.out.println("6. Remove ");
		System.out.println("=======================");
		System.out.println("0. Previous");
		System.out.println("=======================");
		
	}
	
	
	private int selectMenu()
	{
		System.out.print("Select : ");
		int menuNumber = sc.nextInt();
		if(menuNumber >= 0 && menuNumber <= 6)
		{
			sc.nextLine();
			/*
			 * nextLine() 하게되면 해당 버퍼를 지운다.
			 */
			return menuNumber;
		}
		else
		{
			System.out.println("It`s a invalid number --->" + menuNumber);
			return -1;
		}
		

	}

	
}

StoryAssistant

package util;

import menu.ClubMenu;

public class StoryAssistant {
	
	private void startStory()
	{
		ClubMenu clubmenu = new ClubMenu();
		clubmenu.show();
	}

	public static void main(String[] args) {
		StoryAssistant assistant = new StoryAssistant();
		assistant.startStory();

	}

}

ClubConsole

package console;

import Service.ClubService;
import Service.ServiceLogicLifeCycle;
import Service.logic.ClubServiceLogic;
import entity.TravelClub;
import util.ConsoleUtil;

public class ClubConsole {
	
	private ConsoleUtil consoleutil;
	private ClubService clubService;
	
	public ClubConsole()
	{
		this.consoleutil = new ConsoleUtil();
		/*
		 * 이후 변경될 코드입니다.
		 */
		this.clubService = ServiceLogicLifeCycle.getuniqueInstance().getClubService();
	}
	
	
	public void register()
	{
		while(true)
		{
			String clubName = consoleutil.getValueOf("Club Name(0.Club Menu)");
			/*
			 * 객체를 사용하여 콘솔에서 사용자로부터 값을 입력받는다.
			 * 용자가 프로그램에 클럽 이름을 제공할 수 있게 해주는 부분이다.
			 */
			if(clubName.equals("0")) // 돌아가겠다는 의미
			{
				return; 
			}
			
			
			String intro = consoleutil.getValueOf("Club Intro(0.Club Menu)");
			if(intro.equals("0"))
			{
				return;
			}
			
			TravelClub newClub = new TravelClub(clubName, intro);
			clubService.register(newClub);
			
			System.out.println("Registered club : " + newClub.toString());
		}
		
		

	}

	
	public void findAll()
	{
		TravelClub[] foundClubs = clubService.findAll();
		if(foundClubs.length == 0)
		{
			System.out.println("Empty");
			return;
		}

		for(TravelClub club : foundClubs)
		{
			System.out.println(club.toString());
		}
	
	}
	
	public void findId()
	{
		TravelClub foundClub = null;
		while(true)
		{
			String clubId = consoleutil.getValueOf("Club id to find(0:Club Menu");
			if(clubId.equals("0"))
			{
				break;
			}
			
			foundClub = clubService.findId(clubId);
			
			
			
			if(foundClub != null)
			{
				System.out.println(foundClub.toString());
			}
			else
			{
				System.out.println("Can not find club, ID :" + clubId);
			}
			
		}
	}
	
	public void findName()
	{
		TravelClub[] foundClubs = null;
		while(true)
		{
			String clubname = consoleutil.getValueOf("Club name to find(0:Club Menu");

			if(clubname.equals("0"))
			{
				break;
			}
			
			foundClubs = clubService.findName(clubname);
			
			if(foundClubs != null && foundClubs.length != 0)
			{
				for(TravelClub club : foundClubs)
				{
					System.out.println(club);
				}
				}
			else
			{
				System.out.println("Can not find Club, Name :" + clubname);
			}
			
			}
			
	}
	
	
	/*
	 * findAll 제외하고 나머지는 사용자로부터 값을 입력 받아야함.
	 */
	private TravelClub findOne()
	{
		TravelClub foundClub = null;
		while(true)
		{
			String clubId = consoleutil.getValueOf("Club id to find(0:Club Menu");
			if(clubId.equals("0"))
			{
				break;
			}
			
			foundClub = clubService.findId(clubId);
			
			
			
			if(foundClub != null)
			{
				break;
			}
			else
			{
				System.out.println("Can not find club, ID :" + clubId);
			}
			
		}
		return foundClub;
	}
	
	
	public void modify()
	{//변경하고자 하는 Travel club를 찾아라.
		TravelClub targetClub = findOne(); // 사용자로부터 값을 받고
		String newName = consoleutil.getValueOf("New Club name(0.Club Menu, Enter, No Change");
		/*
		 * 사용자에게 새로운 여행 클럽 이름을 입력하도록 요청
		 * consoleutil 객체를 사용하여 사용자 입력을 받는다
		 */
		if(newName.equals("0"))
		{
			return;
		}
		if(!newName.isEmpty()) // 비어 있지 않다면 
		{
			targetClub.setClubName(newName);
			
		}
		
		
		String newIntro = consoleutil.getValueOf("New Club Intro(0.Club Menu, Enter, No Change");
		if(!newIntro.isEmpty())
		{
			targetClub.setIntro(newIntro);
		}
		/*
		 * 마지막으로 이 코드는 변경된 targetClub를 전달하여 
		 * 클럽 정보(이름 및 소개)를 수정하기 위해 
		 * clubService 객체의 modify 메서드를 호출
		 */
		clubService.modify(targetClub);
		System.out.println("Modify Club : " + targetClub.toString());
	}
	
	public void remove()
	{
		/*
		 * 하나의 Club를 찾는 부분을 살펴본다.
		 */
		TravelClub targetClub = findOne();
		String confirmStr = consoleutil.getValueOf("Remove this Club? ( Y: yes, N:no)");
		
		if(confirmStr.toLowerCase().equals("y") || confirmStr.toLowerCase().equals("yes"))
		{
			System.out.println("Remove a club --> " + targetClub.getClubName());
			clubService.remove(targetClub.getId());
		}
		
		else
		{
			System.out.println("Remove cancelled, your club is safe" + targetClub.getClubName());
		}
		/*
		 * toLowerCase() 메소드를 활용해서 
		 * confirmStr이 가지고 있는 문자를 전부 소문자로 바꾼다.
		 */
		
	}
	
	
	
	
}

FeedBack

public class ClubConsole {
	
	private ConsoleUtil consoleutil;
	private ClubService clubService;
	
	public ClubConsole()
	{
		this.consoleutil = new ConsoleUtil();
		/*
		 * 이후 변경될 코드입니다.
		 */
		this.clubService = new ClubServiceLogic();
	}
  • ConsoleUtil 사용자가 값을 입력하는 클래스

  • ClubService 인터페이스로 구현되어 있음

  • this.clubService = new ClubServiceLogic(); 해당 부분은 인터페이스를 implements한 클래스가 ClubServiceLogic이기 때문에 인스턴스화 진행

	public void register()
	{
		while(true)
		{
			String clubName = consoleutil.getValueOf("Club Name(0.Club Menu)");
			/*
			 * 객체를 사용하여 콘솔에서 사용자로부터 값을 입력받는다.
			 * 용자가 프로그램에 클럽 이름을 제공할 수 있게 해주는 부분이다.
			 */
			if(clubName.equals("0")) // 돌아가겠다는 의미
			{
				return; 
			}
			String intro = consoleutil.getValueOf("Club Intro(0.Club Menu)");
			if(intro.equals("0"))
			{
				return;
			}
			
			TravelClub newClub = new TravelClub(clubName, intro);
			clubService.register(newClub);
			
			System.out.println("Registered club : " + newClub.toString());
		}
		

getValueOf

	public String getValueOf(String label)
	{
		System.out.print(label + " : ");
		String inputStr = sc.nextLine();
		inputStr = inputStr.trim();
		/*
		 * trim은 공백이나 이런 부분들을 생략해준다. 
		 * 제주여행 < 엔터가 들어가는데 엔터부분을 빼준다.
		 * 
		 */
		return inputStr;
	}
  • consoleutil의 getValueOf메소드를 통해서 값을 받고 clubName에 할당하고 그 값을 equals에 넣는 아이디어

TravelClub

package entity;

import java.util.UUID;

import javax.sound.midi.SysexMessage;

import util.DateUtil;

public class TravelClub {
	
	private static final int MINIMUM_NAME_LENGTH = 3;
	private static final int MINIMUM_INTRO_LENGTH = 5;
	
	private String id;
	private String clubName;
	private String intro;
	private String foundationDay;
	
	private TravelClub()
	{
		this.id = UUID.randomUUID().toString();
	}
	
	public TravelClub(String clubName, String intro)
	{
		this();
		setClubName(clubName);
		setIntro(intro);
		this.foundationDay = DateUtil.today();
		/*
		 * this()를 사용하여 객체가 생성될 때 기본 생성자의 초기화 코드가 실행되고, 
		 * 그런 다음 clubName 및 intro를 설정하고 foundationDay를 설정하여 객체를 초기화한다.
		 * 
		 */
	}
	
	public void setClubName(String clubName)
	{
		if(clubName.length() < MINIMUM_NAME_LENGTH)
		{
			System.out.println("club name should be longer than 3");
			return;
		}
		this.clubName = clubName;
	}

	public String getClubName()
	{
		return this.clubName;
	}
	
	public void setIntro(String intro)
	{
		if(intro.length() < MINIMUM_INTRO_LENGTH)
		{
			System.out.println("club intro should be longer then : " + MINIMUM_INTRO_LENGTH);
			return;
		}
		this.intro = intro;
	}
	
	public String getIntro()
	{
		return this.intro;
	}
	
	public String getId()
	{
		return this.id;
	}
	public String getFoundationDay()
	{
		return this.foundationDay = foundationDay;
	}
	
	public static TravelClub getSample()
	{
		String clubname = "Sample Club";
		String intro = "Sample Club Intro";
		TravelClub sampleclub = new TravelClub(clubname,intro);
		return sampleclub;
				
	}

	@Override
	public String toString() {
		return "TravelClub [id=" + id + ", clubName=" + clubName + ", intro=" + intro + ", foundationDay="
				+ foundationDay + "]";
	}
	
	
}

FeedBack

내가 몰랐던 부분 This() -> 디폴트 생성자 호출 // 생성자끼리 호출 가능 그리고 생성자를 통해서 Setter / Getter 호출 하면서 응용하는 부분 배울 것.

그리고 Setter 할 떄, 파라미터로 조건을 받아들이고 그 값에 조건을 줘서 return 하는 아이디어도 기억할 것.

	public TravelClub(String clubName, String intro)
	{
		this();
		setClubName(clubName);
		setIntro(intro);
		this.foundationDay = DateUtil.today();
		/*
		 * this()를 사용하여 객체가 생성될 때 기본 생성자의 초기화 코드가 실행되고, 
		 * 그런 다음 clubName 및 intro를 설정하고 foundationDay를 설정하여 객체를 초기화한다.
		 * This를 통해서 ID 값을 할당 받은 것이다.
		 */
	}
	
	
	public static TravelClub getSample()
	{
		String clubname = "Sample Club";
		String intro = "Sample Club Intro";
		TravelClub sampleclub = new TravelClub(clubname,intro);
		return sampleclub;
				
	}

인스턴스화 할 떄 파라미터 값으로 2개의 인자를 넘겨주게 되는데, TravelClub 디폴트 생성자를 This()로 넘겨받아 해당 값을 set 한다. 이 부분의 로직을 기억하자.

ClubSubConsole

package console;

import Service.ClubService;
import Service.ServiceLogicLifeCycle;

public class ClubSubConsole {
	
	private ClubService clubservice;
	
	public ClubSubConsole()
	{
		this.clubservice = ServiceLogicLifeCycle.getuniqueInstance().getClubService();
	}

}

ClubService

package Service;

import entity.TravelClub;

public interface ClubService {
	
	void register(TravelClub travelClub);
	
	TravelClub[] findAll();
	TravelClub[] findName(String clubName);
	TravelClub findId(String clubId);
	
	
	void modify(TravelClub modifyClub);
	void remove(String clubId);

}

ServiceLogicLifeCycle

package Service;

import Service.logic.ClubServiceLogic;

public class ServiceLogicLifeCycle {

	private static ServiceLogicLifeCycle uniqueInstance;
	/*
	 * why ? static으로 선언 했는지는 마무리 되고 알 수 있음
	 * ServiceLogicLifeCycle은 ClubService와 ClubConsole를 알아야 된다.
	 */

	private ClubService clubService;
	
	private ServiceLogicLifeCycle()
	{
		this.clubService = new ClubServiceLogic();
	}

	public ClubService getClubService()
	{
//		if(clubService == null)
//		{
//			clubService = new ServiceLogicLifeCycle();
//		}
		return this.clubService;
	}
	
	public static ServiceLogicLifeCycle getuniqueInstance()
	{
		if(uniqueInstance == null)
		{
			uniqueInstance = new ServiceLogicLifeCycle();
		}
		
		return uniqueInstance;
	}
	
	/*
	 * 생성자가 private가 되서 인스턴스 할 수 있는 부분은 getuniqueInstance밖에 없다.
	 */
}

ClubServiceLogic


package Service.logic;

import java.util.Arrays;

import Service.ClubService;
import entity.TravelClub;

public  class ClubServiceLogic implements ClubService{
	private TravelClub[] clubs;
	private int index;

	public ClubServiceLogic()
	{
		this.clubs = new TravelClub[10];
		this.index = 0;
	}
	@Override
	public void register(TravelClub travelClub) {
		clubs[index] = travelClub;
		index++;
		
	}

	@Override
	public TravelClub[] findAll() {
		
		return Arrays.copyOfRange(clubs, 0, index);
		
	}

	@Override
	public TravelClub[] findName(String clubName) {
		TravelClub[] createdClubs = Arrays.copyOfRange(clubs,0, index);
		TravelClub[] foundClubs = new TravelClub[createdClubs.length];
		int subIndex = 0;
		
		for(TravelClub club : createdClubs)
		{
			if(club.getClubName().equals(clubName))
			{
				foundClubs[subIndex] = club;
				subIndex++;
			}
		}
		

		return Arrays.copyOfRange(foundClubs, 0, subIndex);
		/*
		 * foundClubs 배열을 0부터 subIndex까지 잘라서 새로운 배열을 생성하고 반환하는 역할
		 * subIndex 이후의 요소는 잘려나가고, foundClubs 배열의 길이가 subIndex만큼 줄어든다.
		 * 이렇게 복사된 새로운 배열이 findName 메소드의 반환값이다.
		 */
	}

	@Override
	public TravelClub findId(String clubId) {
		TravelClub[] createdClubs = Arrays.copyOfRange(clubs,0, index);
		TravelClub foundClub = null;
		for(TravelClub club : createdClubs)
		{
			if(club.getId().equals(clubId)) {
				foundClub = club;
				break;
			}
		}
		return foundClub;
	}

	@Override
	public void modify(TravelClub modifyClub) {
		// 중요한 것은 바꿔야 되는 파라미터로 넘어오는 modiftClub은 이름과 인트로가 바뀐것.
		// 배열에 있는 클럽중에 몇번 인덱스에 있는 배열을 바꿔줄것인가를 알아야된다.
		
		int foundIndex = 0;
		
		for(int i = 0; i<clubs.length; i++)
		{
			if(clubs[i].getId().equals(modifyClub.getId()))
			{
				foundIndex = i; // 인덱스를 찾음
				break;
			}
		}
		
		this.clubs[foundIndex] = modifyClub;
		
	}
	/*
	 * modify 메소드는 주어진 클럽 ID를 기반으로 현재 등록된 클럽 중에서 해당 클럽을 찾아서 정보를 수정하는 기능을 수행
	 * 클럽의 ID를 기반으로 인덱스를 찾아내고, 해당 인덱스의 클럽 정보를 주어진 modifyClub 객체의 정보로 대체
	 */

	@Override
	public void remove(String clubId) {

		/*
		 *  a,b,c,d 에서 b를 삭제한다고 가정했을 때, 
		 *  a,c,d -> 앞쪽으로 땡기는 작업이 필요하다. index 활용
		 */
		int foundIndex = 0;
		
		for(int i = 0; i<clubs.length; i++)
		{
			if(clubs[i].getId().equals(clubId))
			{
				foundIndex = i; // 인덱스를 찾음
				break;
			}
		}
		// 찾은 인덱스부터 시작 
		for(int i = foundIndex; i<=this.index; i++)
		{
			clubs[i] = clubs[i+1];
		}
		

		this.index--; //내용을 제거해서 index 
		
	}
	

}

ConsoleUtil

package util;

import java.util.Scanner;

public class ConsoleUtil {
	private Scanner sc;
	
	public ConsoleUtil()
	{
		this.sc = new Scanner(System.in);
	}
	/*
	 * 정수 값이 아니라 문자열로 받아서 반환해줄거임.
	 */
	
	public String getValueOf(String label)
	{
		System.out.print(label + " : ");
		String inputStr = sc.nextLine();
		inputStr = inputStr.trim();
		/*
		 * trim은 공백이나 이런 부분들을 생략해준다. 
		 * 제주여행 < 엔터가 들어가는데 엔터부분을 빼준다.
		 * 
		 */
		return inputStr;
	}

}

DateUtil

package util;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class DateUtil {
	
	public static String today(String format)
	{
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(Calendar.getInstance().getTime());
		
	}
	
	public static String today()
	{
		return today("yyyy.MM.dd");
	}

}
profile
아는만큼보인다.

0개의 댓글