학습 목표
1. MVC 패턴을 사용해 보자.
2. context.xml 파일에 대한 개념을 살펴 보자.
MVC 패턴이란?
MVC (Model-View-Controller) 패턴은 소프트웨어 설계 패턴으로, 애플리케이션을 세 가지 주요 구성 요소인 모델(Model), 뷰(View), 컨트롤러(Controller)로 나누어 구현하는 방식을 말합니다. 이를 통해 코드의 재사용성과 유지보수성을 높이고, 역할과 책임을 명확히 분리하는데 목적이 있습니다.
소프트웨어 설계 패턴은 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위해 검증된 재사용 가능한 솔루션입니다. 설계 패턴은 객체 지향 설계 원칙을 따르며, 다양한 상황에서 사용될 수 있는 일반적인 템플릿을 제공합니다. (디자인패턴이라고도 합니다)
주요 소프트웨어 설계 패턴
생성 패턴 (Creational Patterns): 객체 생성 메커니즘을 제공하여 코드의 유연성을 높입니다.
구조 패턴 (Structural Patterns): 클래스와 객체를 조합하여 더 큰 구조를 형성합니다.
행위 패턴 (Behavioral Patterns): 객체 간의 상호작용과 책임 분담을 정의합니다.
그럼 MVC 패턴은 무슨 패턴일까? MVC (Model-View-Controller) 패턴은 1979년에 트리그브 렌스카우그(Trygve Reenskaug)가 제록스 팔로 알토 리서치 센터(Xerox Palo Alto Research Center, PARC)에서 개발한 Smalltalk-80 언어에서 처음 소개되었습니다. 렌스카우그의 원래 목표는 사용자 인터페이스를 설계하는 데 있어 데이터, 비즈니스 로직, 그리고 사용자 인터페이스를 명확히 분리하는 것이었습니다. 이로 인해 시스템을 더 쉽게 이해하고 유지보수할 수 있게 되었습니다.
MVC는 구조 패턴과 행위 패턴을 결합한 복합 패턴으로 볼 수 있습니다.
MVC 패턴은 Model, View, Controller의 앞 글자를 딴 것으로 프로그램을 구성하는 요소들을 모델, 컨트롤, 뷰로 나누어 설계하는 아키텍처 패턴 중의 하나이다.
- Model (모델): 애플리케이션의 데이터와 비즈니스 로직을 관리합니다. 데이터베이스와의 상호작용을 처리하며, 데이터의 상태를 유지합니다.
- View (뷰): 사용자 인터페이스를 담당합니다. 모델의 데이터를 사용자에게 보여주고, 사용자의 입력을 받아들입니다.
- Controller (컨트롤러): 사용자의 입력을 처리하고, 모델과 뷰를 연결합니다. 사용자의 요청을 받아 적절한 모델을 호출하고, 결과를 뷰에 전달합니다.
Dynamic Web Project 생성
- MVC 패턴을 활용한 코드 설계
- 필요 라이브러리 확인
https://mvnrepository.com/artifact/com.zaxxer/HikariCP
HikariCP 라이브러를 사용하기 위해서 다른 추가적인 라이브러리 설정이 필요하다.
https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.21
https://mvnrepository.com/artifact/org.slf4j/slf4j-api/2.0.0-alpha5
https://mvnrepository.com/artifact/org.slf4j/slf4j-simple/2.0.0
커넥션 풀을 사용하기 위한 DataSource 설계와 conext.xml 파일에 사용
context.xml 파일에 DataSource 설정 (HikariCP 사용 )
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
factory="com.zaxxer.hikari.HikariJNDIFactory"
uniqueResourceName="MyDB"
minimumIdle="5"
maximumPoolSize="10"
connectionTimeout="30000"
idleTimeout="600000"
maxLifetime="1800000"
jdbcUrl="jdbc:mysql://localhost:3306/tb_todo?serverTimezone=Asia/Seoul"
driverClassName="com.mysql.cj.jdbc.Driver"
username="root"
password="asd123"/>
</Context>
package com.tenco.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class BasicDBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/m_todo?serverTimezone=Asia/Seoul";
private static final String USER = "root";
private static final String PASSWORD = "asd123";
public static Connection getConnection() throws SQLException {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
테이블 설계
create database if not exists db_todo2;
use db_todo2;
-- 정규화 1, 2, 3 정규 테이블 설계
-- users 테이블을 생성
create table if not exists users(
id int auto_increment primary key,
username varchar(50) not null,
password varchar(255) not null,
email varchar(100) not null,
created_at timestamp default current_timestamp
);
desc users;
alter table users add constraint unique(username);
-- todos 테이블 생성
create table if not exists todos(
id int auto_increment primary key,
title varchar(100) not null,
description text,
created_at timestamp default current_timestamp,
due_date date,
completed boolean default false,
user_id int not null,
foreign key(user_id) references users(id)
);
-- 샘플 데이터 삽입
-- users 테이블에 데이터 삽입
INSERT INTO users (username, password, email) VALUES
('홍길동', 'asd123', 'hong@example.com'),
('김철수', 'asd123', 'kim@example.com'),
('이영희', 'asd123', 'lee@example.com');
-- todos 테이블에 데이터 삽입
INSERT INTO todos (user_id, title, description, due_date, completed) VALUES
(1, '할 일 1', '할 일 1에 대한 설명입니다.', '2023-12-31', FALSE),
(1, '할 일 2', '할 일 2에 대한 설명입니다.', '2024-01-15', TRUE),
(2, '할 일 3', '할 일 3에 대한 설명입니다.', '2024-02-28', FALSE),
(3, '할 일 4', '할 일 4에 대한 설명입니다.', '2024-03-10', TRUE);
select * from users;
select * from todos;
show processlist;
'Java > JSP' 카테고리의 다른 글
커스텀 태그(JSTL) 라이브러리 사용, (EL 표현식) (1) | 2024.07.15 |
---|---|
서블릿과 JSP의 개념과 차이점 (0) | 2024.07.15 |
쿠키와 세션 관리 (0) | 2024.07.15 |
폼 처리와 요청 방식 (0) | 2024.07.15 |
JSP 내장 객체란 뭘까? (0) | 2024.07.15 |