데이터의 구조를 정의한 클래스입니다.
프로그램에서 다루는 데이터를 "틀"로 만들어 놓으면, 데이터를 쉽게 주고받고 관리할 수 있습니다.
// User 모델
public class User {
private String userId; // 사용자 ID
private String userName; // 사용자 이름
private String email; // 이메일
public User(String userId, String userName, String email) {
this.userId = userId;
this.userName = userName;
this.email = email;
}
// Getter
public String getUserId() { return userId; }
public String getUserName() { return userName; }
public String getEmail() { return email; }
}
// 붕어빵 틀(Model)로 붕어빵(객체) 만들기
User user1 = new User("user001", "김준석", "junseok@email.com");
User user2 = new User("user002", "이민수", "minsu@email.com");
비즈니스 로직이 있는 영역입니다.
"이 앱이 실제로 무엇을 하는지"에 대한 핵심 규칙과 로직이 들어있습니다.
앱의 핵심 기능을 UI나 데이터베이스와 분리하면, 나중에 UI를 바꾸거나 DB를 교체해도 핵심 로직은 그대로 유지할 수 있습니다.
// LoginDomain (로그인 도메인)
public class LoginDomain {
// 비즈니스 규칙 1: 이메일 형식 검증
public boolean isValidEmail(String email) {
if (email == null || email.isEmpty()) {
return false;
}
// @가 포함되어 있는지 확인
return email.contains("@");
}
// 비즈니스 규칙 2: 비밀번호 길이 검증
public boolean isValidPassword(String password) {
if (password == null) {
return false;
}
// 비밀번호는 최소 6자 이상
return password.length() >= 6;
}
// 비즈니스 규칙 3: 로그인 가능 여부 판단
public boolean canLogin(String email, String password) {
return isValidEmail(email) && isValidPassword(password);
}
}
데이터를 가져오거나 저장하는 통로 역할을 하는 클래스입니다.
데이터가 어디에 있든(서버, 로컬 DB, 메모리) 통일된 방법으로 데이터를 다룰 수 있게 해줍니다.
// UserRepository 인터페이스
public interface UserRepository {
User getUser(String userId); // 사용자 정보 조회
boolean saveUser(User user); // 사용자 정보 저장
boolean deleteUser(String userId); // 사용자 정보 삭제
}
// 실제 구현체 (서버에서 데이터 가져오는 경우)
public class UserRepositoryImpl implements UserRepository {
@Override
public User getUser(String userId) {
// 실제로는 서버 API 호출
// 여기서는 예시로 하드코딩
return new User("user001", "김준석", "junseok@email.com");
}
@Override
public boolean saveUser(User user) {
// 서버에 사용자 정보 저장
System.out.println("사용자 정보 저장: " + user.getUserName());
return true;
}
@Override
public boolean deleteUser(String userId) {
// 서버에서 사용자 정보 삭제
System.out.println("사용자 정보 삭제: " + userId);
return true;
}
}
UI(화면)와 데이터를 연결해주는 중간 다리 역할을 하는 클래스입니다.
// LoginViewModel
public class LoginViewModel {
private UserRepository userRepository;
public LoginViewModel(UserRepository userRepository) {
this.userRepository = userRepository;
}
// UI가 호출할 메서드
public boolean login(String email, String password) {
// 1. 입력값 검증
if (email == null || email.isEmpty()) {
System.out.println("이메일을 입력하세요");
return false;
}
if (password == null || password.isEmpty()) {
System.out.println("비밀번호를 입력하세요");
return false;
}
// 2. Repository를 통해 로그인 처리
User user = userRepository.getUser(email);
if (user != null) {
System.out.println("로그인 성공: " + user.getUserName());
return true;
} else {
System.out.println("로그인 실패");
return false;
}
}
}
[사용자]
↓ 버튼 클릭
[Activity/Fragment (UI)]
↓ "로그인 해줘!" 요청
[ViewModel]
↓ "사용자 정보 가져와줘!" 요청
[Repository]
↓ 서버/DB에 요청
[서버/DB]
↓ 사용자 정보 반환
[Repository]
↓ User 모델로 변환
[ViewModel]
↓ 로그인 성공/실패 판단
[Activity/Fragment (UI)]
↓ 화면에 결과 표시
[사용자]
| 요소 | 역할 | 비유 |
|---|---|---|
| Model | 데이터 구조 정의 | 붕어빵 틀 |
| Domain | 비즈니스 로직 | 카페의 주문 규칙 |
| Repository | 데이터 출처 관리 | 도서관 사서 |
| ViewModel | UI와 데이터 연결 | 레스토랑 웨이터 |
| View (UI) | 화면 표시 | 손님(사용자)이 보는 메뉴판 |