FullStack Study/9주차

JAVA 풀스택 38일차 - JDBC (MVC 패턴)

레몬팡777 2026. 5. 20. 08:44

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문 실행