백엔드/JAVA

MVC 패턴 개념

두개의 문 2023. 5. 11. 17:42
MVC ( Model - View -Controller )

 

사용자 인터페이스로, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴

- Model : 데이터와 관련된 부분 → 백그라운드에서 동작하는 비즈니스 로직 ( 데이터 ) 처리

- View : 사용자한테 보여지는 UI부분  정보를 화면으로 보여주는 역할

- Controller : Model과 View의 중개자 역할 → 사용자의 입력 처리와 전반적인 프로그램 흐름 제어

 

( 첫날 배웠던 개념에 이어서 )

- DAO ( Data Access Object ) : 데이터베이스의 data에 접근하기 위한 객체로, 데이터베이스에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용함

  · 비즈니스 로직 ( Business Logic ) : 사용자의 눈에는 보이지 않지만, 사용자가 바른 결과물을 올바르게 도출할 수 있도록 짜여진 코드 로직을 말함

- DTO ( Data Transfer Object ) : 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체( Getter & Setter만 가진 클래스 )

  → 사용자가 입력한 데이터를 DB에 넣는 과정

      ① 사용자가 자신의 브라우저에 데이터를 입력 → form에 있는 데이터를 DTO에 넣어서 전송

      ② 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣음

- VO ( Value Object ) : 값 오브젝트로써 값을 위해 쓰임

  · Read-Only 특징 : 사용하는 도중에 변경 불가능하며 오직 읽기만 가능

  · DTO와 유사하지만 DTO는 Setter를 가지고 있어 값이 변경 가능

 

▷ MVC 패턴을 사용해야 하는 이유

 - 비즈니스 로직과 UI로직을 분리하여 유지보수를 독립적으로 수행 가능

 - Model과 View가 다른 컴포넌트들에 종속되지 않아 애플리케이션의 확장성, 유연성에 유리함

 - 중복 코딩의 문제점 제거 

 

 


멤버 관리 시스템 생성

앞으로 클래스를 역할별로 분리해서 생성하도록 하자

- 클래스 생성 : Member / MemberDAO / MemberApp

  ① Member 클래스 : 변수 선언, 생성자, 속성함수 ( Getter & Setter )

  ② MemberDAO 클래스 : DTO 객체를 관리하는 클래스로 데이터 값을 저장 및 읽어오는 역할

    → Member와 데이터베이스서버 사이에서 중계하는 역할 ( CRUD )

    → 아직 JDBC에 대해 배우지 않았으므로, 데이터베이스의 테이블 데이터 대신 배열을 활용하자.

  ③ MemberApp 클래스 : 실제 main( ) 메서드가 있는 클래스로, 실행 클래스에 해당

 

 

< ① Member 클래스 >

package mvc.mini;

public class Member {

	// 1. 변수 선언 
	private String name;
	private int age;
	private String tel;
	private String email;
	private String addr;
	private int weight;
	
	// 2. 속성함수 ( Getter, Setter )
	public String getName() {
		return this.name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return this.age;
	}
	public void setAge(int age) {
		if ((age < 0) || 
			(age > 150)) {
			this.age = 0;
		} else {
			this.age = age;
		}
	}
	public String getTel() {
		return this.tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public String getEmail() {
		return this.email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getAddr() {
		return this.addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public int getWeight() {
		return this.weight;
	}
	public void setWeight(int weight) {
		// ** 1번째 방법
//		if ((weight < 0) || 
//			(weight > 200)) {
//			this.weight = 50;
//		} else {
//			this.weight = weight;
//		}
		// ** 2번째 방법
		if ((0 <= weight) && 
				(weight <= 200)) {
			this.weight = weight;
			return;			
		}
		this.weight = 50;	
	}

❶ 변수 선언 : 멤버변수를 private로 제한하고, 속성함수를 이용해 간접적으로 멤버변수의 값을 다룰 수 있도록 함

    → 속성함수 : public 메서드로, 직접 작성하거나 [ Source ] - [ Generate Getters and Setters... ] 클릭 → 멤버변수 선택 및 위치 선택하면 자동적으로 생성됨

❷ 변수의 데이터를 유효한 값으로 유지하기 위해서 set 메소드 내에서 if문을 이용하자

    ex ) 나이를 -100으로 입력할 경우, 이 데이터는 유효하지 않은 값이므로 set 메서드에서 기본 default 값으로 처리하여 데이터의 무결성을 유지시킴

 

 

<  MemberDAO 클래스 >

package mvc.mini;

public class MemberDAO {
	
	Member[] members;	// 데이터베이스의 테이블 역할
	int currentIndex; 	
    
	MemberDAO(int arraySize){
		members = new Member[arraySize];
		currentIndex = -1;	
		}
	
	// - 메소드 오버로딩 - 
	// ① 회원정보 추가 - (1)
		// 외부에서 객체 생성 후, 참조변수를 매개변수로 받는 경우
	void insertMember(Member member) {
		currentIndex++;
		// members[currentIndex] = new Member();
		members[currentIndex] = member;
	}
	
	// ① 회원정보 추가 - (2)
		// 직접 개별 멤버데이터를 매개변수로 받는 경우
	void insertMember(
		String name,
		int age,
		String tel,
		String email,
		String addr,
		int weight) {
        
		Member newMember = 
				new Member(name, age, tel, email, addr, weight);
		currentIndex++;		
		members[currentIndex] = newMember;
	}
	
	boolean testInsertMember(Member member) { 
		int count = members.length;	// 현재 테이블의 레코드 수
		insertMember(member);
		int insertCount = members.length;	// 추가된 자료 수
		
		// members 배열의 길이만큼 자료가 추가됨
			// 추가된 테이블의 자료수 - 이전 테이블 자료수 > 0
			// 자료 추가됨
		if (insertCount - count > 0) {
			return true;
		} else {
			return false;
		}
		
	}
	
		// ②-① 전체 회원정보 검색
	void selectMemberAll() {
		
	}
		// ②-② 번호로 지정된 회원정보 검색
			// 반환타입 : Member
	Member selectMemberByIndex(int index) {
		return members[index];
	}
	
		// ③ 회원정보 수정
	void updateMember() {
		
	}
		// ④ 회원정보 삭제
	void deleteMember() {
		
	}