목차
1 MEMBER 테이블
2 JDBCTemplate
3 MVC 구조 복습
4 Member DTO
5 MemberView
6 MemberController
7 MemberService 인터페이스
8 MemberServiceImpl
9 MemberDao 인터페이스
10 MemberDaoImpl
11 전체 조회 기능
12 선택 조회 기능
13 추가 기능
14 수정 기능
15 삭제 기능
16 기존 Controller 방식
17 새로운 통합 Controller 방식
1 MEMBER 테이블
1) MEMBER 테이블의 역할
(1) 회원 정보 저장 테이블
MEMBER 테이블은 회원 정보를 저장하는 테이블이다.
회원번호, 이름, 나이, 성별, 지역, 직업, 전화번호, 이메일 정보를 관리한다.
(2) JDBC CRUD 실습용 테이블
이 테이블은 Java JDBC를 이용해 전체 조회, 선택 조회, 추가, 수정, 삭제 기능을 구현하기 위해 사용된다.
Java 프로그램에서 메뉴를 선택하면 MEMBER 테이블의 데이터가 조회되거나 변경된다.
2) MEMBER 컬럼
(1) M_NO
M_NO는 회원을 구분하는 회원번호이다.
PRIMARY KEY로 설정되어 있어서 중복될 수 없고, 각 회원을 식별하는 기준이 된다.
(2) M_NAME
M_NAME은 회원 이름을 저장하는 컬럼이다.
NOT NULL이 설정되어 있어서 반드시 값이 들어가야 한다.
(3) M_AGE
M_AGE는 회원 나이를 저장하는 컬럼이다.
NOT NULL이 설정되어 있어서 회원 추가 시 반드시 입력해야 한다.
(4) M_GENDER
M_GENDER는 회원 성별을 저장하는 컬럼이다.
CHECK 제약조건을 통해 M 또는 F만 저장할 수 있고, NOT NULL이 설정되어 있어 비워둘 수 없다.
(5) M_LOCATION
M_LOCATION은 회원의 지역 정보를 저장하는 컬럼이다.
회원이 사는 지역이나 활동 지역을 저장할 때 사용한다.
(6) M_JOB
M_JOB은 회원의 직업 정보를 저장하는 컬럼이다.
회원의 직업이나 역할 정보를 저장할 수 있다.
(7) M_TEL
M_TEL은 회원의 전화번호를 저장하는 컬럼이다.
연락처 정보를 관리할 때 사용한다.
(8) M_EMAIL
M_EMAIL은 회원의 이메일을 저장하는 컬럼이다.
회원의 이메일 주소를 관리할 때 사용한다.
3) SEQ_MEMBER
(1) 시퀀스의 역할
SEQ_MEMBER는 회원번호를 자동으로 생성하기 위한 시퀀스이다.
회원을 추가할 때 M_NO 값을 직접 입력하지 않고 SEQ_MEMBER.NEXTVAL을 사용해 자동으로 번호를 넣을 수 있다.
(2) 사용하는 이유
회원번호는 중복되면 안 되는 값이다.
시퀀스를 사용하면 매번 마지막 번호를 직접 확인하지 않아도 새로운 번호를 자동으로 만들 수 있다.
2 JDBCTemplate
1) JDBCTemplate의 개념
(1) JDBCTemplate의 역할
JDBCTemplate은 JDBC에서 반복되는 DB 연결, 자원 해제, commit, rollback 코드를 모아둔 공통 클래스이다.
여러 DAO와 Service에서 같은 코드를 반복하지 않도록 도와준다.
(2) 사용하는 이유
JDBC는 Connection 생성, PreparedStatement 종료, ResultSet 종료 같은 코드가 계속 반복된다.
이 코드를 JDBCTemplate에 모아두면 전체 코드가 간결해지고 유지보수가 쉬워진다.
2) getConnection
(1) DB 연결 생성
getConnection은 Oracle JDBC Driver를 등록하고 데이터베이스에 연결한 뒤 Connection 객체를 반환한다.
SQL을 실행하려면 먼저 DB와 연결된 Connection이 필요하다.
(2) 접속 정보
url, id, pw는 DB에 접속하기 위한 정보이다.
url은 DB 위치와 서비스명을 나타내고, id와 pw는 접속 계정을 의미한다.
(3) 자동 커밋 해제
con.setAutoCommit(false)는 자동 커밋을 끄는 설정이다.
자동 커밋을 끄면 INSERT, UPDATE, DELETE 실행 후 직접 commit 또는 rollback을 선택할 수 있다.
3) close 메소드
(1) 자원 해제
close 메소드는 사용이 끝난 JDBC 객체를 닫는 역할을 한다.
Connection, Statement, ResultSet은 DB 자원을 사용하기 때문에 작업이 끝나면 반드시 닫아야 한다.
(2) 오버로딩
close 메소드는 매개변수 타입에 따라 Connection, Statement, ResultSet을 각각 닫을 수 있다.
같은 이름의 메소드라도 전달되는 객체 타입에 따라 다른 close 메소드가 실행된다.
(3) PreparedStatement 닫기
PreparedStatement는 Statement를 상속받기 때문에 close(Statement stmt) 메소드로 닫을 수 있다.
DAO에서 PreparedStatement를 사용한 뒤 finally에서 close(pstm)을 호출하는 이유이다.
4) commit과 rollback
(1) commit
commit은 INSERT, UPDATE, DELETE 같은 변경 작업을 데이터베이스에 최종 반영하는 기능이다.
작업이 성공했을 때 호출한다.
(2) rollback
rollback은 변경 작업을 취소하는 기능이다.
작업이 실패했거나 결과가 반영되면 안 될 때 호출한다.
(3) Service에서 처리
commit과 rollback은 DAO가 아니라 Service에서 처리한다.
Service가 하나의 기능 흐름을 관리하고, DAO 실행 결과에 따라 성공 여부를 판단하기 때문이다.
3 MVC 구조 복습
1) MVC의 개념
(1) MVC의 역할
MVC는 프로그램을 Model, View, Controller로 나누어 작성하는 구조이다.
화면 처리, 요청 전달, 데이터 처리를 분리해서 코드 관리가 쉬워진다.
(2) MVC를 사용하는 이유
모든 코드를 한 클래스에 작성하면 기능이 많아질수록 복잡해진다.
역할별로 클래스를 나누면 각 클래스가 맡은 일이 명확해지고 유지보수가 쉬워진다.
2) View
(1) View의 역할
View는 사용자에게 메뉴를 보여주고 입력을 받는 클래스이다.
이 프로젝트에서는 MemberView가 View 역할을 한다.
(2) 사용자 요청 시작점
사용자는 MemberView에서 전체출력, 선택출력, 추가, 수정, 삭제 중 하나를 선택한다.
View는 사용자의 입력을 받아 Controller로 전달한다.
3) Controller
(1) Controller의 역할
Controller는 View의 요청을 받아 Service로 전달하는 중간 관리자이다.
View가 Service나 DAO를 직접 호출하지 않도록 흐름을 연결한다.
(2) 요청 전달
MemberController는 selectAll, selectOne, insert, update, delete 메소드를 가지고 있다.
각 메소드는 Service의 같은 기능을 호출한다.
4) Service
(1) Service의 역할
Service는 비즈니스 로직과 트랜잭션 처리를 담당한다.
DB 연결을 생성하고 DAO를 호출한 뒤 commit 또는 rollback을 처리한다.
(2) Connection 관리
Service는 JDBCTemplate.getConnection으로 Connection을 만들고, 기능 수행이 끝나면 close한다.
하나의 기능을 하나의 트랜잭션 흐름으로 관리하기 위해 Service에서 Connection을 다룬다.
5) DAO
(1) DAO의 역할
DAO는 데이터베이스에 직접 접근하는 클래스이다.
SQL문을 실행하고 ResultSet 결과를 DTO 객체로 변환한다.
(2) SQL 담당
DAO는 SELECT, INSERT, UPDATE, DELETE 같은 SQL 실행을 담당한다.
View와 Controller는 SQL문을 몰라도 기능을 사용할 수 있다.
6) DTO
(1) DTO의 역할
DTO는 데이터를 담아서 계층 사이에 전달하는 객체이다.
MEMBER 테이블의 한 행을 Member 객체 하나로 표현한다.
4 Member DTO
1) Member 클래스의 역할
(1) Member DTO
Member 클래스는 MEMBER 테이블의 데이터를 Java 객체로 표현하는 DTO 클래스이다.
회원번호, 이름, 나이, 성별, 지역, 직업, 전화번호, 이메일을 하나의 객체에 담는다.
(2) DTO를 사용하는 이유
회원 정보를 여러 개의 변수로 따로 전달하면 코드가 복잡해진다.
Member 객체 하나로 묶으면 View, Controller, Service, DAO 사이에서 데이터를 쉽게 전달할 수 있다.
2) 필드
(1) m_no
m_no는 회원번호를 저장한다.
MEMBER 테이블의 M_NO 컬럼과 연결된다.
(2) m_name
m_name은 회원 이름을 저장한다.
MEMBER 테이블의 M_NAME 컬럼과 연결된다.
(3) m_age
m_age는 회원 나이를 저장한다.
MEMBER 테이블의 M_AGE 컬럼과 연결된다.
(4) m_gender
m_gender는 회원 성별을 저장한다.
MEMBER 테이블의 M_GENDER 컬럼과 연결된다.
(5) m_location
m_location은 회원 지역을 저장한다.
MEMBER 테이블의 M_LOCATION 컬럼과 연결된다.
(6) m_job
m_job은 회원 직업을 저장한다.
MEMBER 테이블의 M_JOB 컬럼과 연결된다.
(7) m_tel
m_tel은 회원 전화번호를 저장한다.
MEMBER 테이블의 M_TEL 컬럼과 연결된다.
(8) m_email
m_email은 회원 이메일을 저장한다.
MEMBER 테이블의 M_EMAIL 컬럼과 연결된다.
3) 생성자와 메소드
(1) 기본 생성자
기본 생성자는 값 없이 Member 객체를 만들 때 사용한다.
객체를 먼저 만들고 setter로 값을 넣을 수 있다.
(2) 매개변수 생성자
매개변수 생성자는 회원 정보를 한 번에 받아 객체를 만들 때 사용한다.
View에서 입력받은 값을 Member 객체로 묶거나, DB 조회 결과를 객체로 만들 때 사용할 수 있다.
(3) getter와 setter
getter는 private 필드 값을 읽는 메소드이고, setter는 private 필드 값을 변경하는 메소드이다.
필드를 직접 접근하지 않고 메소드를 통해 다루기 위해 사용한다.
(4) toString
toString은 Member 객체 정보를 문자열로 출력할 때 사용한다.
전체 조회나 선택 조회 결과를 화면에 보여줄 때 유용하다.
5 MemberView
1) MemberView의 역할
(1) 화면 담당
MemberView는 사용자에게 메뉴를 보여주고 입력을 받는 클래스이다.
콘솔에서 회원 관리 기능을 선택하는 화면 역할을 한다.
(2) Controller 호출
MemberView는 사용자의 선택에 따라 Controller의 메소드를 호출한다.
View는 DB 작업을 직접 하지 않고 요청만 전달한다.
2) menu 메소드
(1) 메뉴 반복
menu 메소드는 사용자가 6번 종료를 선택할 때까지 반복된다.
while문을 사용해 메뉴를 계속 출력한다.
(2) switch문
switch문은 사용자가 입력한 번호에 따라 기능을 분기한다.
1번은 전체출력, 2번은 선택출력, 3번은 추가, 4번은 수정, 5번은 삭제, 6번은 종료이다.
3) inputMember 메소드
(1) 회원 추가 정보 입력
inputMember는 회원 추가에 필요한 이름, 나이, 성별, 지역, 직업, 전화번호, 이메일을 입력받는다.
입력받은 값으로 Member 객체를 생성해 반환한다.
(2) m_no를 0으로 넣는 이유
회원번호는 DB에서 SEQ_MEMBER.NEXTVAL로 자동 생성된다.
Java에서 입력받아 넣는 값이 아니기 때문에 Member 객체 생성 시 임시로 0을 넣는다.
4) inputNo 메소드
(1) 회원번호 입력
inputNo는 선택 조회나 삭제에서 사용할 회원번호를 입력받는다.
M_NO가 PRIMARY KEY이기 때문에 특정 회원 한 명을 찾는 기준으로 사용된다.
5) inputUpdate 메소드
(1) 수정 정보 입력
inputUpdate는 수정할 회원번호, 지역, 직업, 전화번호를 입력받는다.
이 프로젝트의 수정 기능은 M_LOCATION, M_JOB, M_TEL 값을 변경하는 구조이다.
(2) 수정용 Member 객체
입력받은 값을 Member 객체에 담아 반환한다.
DAO에서는 이 객체의 m_no로 수정 대상을 찾고, location, job, tel 값을 변경한다.
6 MemberController
1) MemberController의 역할
(1) 기존 Controller 방식
MemberController는 View에서 받은 요청을 Service로 전달하는 기본 Controller 클래스이다.
[1] 방식은 View가 기능별로 MemberController의 메소드를 직접 호출하는 구조이다.
(2) 단순한 흐름
View에서 con.selectAll, con.selectOne, con.insert, con.update, con.delete처럼 기능 이름이 명확한 메소드를 호출한다.
처음 MVC 구조를 이해할 때 가장 직관적인 방식이다.
2) 주요 메소드
(1) selectAll
selectAll은 전체 회원 조회 요청을 Service로 전달한다.
결과로 List<Member>를 반환한다.
(2) selectOne
selectOne은 회원번호를 받아 Service의 selectOne을 호출한다.
결과로 회원 한 명의 Member 객체를 반환한다.
(3) insert
insert는 추가할 회원 정보가 담긴 Member 객체를 Service로 전달한다.
추가 성공 여부를 int 값으로 반환한다.
(4) update
update는 수정할 회원 정보가 담긴 Member 객체를 Service로 전달한다.
수정 성공 여부를 int 값으로 반환한다.
(5) delete
delete는 삭제할 회원번호를 Service로 전달한다.
삭제 성공 여부를 int 값으로 반환한다.
7 MemberService 인터페이스
1) MemberService의 역할
(1) Service 규칙 정의
MemberService는 회원 기능에 필요한 메소드 목록을 정의하는 인터페이스이다.
실제 기능 구현은 MemberServiceImpl 클래스에서 담당한다.
(2) 인터페이스를 사용하는 이유
인터페이스를 사용하면 어떤 기능을 제공해야 하는지 먼저 정할 수 있다.
구현 클래스는 인터페이스에 정의된 메소드를 반드시 구현해야 한다.
2) 주요 메소드
(1) selectAll
selectAll은 전체 회원을 조회하는 기능이다.
여러 명의 회원이 조회될 수 있으므로 List<Member>를 반환한다.
(2) selectOne
selectOne은 회원번호를 기준으로 회원 한 명을 조회하는 기능이다.
조회 결과가 있으면 Member 객체를 반환한다.
(3) insert
insert는 새로운 회원 정보를 추가하는 기능이다.
Member 객체를 받아 MEMBER 테이블에 저장한다.
(4) update
update는 기존 회원 정보를 수정하는 기능이다.
수정할 값이 담긴 Member 객체를 받아 처리한다.
(5) delete
delete는 회원번호를 기준으로 회원을 삭제하는 기능이다.
삭제 결과를 int 값으로 반환한다.
8 MemberServiceImpl
1) MemberServiceImpl의 역할
(1) Service 구현 클래스
MemberServiceImpl은 MemberService 인터페이스를 실제로 구현한 클래스이다.
Controller에서 요청받은 기능을 처리하고 DAO를 호출한다.
(2) DAO 사용
MemberServiceImpl은 MemberDao 타입의 dao 필드를 가지고 있다.
실제 객체는 MemberDaoImpl을 사용한다.
2) 조회 기능 처리
(1) selectAll
selectAll은 Connection을 생성하고 dao.selectAll을 호출한다.
조회 기능은 데이터를 변경하지 않으므로 commit이나 rollback 없이 Connection만 닫는다.
(2) selectOne
selectOne은 회원번호를 받아 dao.selectOne을 호출한다.
조회 결과로 Member 객체를 반환하고 Connection을 닫는다.
3) 변경 기능 처리
(1) insert
insert는 Connection을 생성하고 dao.insert를 호출한다.
결과가 0보다 크면 commit하고, 그렇지 않으면 rollback한다.
(2) update
update는 Connection을 생성하고 dao.update를 호출한다.
결과가 0보다 크면 commit하고, 그렇지 않으면 rollback한다.
(3) delete
delete는 Connection을 생성하고 dao.delete를 호출한다.
결과가 0보다 크면 commit하고, 그렇지 않으면 rollback한다.
4) Service 계층의 핵심
(1) 트랜잭션 관리
Service는 DAO 실행 결과에 따라 commit과 rollback을 결정한다.
DB 변경 작업의 성공과 실패를 관리하는 계층이다.
(2) Connection 관리
Service는 기능 시작 시 Connection을 만들고 기능 종료 시 Connection을 닫는다.
DAO는 전달받은 Connection으로 SQL만 실행한다.
9 MemberDao 인터페이스
1) MemberDao의 역할
(1) DAO 규칙 정의
MemberDao는 MEMBER 테이블에 접근하기 위한 메소드 규칙을 정의하는 인터페이스이다.
실제 SQL 실행은 MemberDaoImpl에서 구현한다.
(2) SQL 상수 관리
MemberDao에는 selectAll, selectOne, insert, update, delete SQL문이 문자열 상수로 정의되어 있다.
SQL문을 한 곳에 모아두면 DAO 구현부에서 재사용하기 쉽다.
2) SQL문
(1) selectAll
selectAll은 MEMBER 테이블의 모든 데이터를 조회한다.
전체 회원 목록을 출력할 때 사용한다.
(2) selectOne
selectOne은 M_NO를 기준으로 회원 한 명을 조회한다.
WHERE M_NO = ? 조건을 사용해 PreparedStatement로 번호 값을 넣는다.
(3) insert
insert는 새로운 회원 정보를 MEMBER 테이블에 추가한다.
회원번호는 SEQ_MEMBER.NEXTVAL로 자동 생성하고, 나머지 값은 ?로 받아 저장한다.
(4) update
update는 M_NO를 기준으로 회원의 지역, 직업, 전화번호를 수정한다.
WHERE M_NO = ? 조건으로 수정 대상을 찾는다.
(5) delete
delete는 M_NO를 기준으로 회원 한 명을 삭제한다.
WHERE M_NO = ? 조건으로 삭제 대상을 찾는다.
10 MemberDaoImpl
1) MemberDaoImpl의 역할
(1) DAO 구현 클래스
MemberDaoImpl은 MemberDao 인터페이스에 정의된 메소드를 실제로 구현하는 클래스이다.
PreparedStatement와 ResultSet을 사용해 MEMBER 테이블에 직접 접근한다.
(2) SQL 실행 담당
DAO는 SQL문을 준비하고, ? 자리에 값을 넣고, SQL을 실행한다.
DB 조회 결과를 Member 객체로 변환하는 작업도 담당한다.
2) selectAll
(1) 전체 조회 실행
selectAll은 selectAll SQL을 PreparedStatement로 준비하고 executeQuery로 실행한다.
MEMBER 테이블의 모든 행을 조회한다.
(2) ResultSet 반복
while(rs.next())를 사용해 조회된 회원 데이터를 한 행씩 읽는다.
각 행의 컬럼 값을 꺼내 Member 객체에 저장한다.
(3) List 반환
조회된 Member 객체들을 List에 담아 반환한다.
전체 조회는 여러 명의 회원이 나올 수 있기 때문에 List<Member>를 사용한다.
3) selectOne
(1) 선택 조회 실행
selectOne은 회원번호를 조건으로 회원 한 명을 조회한다.
PreparedStatement의 첫 번째 ? 자리에 입력받은 회원번호를 넣는다.
(2) 단일 객체 반환
조회 결과가 있으면 Member 객체를 생성해 값을 담는다.
결과가 없으면 null을 반환할 수 있다.
4) insert
(1) 회원 추가 실행
insert는 Member 객체에 담긴 회원 정보를 MEMBER 테이블에 추가한다.
이름, 나이, 성별, 지역, 직업, 전화번호, 이메일을 PreparedStatement에 바인딩한다.
(2) 시퀀스 활용
M_NO는 SQL문 안에서 SEQ_MEMBER.NEXTVAL로 자동 생성된다.
Java 코드에서는 회원번호를 직접 넣지 않는다.
(3) executeUpdate
INSERT문은 executeUpdate로 실행한다.
실행 결과로 추가된 행의 개수를 int로 반환한다.
5) update
(1) 회원 수정 실행
update는 Member 객체에 담긴 지역, 직업, 전화번호를 수정한다.
M_NO를 기준으로 수정할 회원을 찾는다.
(2) 바인딩 순서
PreparedStatement는 SQL문의 ? 순서대로 값을 넣어야 한다.
첫 번째 ?에는 지역, 두 번째 ?에는 직업, 세 번째 ?에는 전화번호, 마지막 ?에는 회원번호가 들어간다.
(3) executeUpdate
UPDATE문도 executeUpdate로 실행한다.
결과가 0보다 크면 수정된 행이 있다는 의미이다.
6) delete
(1) 회원 삭제 실행
delete는 회원번호를 기준으로 MEMBER 테이블에서 회원을 삭제한다.
PreparedStatement의 첫 번째 ?에 삭제할 회원번호를 넣는다.
(2) 삭제 결과
executeUpdate 결과가 0보다 크면 삭제 성공이다.
0이면 해당 회원번호를 가진 데이터가 없거나 삭제되지 않은 것이다.
7) 자원 해제
(1) ResultSet 닫기
SELECT 작업에서 사용한 ResultSet은 finally에서 닫는다.
조회 결과 객체도 DB 자원을 사용하기 때문에 반드시 정리해야 한다.
(2) PreparedStatement 닫기
PreparedStatement도 finally에서 닫는다.
Connection은 Service에서 관리하므로 DAO에서는 닫지 않는다.
11 전체 조회 기능
1) 전체 조회 흐름
(1) View
사용자가 메뉴에서 1번 전체출력을 선택한다.
View는 Controller의 selectAll 메소드를 호출한다.
(2) Controller
Controller는 Service의 selectAll 메소드를 호출한다.
View의 요청을 Service로 전달한다.
(3) Service
Service는 Connection을 생성하고 DAO의 selectAll을 호출한다.
DAO에서 받은 List<Member>를 Controller로 반환한다.
(4) DAO
DAO는 SELECT * FROM MEMBER SQL문을 실행한다.
조회된 모든 회원을 Member 객체로 만들어 List에 담는다.
2) 출력 처리
(1) 데이터가 있는 경우
List의 size가 0이 아니면 회원 데이터가 있다는 뜻이다.
for문으로 Member 객체를 하나씩 출력한다.
(2) 데이터가 없는 경우
List의 size가 0이면 등록된 회원이 없는 상태이다.
View에서 등록된 회원이 없다는 메시지를 출력한다.
12 선택 조회 기능
1) 선택 조회 흐름
(1) View
사용자가 메뉴에서 2번 선택출력을 선택한다.
View는 inputNo로 회원번호를 입력받아 Controller의 selectOne에 전달한다.
(2) Controller
Controller는 회원번호를 Service의 selectOne에 전달한다.
특정 회원 조회 요청을 넘기는 역할을 한다.
(3) Service
Service는 Connection을 생성하고 DAO의 selectOne을 호출한다.
조회된 Member 객체를 반환하고 Connection을 닫는다.
(4) DAO
DAO는 SELECT * FROM MEMBER WHERE M_NO = ? SQL을 실행한다.
입력받은 회원번호를 기준으로 회원 한 명을 찾는다.
2) 결과 처리
(1) 조회 성공
조회 결과가 있으면 Member 객체가 반환된다.
View는 해당 객체를 출력한다.
(2) 조회 실패
조회 결과가 없으면 null이 반환된다.
View는 일치하는 데이터가 없다는 메시지를 출력한다.
13 추가 기능
1) 추가 흐름
(1) View
사용자가 메뉴에서 3번 추가를 선택한다.
View는 inputMember로 이름, 나이, 성별, 지역, 직업, 전화번호, 이메일을 입력받는다.
(2) Controller
Controller는 입력받은 Member 객체를 Service의 insert로 전달한다.
회원 추가 요청을 넘긴다.
(3) Service
Service는 Connection을 생성하고 DAO의 insert를 호출한다.
결과가 0보다 크면 commit하고, 그렇지 않으면 rollback한다.
(4) DAO
DAO는 INSERT INTO MEMBER VALUES(SEQ_MEMBER.NEXTVAL, ?, ?, ?, ?, ?, ?, ?) SQL을 실행한다.
Member 객체의 값을 ? 자리에 순서대로 넣는다.
2) 추가 결과 처리
(1) 추가 성공
executeUpdate 결과가 0보다 크면 INSERT가 성공한 것이다.
Service에서 commit을 실행하고 View는 Insert 성공 메시지를 출력한다.
(2) 추가 실패
결과가 0이면 추가된 행이 없는 것이다.
Service에서 rollback을 실행하고 View는 Insert 실패 메시지를 출력한다.
14 수정 기능
1) 수정 흐름
(1) View
사용자가 메뉴에서 4번 수정을 선택한다.
View는 inputUpdate로 수정할 회원번호, 지역, 직업, 전화번호를 입력받는다.
(2) Controller
Controller는 수정 정보가 담긴 Member 객체를 Service의 update로 전달한다.
회원 수정 요청을 넘긴다.
(3) Service
Service는 Connection을 생성하고 DAO의 update를 호출한다.
결과가 0보다 크면 commit하고, 그렇지 않으면 rollback한다.
(4) DAO
DAO는 UPDATE MEMBER SET M_LOCATION = ?, M_JOB = ?, M_TEL = ? WHERE M_NO = ? SQL을 실행한다.
회원번호를 기준으로 지역, 직업, 전화번호를 변경한다.
2) 수정 결과 처리
(1) 수정 성공
executeUpdate 결과가 0보다 크면 수정된 행이 있다는 뜻이다.
View는 Update 성공 메시지를 출력한다.
(2) 수정 실패
결과가 0이면 해당 회원번호의 데이터가 없거나 수정되지 않은 것이다.
View는 Update 실패 메시지를 출력한다.
15 삭제 기능
1) 삭제 흐름
(1) View
사용자가 메뉴에서 5번 삭제를 선택한다.
View는 inputNo로 삭제할 회원번호를 입력받는다.
(2) Controller
Controller는 회원번호를 Service의 delete로 전달한다.
회원 삭제 요청을 넘긴다.
(3) Service
Service는 Connection을 생성하고 DAO의 delete를 호출한다.
결과가 0보다 크면 commit하고, 그렇지 않으면 rollback한다.
(4) DAO
DAO는 DELETE FROM MEMBER WHERE M_NO = ? SQL을 실행한다.
회원번호를 기준으로 해당 회원을 삭제한다.
2) 삭제 결과 처리
(1) 삭제 성공
executeUpdate 결과가 0보다 크면 삭제된 행이 있다는 뜻이다.
View는 Delete 성공 메시지를 출력한다.
(2) 삭제 실패
결과가 0이면 해당 회원번호의 데이터가 없거나 삭제되지 않은 것이다.
View는 Delete 실패 메시지를 출력한다.
16 기존 Controller 방식
1) 기존 방식의 구조
(1) [1] 방식
[1] 방식은 View가 MemberController의 기능별 메소드를 직접 호출하는 구조이다.
예를 들어 전체 조회는 con.selectAll, 선택 조회는 con.selectOne, 추가는 con.insert를 호출한다.
(2) 기능 이름이 명확함
각 기능이 메소드 이름으로 분리되어 있어 어떤 기능을 실행하는지 한눈에 보인다.
처음 MVC 구조를 배울 때 이해하기 쉬운 방식이다.
2) 기존 방식의 흐름
(1) 전체 조회
View에서 con.selectAll을 호출하면 Controller, Service, DAO 순서로 요청이 전달된다.
(2) 선택 조회
View에서 inputNo로 번호를 입력받고 con.selectOne에 전달한다.
이후 Service와 DAO를 거쳐 해당 회원을 조회한다.
(3) 추가
View에서 inputMember로 회원 정보를 입력받고 con.insert에 전달한다.
Service에서 commit 또는 rollback을 처리한다.
(4) 수정
View에서 inputUpdate로 수정 정보를 입력받고 con.update에 전달한다.
DAO는 회원번호를 기준으로 지역, 직업, 전화번호를 수정한다.
(5) 삭제
View에서 inputNo로 회원번호를 입력받고 con.delete에 전달한다.
DAO는 회원번호를 기준으로 데이터를 삭제한다.
3) 기존 방식의 장점
(1) 직관적임
기능별 메소드가 따로 있기 때문에 코드 흐름을 따라가기 쉽다.
View에서 어떤 기능을 호출하는지 바로 알 수 있다.
(2) 타입이 명확함
selectAll은 List<Member>, selectOne은 Member, insert와 update와 delete는 int를 반환한다.
반환 타입이 메소드별로 정해져 있어서 형변환이 필요 없다.
(3) 초보자에게 적합함
기능별 메소드가 명확하게 나뉘어 있어 MVC 흐름을 처음 공부할 때 이해하기 좋다.
View, Controller, Service, DAO의 역할을 익히는 데 적합하다.
17 새로운 통합 Controller 방식
1) 새로운 방식의 개념
(1) [3] 방식
[3] 방식은 Controller 클래스의 doMethod 하나로 여러 요청을 처리하는 구조이다.
View는 요청 이름을 문자열로 넘기고, Controller는 문자열 값에 따라 실행할 기능을 선택한다.
(2) req 문자열
req는 어떤 기능을 실행할지 나타내는 요청 이름이다.
selectAll, selectOne, insert, update, delete 같은 문자열을 사용한다.
2) 가변인자
(1) Object ... obj
Object ... obj는 전달되는 인자의 개수를 동적으로 받을 수 있는 가변인자이다.
요청 이름만 받을 수도 있고, 요청 이름과 회원번호 또는 Member 객체를 함께 받을 수도 있다.
(2) 사용하는 이유
selectAll은 추가 데이터가 필요 없고, selectOne은 회원번호가 필요하며, insert와 update는 Member 객체가 필요하다.
기능마다 필요한 인자 개수가 다르기 때문에 가변인자를 사용한다.
3) doMethod 흐름
(1) 요청 이름 확인
doMethod는 obj[0]을 문자열로 꺼내 req에 저장한다.
req 값이 어떤 문자열인지에 따라 if문으로 기능을 나눈다.
(2) selectAll
req가 selectAll이면 Service의 selectAll을 호출한다.
결과로 List<Member>를 Object 타입으로 반환한다.
(3) selectOne
req가 selectOne이면 obj[1]에서 회원번호를 꺼내 Service의 selectOne을 호출한다.
결과로 Member 객체를 반환한다.
(4) insert
req가 insert이면 obj[1]에서 Member 객체를 꺼내 Service의 insert를 호출한다.
결과로 int 값을 반환한다.
(5) update
req가 update이면 obj[1]에서 Member 객체를 꺼내 Service의 update를 호출한다.
결과로 int 값을 반환한다.
(6) delete
req가 delete이면 obj[1]에서 회원번호를 꺼내 Service의 delete를 호출한다.
결과로 int 값을 반환한다.
4) 새로운 방식의 특징
(1) 하나의 메소드로 요청 처리
여러 Controller 메소드를 따로 만들지 않고 doMethod 하나에서 요청을 분기한다.
요청 이름을 기준으로 여러 기능을 처리하는 구조이다.
(2) Object 반환
doMethod는 기능마다 반환 타입이 다르기 때문에 Object로 반환한다.
View에서는 반환값을 실제 타입에 맞게 형변환해서 사용한다.
(3) 형변환 필요
selectAll 결과는 List<Member>로 형변환하고, selectOne 결과는 Member로 형변환한다.
insert, update, delete 결과는 int로 형변환해서 사용한다.
5) 기존 방식과 비교
(1) 기존 방식
기존 방식은 기능마다 메소드가 따로 있어 코드가 직관적이다.
메소드 이름과 반환 타입이 명확해서 초보자가 이해하기 쉽다.
(2) 새로운 방식
새로운 방식은 doMethod 하나로 여러 요청을 처리한다.
구조를 일반화할 수 있지만 문자열 요청과 Object 형변환이 필요해서 처음에는 조금 어렵게 느껴질 수 있다.
(3) 학습 순서
오늘 정리에서는 기존 [1] 방식을 중심으로 MVC 흐름을 이해하는 것이 핵심이다.
[3] 방식은 나중에 요청을 하나의 통합 메소드로 처리하는 방식으로 이해하면 된다.
'멀티캠퍼스' 카테고리의 다른 글
| [2026.05.22] - TIL 36일차 정렬 알고리즘, 색인, 이진 검색 트리, 그래프 정리 (0) | 2026.05.23 |
|---|---|
| [2026.05.21] - TIL 35일차 자료구조와 알고리즘, 재귀, 리스트, 스택, 큐 정리 (0) | 2026.05.22 |
| [2026.05.19] - TIL 33일차 JDBC MVC Product CRUD 프로젝트 정리 (0) | 2026.05.19 |
| [2026.05.18] - TIL 32일차 JDBC Template, PreparedStatement, MVC 구조 정리 (0) | 2026.05.18 |
| [2026.05.15] - TIL 31일차 JDBC 개념과 자바 DB 연결 정리 (0) | 2026.05.18 |