본문 바로가기
프로그래밍 공부/Java

[lesson] Java 프로그래밍 언어 - 디자인 패턴 ( MVC, 싱글톤)

by Luna_lua 2021. 8. 22.
반응형

<소프트웨어 디자인 설계 패턴> 

패턴이란 중복이 있는것! 안방벽지에 꽃패턴을 넣자 이랬으면 꽃이 하나? 여러개? 여러개가 먼저 떠올리게 될것입니다.


패턴은 개발자들끼리의 약속 어딜가도 같은 패턴이면 개발속도 올라가고 필요없는 시간이 준다.
이렇게 효율적으로 개발하기위해 디자인 패턴

 

<MVC 패턴>

※ 자바에서는 할수 없는 패턴이지만 굳이 보려면 main을 뷰단으로 생각해보자!

 

M(Model) : DB에서 조회된 결과 값을 담기 위한 변수들이 선언된 클래스 

 - Model -> 값을 받을 준비, 클래스로 만든다. 모델 하나당 1명의 정보 (1) 
 - 클래스명 뒤에 VO, DTO라는 문자를 붙여준다.
 - VO (Value Object)
 - DTO (Data Transfer Object)

V(View) : 사용자에게 보여질 화면을 구성하는 부분

 - View -> 화면 (컨트롤러의 메소드를 사용), 뷰단에서 객체화
 - Controller에 선언된 메소드를 사용하는 부분

C(Controller) : DB에 접근할 수 있는 메소드들이 선언된 클래스

 - Controller -> 수정요청 => CRUD의 기능을 담당하는 메소드를 만들기(2)
 - 접근 후 결과 값이 있을 경우 Vodel 객체에 담은 후 처리
 - 클래스명 뒤에 DAO라는 문자를 붙여준다.
 - DAO(Data Access Object)

=> Controller에서 Model 을 쓰는것!

 

=> 하나를 3가지로 분리하자! => 분업을 위한 분리 -> 최소 3명이 개발할수 있고, 가독성이 늘어남

=> 이를 적용하기 위해서는 외부 저장소를 알아야한다.

 

 

<싱글톤 패턴>

어떤 클래스가 최초 한번만 메모리를 할당하고(Static), 그 메모리에 객체를 만들어 사용하는 디자인 패턴입니다.

생성자 호출이 반복되어도 실제로 생성되는 객체는 처음에 생성한 static객체를 반환해주는 것입니다.

 

★Point! 자바에서는 생성자를 private로 선언해서 생성 불가하게 하고, getInstance()라는 메소드를 이용하여 객체를 받아내어 객체에 접근합니다.

 

// 제과점에서 빵을 만들고 빵을 먹는 클래스를 만들고 싱글턴패턴으로 getInstance()를 사용하면
// static으로 선언된 이 객체를 리턴해줍니다.

package bakery;

// 싱글턴 패턴
// 어느객체에서도 하나의 객체만 사용해야함
public class BreadPlate {
   
	private static BreadPlate plate;
	
   public int breadCnt;
   public int eatCnt;
   
   private BreadPlate() {;};
   
   
   public static BreadPlate getInstance() {
	   if(plate == null) {
		   plate = new BreadPlate();
	   }
	   return plate;
   }
   
   
   //빵만들기
   public synchronized void makeBread() {
      if(breadCnt > 9) {
         System.out.println("빵이 가득 찼습니다.");
         try {wait();} catch (InterruptedException e) {;}
      }
      breadCnt++;
      System.out.println("빵을 1개 만들었습니다. 총 :" + breadCnt + "개");
   }
   
   //빵먹기
   public synchronized void eatBread() {
      if(eatCnt == 20) {
         System.out.println("빵이 다 떨어졌습니다.");
      }else if(breadCnt < 1) {
         System.out.println("🥐🥯🍪🍪🍩🍩🍩🥖 빵을 만들고있어요 !");
      }else {
         breadCnt--;
         eatCnt++;
         System.out.println("빵을 1개 먹었습니다. 총 :" + breadCnt + "개");
         notify();
      }
   }
}



// 스레드를 사용하여 빵만들기 시작할때 빵만드는 객체는 하나만 있어야 하기 때문에 
// 싱글톤으로 만든 빵만드는 기능을 하나만 작동시켜 동작시킨다.
package bakery;

public class BreadMaker implements Runnable {

	프로그램 종료시 빵제작도 멈추기 위함
	private boolean exit;
	
	public boolean isExit() {
		return exit;
	}

	public void setExit(boolean exit) {
		this.exit = exit;
	}

	@Override
	public void run() {
		try {

			for (int i = 0; i < 20; i++) {
				if (exit) {
					break;
				}
				System.out.println(Thread.interrupted());
				if (Thread.interrupted()) {
					break;
				}
				BreadPlate.getInstance().makeBread();
				Thread.sleep(1000);
			}

		} catch (InterruptedException e) {
			System.out.println("BreadMaker Thread 종료");
		}
	}
}
반응형