[Java] InnerClass, Maven, MVC

JH·2023년 3월 27일

Java

목록 보기
6/21

1. TIL

A. InnerClass

클래스 안에 선언된 클래스

장점

  • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
  • 코드의 복잡성을 줄일 수 있다.(캡슐화)

Ex) 내부클래스

// 외부 클래스
class Outer {
	int outerNum = 10;
	
	// 내부 클래스
	class Inner {
		int innerNum = 100;
		
		void innerMethod() {
			System.out.println("내부 클래스 메소드");
		}
	}

	void outerMethod() {
		System.out.println("외부 클래스 메소드");
	}
}

public class InnerClassTest {
	public static void main(String[] args) {
		Outer outerClass = new Outer();
		outerClass.outerMethod(); // 외부 클래스 메소드
		
		// 내부 클래스
//		Inner innerClass = new Inner(); // 불가능, 외부클래스를 통해 생성 해야함
		Outer.Inner innerClass = outerClass.new Inner();
		innerClass.innerMethod(); // 내부 클래스 메소드
	}
}

Ex) 지역클래스, 익명클래스

class OuterClass {
	Runnable getRunnable() {
		// 지역 클래스
		class MyRunnable implements Runnable{
			@Override
			public void run() {
				
			}
		}
		return new MyRunnable();
	}
	Runnable runner = new Runnable() {
		
		@Override
		public void run() {
			
		}
	}; // 세미콜론으로 끝나므로 객체임, 익명클래스 = 객체
}


B. Maven

자바 프로젝트의 빌드(build)를 자동화 해주는 빌드 툴(build tool)
xml 파일을 이용하여 라이브러리를 자동으로 다운로드하거나 프로젝트를 빌드해줌

ex) POM.xml의 dependencies 태그 안에 lombok을 추가하여 사용함

  • POM : Project Object Model : 프로젝트 객체 모델
  • XML : Extensible Markup Language : 데이터를 정의하는 규칙을 제공하는 마크업 언어


C. MVC

처리 과정 : Start View - Controller - Service - Model - EndView

  • service에서 예외 처리함

구조

  • View : (Start, End, FailView)
  • Controller
  • Service
  • Model (DB)
  • DTO : Data Transfer Object, 계층 간의 데이터 교환을 위한 Java Bean를 의미함
    DTO는 로직을 가지지 않는 데이터 객체이고, getter, setter 메소드만 가진 클래스를 의미함

1. StartView

// package, import 생략
public class StartView {
	public static void main(String[] args) {

		BloodTransfusionController controller = BloodTransfusionController.getInstance();

		Donor donor4 = new Donor("donor4", "헌혈4", 52, "M", "AB-", "실험");
        
		Recipient recipient4 = new Recipient("recipient4", "수혈4", 83, "M", "AB-", "수술");
        
		BloodTransfusionProject newProject = new BloodTransfusionProject("AB-", "bt4", donor4, recipient4, "응급 처치 프로젝트");

		// 모든 프로젝트 검색
		controller.projectListView();

		// 새로운 프로젝트 저장, 그리고 모든 프로젝트 검색
		controller.insertProject(newProject);
		controller.projectListView();

		// 존재하는 프로젝트 검색
		controller.projectView("A-");

		// 존재하지 않는 프로젝트 검색
		controller.projectView("A+");

		// 존재하는 프로젝트 수정
		controller.updateProject("A-", new Recipient("recipient5", "수혈5", 2, "F", "A-", "응급수술"));
		controller.projectView("A-");

		// 존재하지 않는 프로젝트 수정 : 예외 발생
		controller.updateProject("B+", new Recipient("recipient6", "수혈6", 22, "F", "B-", "질병"));

		// 존재하는 프로젝트 삭제 및 삭제여부 확인
		controller.deleteProject("B-");
		controller.projectView("B-");
	}
}

2. Controller

// package, import 생략
public class BloodTransfusionController {
	private static BloodTransfusionController instance = new BloodTransfusionController();
	private BloodTransFusionProjectService service = BloodTransFusionProjectService.getInstance();

	private BloodTransfusionController() {}

	public static BloodTransfusionController getInstance() {
		return instance;
	}

	// 모든 프로젝트 검색
	public void projectListView() {
		ArrayList<BloodTransfusionProject> projectList = service.getAllProjects();
		EndView.projectListView(projectList);
	}
	
	// 특정 프로젝트 검색_
	public void projectView(String projectName) {
		BloodTransfusionProject project = null;
		
        // NotExistException 라는 사용자 정의 예외로 처리함
		try {
			project = service.getProject(projectName);
		} catch (NotExistException e) {
			FailView.failMessageView(e.getMessage());
		}
		
		EndView.projectView(project);
	}

	// 새로운 프로젝트 저장_
	public void insertProject(BloodTransfusionProject newProject) {
		service.projectInsert(newProject);
	}
	
	// 존재하는 프로젝트 수정_
	public void updateProject(String projectName, People people) {
		try {
			service.projectUpdate(projectName, people);
		} catch (NotExistException e) {
			FailView.failMessageView(e.getMessage());
		}
	}

	// 이름으로 검색한 프로젝트 삭제_
	public void deleteProject(String projectName) {
		try {
			service.projectDelete(projectName);
		} catch (NotExistException e) {
			FailView.failMessageView(e.getMessage());
		}
	}
}

3. Service

// package, import 생략
public class BloodTransFusionProjectService {
	private static BloodTransFusionProjectService instance = new BloodTransFusionProjectService();
	private BloodTransfusionVirtualDB projectVirtualData = BloodTransfusionVirtualDB.getInstance();

	private BloodTransFusionProjectService(){}
	public static BloodTransFusionProjectService getInstance(){
		return instance;
	}
	
	// 모든 프로젝트 반환, 배열 객체를 ArrayList로
	public ArrayList<BloodTransfusionProject> getAllProjects(){
		return projectVirtualData.getProjectList();
	}
	
	// 프로젝트 검색_
	public BloodTransfusionProject getProject(String projectName) throws NotExistException{
		BloodTransfusionProject project = null;
		
		ArrayList<BloodTransfusionProject> projectList = projectVirtualData.getProjectList();
		
		for (int i = 0; i < projectList.size(); i++) {
			if(projectList.get(i).getBtProjectName().equals(projectName)) {
				project = projectList.get(i);
			} 			
		}
		
		if(project == null) {
			throw new NotExistException("검색 요청하신 프로젝트는 존재하지 않습니다");
		}
		
		return project;
	}

	// 새로운 프로젝트 추가_
	public void projectInsert(BloodTransfusionProject newProject) {
		projectVirtualData.insertProject(newProject);
	}
	
	// 프로젝트 수정 - 프로젝트 명으로 현혈자 혹은 수혈자 수정_ , People : 다형성을 사용함
	public void projectUpdate(String projectName, People people) throws NotExistException{
		// 이미 완성된 getProjectName(projectName) 사용
		BloodTransfusionProject project = getProject(projectName);
		
		
		// Recipient 로 형변환 해줘야 함
		if(project == null) {
			throw new NotExistException("수정하고자 하는 Project가 존재하지 않습니다");
		} else if (people instanceof Recipient) {
				project.setRecipient((Recipient)people);
		} else if (people instanceof Donor) {
				project.setDonor((Donor)people);
		}
	}
	
	// 프로젝트 삭제_
	public void projectDelete(String projectName) throws NotExistException{
		BloodTransfusionProject project = getProject(projectName);
		getAllProjects().remove(project);
	}	
}

4. Model (DB)

// package, import 생략
public class BloodTransfusionVirtualDB {
	private static BloodTransfusionVirtualDB instance = new BloodTransfusionVirtualDB();
	private ArrayList<BloodTransfusionProject> projects = new ArrayList<>();
	
	private BloodTransfusionVirtualDB() {
		projects.add(new BloodTransfusionProject("A-", "bt1",
												new Donor("donor1", "헌혈1", 12, "M", "A-", "봉사"), 
												new Recipient("recipient1", "수혈1", 23, "F", "A-", "사고"), 
												"A-형간의 수혈"));
	
	public static BloodTransfusionVirtualDB getInstance() {
		return instance;
	}
	
	// 모든 프로젝트 반환_
	public ArrayList<BloodTransfusionProject> getProjectList(){
		return projects;
	}
	
	// 프로젝트 추가_
	public void insertProject(BloodTransfusionProject newProject) {
		projects.add(newProject);
	}
	// 수정, 삭제를 Service가 처리함
}


2. 에러

타입이 일치 하지 않거나 해당 타입에 대한 속성이나 메소드 처리에서 많은 예외를 만남
커서에 나오는 안내문이나 구글링, 질문으로 해결함


3. 보완 해야 할 것

MVC 패턴에서 구조 파악 잘하기
M V C (Service) 에서 데이터의 흐름 잘 이해하기
타입에 대한 일치 여부를 꾸준히 생각해야함, 아니면 형변환을 고려해야함
내가 어디에서 어떤 타입에 대해 작업해야하는지 인지하여야 함


4. 느낀점

Start View - Controller - Service - Model - EndView의 구조로 작업을 해보니 흐름에 대한 얼개는 파악되지만 어디서 작업하는지 어떻게 작업할 지를 고민해보게된다.

완벽하게 이해했다고는 어렵겠지만 어느 정도 흐름을 이해한 것 같다.

코드가 갑자기 길어져서 요약을 하면 중간 중간 끊기는 것 같고 파악하기 어려울 것 같아 원본 코드를 그대로 올렸다. 코드 전체를 흐름대로 이해하고 다시 타이핑해보는게 더 좋은 방법으로 판단된다.

profile
잘해볼게요

0개의 댓글