JDBC MVC 패턴
1. MVC 패턴
프로그램을 역할별로 나누어 관리하는 구조
| 이름 | 의미 |
| M(Model) | 데이터 / DB 처리 |
| V(View) | 화면 / 사용자 입력 출력 |
| C(Controller) | 중간 연결 역할 |
2. MVC 패턴 구조
View
↓
Controller
↓
Service
↓
DAO
↓
DB
| 클래스 | 역할 |
| Run | 프로그램 시작 |
| View | 사용자 입력 / 출력 |
| Controller | View와 Service 연결 |
| Service | 비즈니스 로직 / commit / rollback 처리 |
| DAO | 실제 SQL 실행 |
| VO(Product) | 데이터 저장 객체 |
| JDBCTemplate | 공통 JDBC 기능 관리 |
3. Run 클래스
프로그램의 시작 클래스
public class Run {
public static void main(String[] args) {
new ProductView().menu();
}
}
- ProductView 객체를 생성하고 menu 실행
- 프로그램이 시작되면 가장 먼저 사용자 메뉴 화면으로 이동
4. ProductView 클래스
사용자가 직접 보는 화면 역할
- 메뉴 출력
- 사용자 입력 받기
- Controller 호출
- 결과 출력
private ProductController controller = new ProductController();
- View는 DB에 직접 접근하지 않고 Controller에 요청
List<Product> resAll = controller.selectAll();
- 전체 조회 시 사용
controller.insert(insertProduct());
- 추가 시 사용자가 입력한 정보를 Product 객체로 만들어 Controller에 전달
View는 SQL을 실행하지 않고 사용자 입력과 출력만 담당
5. ProductController
View와 Service 사이를 연결
public int insert(Product dto) {
return service.insert(dto);
}
- View에서 받은 요청을 Service로 전달하고, Service 결과를 다시 View로 돌려줌
중간 전달자 역할
View 요청 받기
↓
Service에게 전달
↓
Service 결과를 View로 반환
6. ProductService
DB 작업 흐름을 관리
- Connection 생성
- DAO 호출
- 성공 시 commit, 실패 시 rollback
- connection 종료
public int insert(Product dto) {
Connection con = getConnection();
int res = dao.insert(con, dto);
if(res > 0) {
commit(con);
} else {
rollback(con);
}
close(con);
return res;
}
1. DB 연결 생성
2. DAO에게 insert 작업 요청
3. 결과가 1 이상이면 commit
4. 실패하면 rollback
5. DB 연결 종료
6. 결과 반환
SQL 실행은 DAO에게 맡기고, Service는 성공 여부에 따라 commit / rollback을 처리
7. ProductDao
실제 SQL을 작성하고 실행
String sql = " INSERT INTO PRODUCT VALUES(?,?,?,?) ";
? 는 나중에 값이 들어가는 자리
pstm = con.prepareStatement(sql);
pstm.setString(1, dto.getPid());
pstm.setString(2, dto.getPname());
pstm.setInt(3, dto.getPrice());
pstm.setString(4, dto.getDes());
res = pstm.executeUpdate();
- executeUpdate()로 INSERT, UPDATE, DELETE 같은 데이터 변경 SQL을 실행
8. Product VO
DB 데이터를 저장하는 객체
private String pid;
private String pname;
private int price;
private String des;
public Product(String pid, String pname, int price, String des) {
super();
this.pid = pid;
this.pname = pname;
this.price = price;
this.des = des;
}
9. JDBCTemplate
JDBC에서 반복되는 코드를 모아둔 공통 클래스
- getConnection() : DB와 연결
- close() : DB 연결 종료
- commit : DB 변경 사항 저장
- rollback : DB 변경 사 취소
Connection con = getConnection();
- Service 클래스에서 DB 연결을 만들 때 사용
commit(con);
rollback(con);
- 작업 성공 시 commit, 작업 실패 시 rollback 사용
close(con);
- 작업 종료 시 Connection 종료
10. 전체 흐름
10-1 전체 조회 흐름
사용자 조회 요청
↓
ProductView에서 controller.selectAll() 호출
↓
ProductController에서 service.selectAll() 호출
↓
ProductService에서 DB 연결 생성
↓
ProductService에서 dao.selectAll(con) 호출
↓
ProductDao에서 SELECT 실행
↓
조회 결과를 Product 객체로 변환
↓
Product 객체들을 List에 담아 반환
↓
View에서 List를 출력
String sql = " SELECT * FROM PRODUCT ";
- DAO 에서 실행하는 SQL
List<Product> res = new ArrayList<>();
- 조회 결과가 여러 개일 수 있기에 List<Product>에 담음
while(rs.next()) {
Product p = new Product(
rs.getString(1),
rs.getString(2),
rs.getInt(3),
rs.getString(4)
);
res.add(p);
}
- 조회 결과 한 줄을 Product 객체 하나로 만들고, 그 객체를 List에 저장
10-2 INSERT 흐름
사용자가 제품 ID, 이름, 가격, 설명 입력
↓
View에서 Product 객체 생성
↓
View에서 controller.insert(product) 호출
↓
Controller에서 service.insert(product) 호출
↓
Service에서 DB 연결 생성
↓
DAO에서 INSERT 실행
↓
성공하면 Service에서 commit
↓
실패하면 Service에서 rollback
↓
결과를 View로 반환
↓
View에서 성공/실패 메시지 출력
return new Product(id, name, price, des);
- View에서 사용자가 입력한 값을 Product 객체로 만
String sql = " INSERT INTO PRODUCT VALUES(?,?,?,?) ";
- DAO에서 INSERT SQL문을 실행
res = pstm.executeUpdate();
- res가 1 이상(수정된 줄이 1줄 이상)이면 성공
10-3 UPDATE 흐름
수정할 제품 선택
↓
변경할 값 입력
↓
View에서 Product 객체 생성
↓
Controller → Service → DAO 순서로 전달
↓
DAO에서 UPDATE 실행
↓
성공하면 commit
↓
실패하면 rollback
↓
View에서 결과 출력
String sql = " UPDATE PRODUCT SET PRICE = ? WHERE P_ID = ? ";
- DAO에서 UPDATE SQL문 실행
10-4 DELETE 흐름
삭제할 제품 선택
↓
View에서 controller.delete(id) 호출
↓
Controller에서 service.delete(id) 호출
↓
Service에서 DB 연결 생성
↓
DAO에서 DELETE 실행
↓
성공하면 commit
↓
실패하면 rollback
↓
View에서 결과 출력
String sql = " DELETE PRODUCT WHERE P_ID = ? ";
- DAO에서 DELETE SQL문 실행
'FullStack Study > 9주차' 카테고리의 다른 글
| JAVA 풀스택 41일차 - Algorithm2 (정렬 / 이진탐색트리) (0) | 2026.05.25 |
|---|---|
| JAVA 풀스택 40일차 - Algorithm (재귀함수 / 이중연결리스트 / 스택,큐) (0) | 2026.05.22 |
| JAVA 풀스택 39일차 - JDBC (MVC 패턴) (0) | 2026.05.21 |
| JAVA 풀스택 37일차 - JDBC2 (0) | 2026.05.19 |