← Назад к вопросам
Какая логика модели в MVC?
1.0 Junior🔥 151 комментариев
#SOLID и паттерны проектирования#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Какая логика модели в MVC?
Модель в MVC содержит вся бизнес-логика приложения — всё, что не связано с представлением пользователю (UI) и управлением потоком запросов.
Структура MVC
Узел управления:
- Model - данные и их преобразование
- Controller - логика управления, маршрутизация
- View - представление данных
Что входит в Model?
1. Бизнес-логика
public class User {
private String email;
private String password;
public boolean isValidEmail() {
return email.matches("^[A-Za-z0-9+_.-]+@(.+)$");
}
public boolean isPasswordStrong() {
return password.length() >= 8;
}
}
public class UserService {
public User register(String email, String password) {
if (!isValidEmail(email)) {
throw new ValidationException("Invalid email");
}
User user = new User(email, hashPassword(password));
userRepository.save(user);
return user;
}
public User authenticate(String email, String password) {
User user = userRepository.findByEmail(email);
if (!validatePassword(password, user.getPassword())) {
throw new AuthException("Invalid password");
}
return user;
}
}
2. Доступ к данным (Repository/DAO)
public interface UserRepository {
User findByEmail(String email);
void save(User user);
void delete(Long id);
List<User> findAll();
}
3. Entities (Модели данных)
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false)
private String password;
}
Что НЕ входит в Model?
Не входят HTTP детали
// ПЛОХО - HTTP в Model
public class UserService {
public ResponseEntity<?> register(HttpServletRequest request) {
}
}
// ХОРОШО - только бизнес-логика
public class UserService {
public User register(String email, String password) {
}
}
Не входит логика представления
// ПЛОХО - View логика в Model
public class User {
public String getFormattedEmail() {
return "<strong>" + email + "</strong>";
}
}
// ХОРОШО
public class User {
public String getEmail() {
return email;
}
}
Не входит управление потоком
// ПЛОХО - управление потоком в Model
public class UserService {
public void handleRequest() {
if (isLogin) {
redirectToHome();
}
}
}
// ХОРОШО - это работа Controller
public class UserController {
@PostMapping("/login")
public String login(String email, String password) {
User user = userService.authenticate(email, password);
return "redirect:/home";
}
}
Пример: полная MVC структура
Model слой
@Entity
public class Order {
@Id
private Long id;
private String status;
private BigDecimal total;
}
@Service
public class OrderService {
@Autowired
private OrderRepository repository;
public Order createOrder(Long userId, List<Long> itemIds) {
Order order = new Order();
order.setUserId(userId);
order.setStatus("PENDING");
order.setTotal(calculateTotal(itemIds));
repository.save(order);
return order;
}
public void payOrder(Long orderId) {
Order order = repository.findById(orderId).orElseThrow();
if (!order.getStatus().equals("PENDING")) {
throw new OrderException("Cannot pay");
}
order.setStatus("PAID");
repository.save(order);
}
}
Controller слой
@RestController
@RequestMapping("/api/orders")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping
public OrderDTO createOrder(@RequestBody CreateOrderRequest request) {
Order order = orderService.createOrder(
request.getUserId(),
request.getItemIds()
);
return OrderDTO.fromEntity(order);
}
@PostMapping("/{id}/pay")
public OrderDTO payOrder(@PathVariable Long id) {
orderService.payOrder(id);
Order order = orderService.getOrderById(id);
return OrderDTO.fromEntity(order);
}
}
Слои Model в Spring архитектуре
Model
├── Entities (Domain Models)
├── DTOs (Data Transfer Objects)
├── Services (Бизнес-логика)
├── Repositories (Доступ к данным)
└── Utils/Validators (Вспомогательные)
Ключевые принципы
- Model независим - не знает о View и Controller
- Переиспользуемость - Model в разных Controller
- Тестируемость - Unit тесты без Controller
- Разделение ответственности - каждый слой делает одно
Заключение
Model содержит:
- Бизнес-логику приложения
- Доступ к данным (Repository)
- Валидацию данных
- Расчёты и преобразования
- Domain entities
Model НЕ содержит:
- HTTP/Request/Response детали
- HTML/UI форматирование
- Маршрутизацию и управление потоком
- Сессии и cookies напрямую
Это разделение позволяет иметь чистую, тестируемую, переиспользуемую архитектуру.