[디자인 패턴] Domain, Repository, Model이란?

Ju-unn·2026년 5월 23일

1. Model (모델)

정의

데이터의 구조를 정의한 클래스입니다.

왜 필요한가요?

프로그램에서 다루는 데이터를 "틀"로 만들어 놓으면, 데이터를 쉽게 주고받고 관리할 수 있습니다.

예시: 사용자 정보

// 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
  • 붕어빵 = Model을 기반으로 만들어진 실제 데이터 (객체)
// 붕어빵 틀(Model)로 붕어빵(객체) 만들기
User user1 = new User("user001", "김준석", "junseok@email.com");
User user2 = new User("user002", "이민수", "minsu@email.com");

2. Domain (도메인)

정의

비즈니스 로직이 있는 영역입니다.
"이 앱이 실제로 무엇을 하는지"에 대한 핵심 규칙과 로직이 들어있습니다.

왜 필요한가요?

앱의 핵심 기능을 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);
    }
}

실생활 비유

  • 카페의 주문 규칙 = Domain
    • "아메리카노는 ICE/HOT 선택 가능"
    • "쿠폰 10개 모으면 1잔 무료"
    • 이런 규칙은 카페가 온라인이든 오프라인이든 똑같이 적용됩니다!

3. Repository (레포지토리)

정의

데이터를 가져오거나 저장하는 통로 역할을 하는 클래스입니다.

왜 필요한가요?

데이터가 어디에 있든(서버, 로컬 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;
    }
}

실생활 비유

  • 도서관 사서 = Repository
    • 책이 어디 있든(1층, 2층, 서고) 사서에게 요청하면 찾아줍니다
    • 우리는 책이 정확히 어디 있는지 몰라도 됩니다
    • Repository도 마찬가지! 데이터가 서버에 있든 로컬에 있든 Repository에게 요청만 하면 됩니다

4. ViewModel (뷰모델)

정의

UI(화면)와 데이터를 연결해주는 중간 다리 역할을 하는 클래스입니다.

왜 필요한가요?

  • Activity/Fragment가 데이터를 직접 다루면 코드가 복잡해집니다
  • 화면 회전 등으로 Activity가 재생성되면 데이터가 날아갑니다
  • ViewModel은 생명주기에 안전하게 데이터를 보관합니다

예시: 로그인 ViewModel

// 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;
        }
    }
}

실생활 비유

  • 레스토랑 웨이터 = ViewModel
    • 손님(UI)과 주방(Repository/Domain) 사이를 연결
    • 손님이 "파스타 하나요!"라고 하면, 웨이터가 주방에 전달
    • 주방에서 완성된 음식을 손님에게 전달

5. 전체 흐름 정리

로그인 흐름 (간단 버전)

[사용자] 
   ↓ 버튼 클릭
[Activity/Fragment (UI)]
   ↓ "로그인 해줘!" 요청
[ViewModel]
   ↓ "사용자 정보 가져와줘!" 요청
[Repository]
   ↓ 서버/DB에 요청
[서버/DB]
   ↓ 사용자 정보 반환
[Repository]
   ↓ User 모델로 변환
[ViewModel]
   ↓ 로그인 성공/실패 판단
[Activity/Fragment (UI)]
   ↓ 화면에 결과 표시
[사용자]

각 요소의 역할 요약

요소역할비유
Model데이터 구조 정의붕어빵 틀
Domain비즈니스 로직카페의 주문 규칙
Repository데이터 출처 관리도서관 사서
ViewModelUI와 데이터 연결레스토랑 웨이터
View (UI)화면 표시손님(사용자)이 보는 메뉴판

핵심 정리

  1. Model: 데이터의 틀 (예: User 클래스)
  2. Domain: 비즈니스 규칙 (예: 로그인 가능 여부 판단)
  3. Repository: 데이터 출처 통합 관리 (예: 서버에서 사용자 정보 가져오기)
  4. ViewModel: UI와 데이터 연결 (예: 로그인 버튼 클릭 시 처리)
profile
한줄한줄 기록해보자

0개의 댓글