1. IEmpDAO 인터페이스 작성
- insert sql 구문을 처리해 줄 메서드 한 개 (select의 경우에만 sql 실행 결과에 맞는 자료형으로 리턴타입을 적어줌)
- <form> 태그에서 selectBox에 값을 셋팅해줄 List<Map> 메서드 세 개
이 경우, <form> 태그에 수동으로 적어줘도 상관없지만 값이 상당히 많기에 차라리 값을 가져와서 변수에 저장하고 변수의 값들을
<c:forEach> 구문으로 불러오는 방법을 사용 -> 더 정확하고 빠른 코딩 가능
* Map 인터페이스란?
- 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합
- 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용
- key를 사용하여 value값을 얻어냄
- ex) 우편번호, 지역번호(전화번호)
- 구현 클래스: HashMap, TreeMap...
2. EmpDAO 클래스 작성
1) insertEmp 메서드 오버로딩
- <form>에서 DATE 값을 입력받을 경우 -> 입력 받은 값을 가져올 때(get), SYSDATE로 대체하고, 따로 값을 가져오지 않아도 됨)
- insert 구문 -> insert into 테이블명 values(?,?,?,......?);
- jdbcTemplate.update(String sql, 인자로 받은 EmployeeVO 클래스의 getter 메서드 사용하여 값 가져오기)
- void이므로 return 값 필요없음
2) 모든 부서, 매니저, 직업 정보를 가져오는 메서드 오버로딩
- <select> 태그에 값을 넣어주기 위한 메서드 (브라우저에 보여지는 값과 실제 DB 저장 데이터가 다르기 때문에 발생하는 과정)
- List는 멀티로우를 다루는 인터페이스
- Map 형태로 리턴할 때는 queryForList 메서드 사용
cf) 멀티로우 - query() / 싱글로우 - queryForObject() / 반환없음 - update() / Map - queryForList()
* SELECT 구문 보충 설명
1) as의 역할
- 컬럼명이 너무 길거나, 실제 db 컬럼명과 VO 클래스의 변수명이 서로 다를 때 사용
department_id as departmentId // db 실제 컬럼명 as 별칭 혹은 VO 클래스 변수명
2) join이란?
- 두 개의 다른 테이블을 합칠 때 사용 (가령, 견주와 애완견 테이블을 한꺼번에 보고 싶을 때)
- Primary key혹은 Foreign key로 두 테이블을 연결
- 테이블을 연결하려면 적어도 하나의 컬럼은 공유되어야함
SELECT d.manager_id AS managerId, e.first_name AS firstName // 각각 테이블에서 두 가지 컬럼을 가져올래
FROM departments d JOIN employees e // 약칭을 지어줌 (순서대로 첫 번째 컬럼, 두 번째 컬럼)
ON d.manager_id = e.employee_id // 조건을 걸어줌
ORDER BY d.manager_id; // 오름차순으로 정렬 (오름차는 생략 가능, 내림차순은 맨 뒤에 DESC 추가)
join 구문에 대한 부연 설명
departments 테이블에는 manager_id가 정리 되어있고(11개) 매니저 이름은 없는거야.
그래서 employees 테이블에서 d 테이블과 일치하는 manager_id를 가진 사람의 이름을 가져오고 싶은거지.
왜냐 e 테이블에는 first_name이 존재하니까!
여기에서 챙겨야할 포인트는 d 테이블의 manager_id와 e 테이블의 employee_id는 동일한 값을 가진다는거야.
e 테이블의 매니저 고유 번호가 d 테이블에서 매니저 번호로 들어가 있는거지.
employees 테이블에 manager_id 컬럼이 있어서 헷갈릴 수 있는데 그건 아예 무시, 그냥 무시
쉽게 생각하면 그냥 e 테이블에 있는 manager_id는 아예 무시하고!
d.manager_id = e.employee_id 이게 같다는 것! 그대로 받아들여
3. IEmpService 인터페이스 / EmpService 클래스 작성
4. Controller 작성
- 폼 실행 후, 출력을 다른 페이지로 이동시킬 때, 하기와 같이 표현하는 것을 잊지말기!
1) 정보를 가져오는 model.addAttribute() 구문 실행
2) redirect 명령어 적어주기 -> url(=value)을 다시 실행하는 것
즉, value="hr/list"라는 url 이동을 담당하는 메서드로 향하여 실행하는 것
5. insertform.jsp 작성
1) <form action = "insert"> 경로 확인하기: jsp 파일도 hr이라는 경로 안에 있기 때문에 hr/insert에서 hr은 제외하고 insert만 넣어주기
2) <form name> 속성은 늘 VO 클래스 안의 변수명으로 통일
3) 입력이 꼭 필요한 항목은 requied 속성 추가
4) DATE 입력 폼을 자동으로 셋팅해주는 date 속성
5) <select name=""> name 속성에는 실제 db에 넘어갈 값을 적음 -> VO 클래스의 변수명
6) <c:forEach items=""> items 속성에는 Controller 클래스에서 model.addAttribute로 최종 보내는 값들이 저장된 변수명을 넣음
여기서, items에 들어가는 값들의 실질적인 형태는 (key,value) 여러 쌍일 것이다
7) <option value=""> value 속성에는 (key,value) 중에서 실질적으로 db에 저장되는 값이 담김
8) <option> 여기 </option> 태그 사이에는 브라우저에 보여지는 형태의 값이 담김
6. 브라우저 출력 확인
- 폼에 조건을 걸어준 부분이 정상적으로 출력되는 것 확인
- hr/insertform.jsp에서 저장을 누르면, 주소는 그대로 유지되나 브라우저가 list.jsp로 변경된 것을 확인 -> 과정은 Controller 확인
* DB의 정보를 변경하려고 할 때 (UPDATE 메서드를 사용하는 경우)
ORA-01031 에러 발생하는 이유 -> HR 계정은 일과 시간이 지나면 변경하지 못하게 잠겨있음
하기 명령어를 실행하여 트리거를 풀어줘야함
ALTER TABLE employees DISABLE ALL TRIGGERS;
반대로 다시 잠그고 싶을 경우 하기 명령어 실행
ALTER TABLE employees ENABLE ALL TRIGGERS;
'SPRING' 카테고리의 다른 글
JDBC 실습 - UPDATE (0) | 2020.09.02 |
---|---|
JDBC 실습 - DELETE (0) | 2020.09.01 |
JDBC 실습 - SELECT [조건(WHERE)이 있는 출력2] (0) | 2020.08.31 |
JDBC 실습 - SELECT [직원 전체 목록 출력] (0) | 2020.08.30 |
JDBC 실습 - SELECT [조건(WHERE)이 있는 출력1] (0) | 2020.08.30 |