** 스프링 DB 연결 예제 - <Mybatis1>
*servlet-context.xml : main-java-mybatis1 을 최상위 디렉토리로 지정해 스캔
<context:component-scan base-package="myBatis1" />
---> 기존 com.home... 사용하지 않고 최상위 디렉토리 내부에 controller, dao, model, service 디렉토리를 만드는 방식을 이용함
* /resources/환경설정 파일들
1. jdbc.properties : DB 연결을 위한 driveClassName, url, username, password 정의
2. Dept.xml : dao에서 매개변수로 넘어오는 값을 받아 sql문에 적용시키는 mapper.xml파일
3. configuration.xml : xml에 사용할 별칭(Alias), DB 연결 환경설정(environment), mapper(sql문 저장된 xml파일)
* 흐름
View
index.jsp : location.href="deptList.do";
↓
Controller Class (@Controller -> @Autowired private DeptService ds;)
DeptController.java : List<Dept> list=ds.list();
↓
Service Class (@Service -> @Autowired private DeptDao dd;)
DeptServiceImpl.java : public List<Dept> list() { return dd.list(); }
↓
DAO Class (@Repository -> 원래라면 여기도 @Autowired private SqlSession session; 사용함)
DeptDaoImpl.java : public List<Dept> list() { return session.selectList
("deptns.list"); }
↓
Mapper
Dept.xml
<select id="list" resultMap="deptResult"> //resultMap: 검색되는 컬럼명과 dto의 프로퍼티명이 서로 다를 때 값을 등치(연결)시키기 위해 mapper.xml에 맵핑해줌 (그니까 귀찮은 짓 하지 않으려면 같은 이름으로 꼭 설정하자!)
select * from dept order by deptno
</select>
↓
DAO -> return session.selectList("deptns.list");
↓
Service -> return dd.list();
↓
Controller : model.addAttribute("list", list); -> return "deptList";
↓
View
deptList.jsp : 받은 list을 출력
deptView.jsp : ajax 기능으로 아래 테이블 출력
$(function() {
$('#list').load("deptList.do table"); //페이지 load 시, 괄호 파일의 table 영역을 가져오는 명령
});
---> head 영역에 설정해놨기 때문에 상세페이지 들어올 때마다 계속 출력시킴!
이거 댓글 기능에 써먹을 수 있겠다
** 스프링 DB 연결 예제 (@Autowired SqlSession 사용) - <Mybatis2>
체크해야 하는 부분
*web.xml : 프로젝트 실행할 때 가장 먼저 실행되는 파일로 servlet-context.xml, root-context.xml 파일을 등록해 읽어오게 함 ---> 두 환경설정파일(xml)의 경로를 변경하면 그 변경한 경로로 param-value값을 바꿔줘야 함 (resources 폴더로 옮긴다거나 할 때)
+) post 방식으로 값이 넘어갈 때 한글값을 자동으로 인코딩시켜주는 필터를 추가
+) servlet-mapping : model2에서 appServlet 사용했던 걸 url-pattern으로 등록해 사용할 수 있게 함
* servlet-context.xml : ViewResolver 설정 --> prefix, suffix
+)<context:component-scan base-package="myBatis2" /> : 최상위 디렉토리 기준으로 모두 스캔 --> Bean 객체 개별로 생성하지 않아도 어노테이션 사용 가능
* root-context.xml ★ (이 부분이 많이 다르므로 체크!)
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
---> property에 db 연결할 정보 입력
※ jdbc.properties의 변수를 가져와 사용할 거라면
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}" />
이런 식으로 사용하면 됨 (mybatis 환경설정 파일에서 사용했던 방식 그대로)
+) 주의!!! class에 어떤 경로의 클래스를 사용하느냐에 따라 property name이 달라지므로 확인 후 사용!
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:configuration.xml" />
<property name="mapperLocations" value="classpath:sql/*.xml" />
</bean>
---> 스프링과 db 연결 : 원래 mybatis 환경설정파일에 들어가는 db연결정보, mapper 정보가 Spring의 root-context.xml에 담기게 되므로, configuration.xml에는 Alias만 생성하면 됨!
(configLocation: mybatis 환경설정파일(configuration.xml)을 setter DI 형태로 주입
mapperLocations: mapper 파일을 주입 )
<bean id="session" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
---> SqlSession의 구현클래스 SqlSessionTemplate에 db연결 정보가 등록된 sqlSessionFactory의 객체를 Construct DI 형태로 주입! //유일하게 사용하는 생성자 DI
* configuration.xml (mybatis 환경파일) : root-context.xml에 db 연결 설정 해놨으므로 별칭만 추가
<typeAliases>
<typeAlias alias="dept" type="myBatis2.model.Dept" />
<typeAlias alias="emp" type="myBatis2.model.Emp" />
</typeAliases>
* EmpController.java : return "emp/empList";
---> /WEB-INF/view/emp/empList.jsp의 경우 prefix, suffix를 뗀 나머지 디렉토리/파일명을 표기!
+) service class의 객체를 주입할 때 각 클래스마다 Autowired로 잡아줘야 함
@Autowired
private EmpService es;
@Autowired
private DeptService ds; //이렇게.. 어노테이션은 바로 아래 위치한 하나에만 적용되기 때문에!
* EmpDaoImpl.java
@Repository
public class EmpDaoImpl implements EmpDao {
@Autowired
private SqlSessionTemplate sst; //SqlSession의 구현클래스. 인터페이스, 구현클래스 중 뭐든 가능
...
--->★ root-context.xml에 db 연결에 관련된 SqlSessionTemplate Bean 객체를 생성해놓았기 때문에, Autowired로 mapper.xml 파일로 연결할 수 있는 SqlSession 객체를 받을 수 있게 되었다!
*Emp.xml : sql문
resultMap : 넘겨받은 매개변수와 db 컬럼의 값이 일치하지 않을 때 경로를 맵핑하기 위해 사용하는 것으로, 다수의 dto 결과값을 list로 넘겨줘야 할 때 그냥 resultType="dto" 로 설정해도, dao에서 selectList로 호출했다면 알아서 dto로 저장해 list로 넘겨줌.... db와 dto 컬럼명을 일치시켜서 이걸 쓸 일이 없도록 하자!
* empno 중복 검사 dupCheck
empInsertForm.jsp 에서 중복 검사 버튼 클릭했을 때 jquery의 $.post 방식으로 값을 이동
$.post('dupCheck.do', 'empno=' + empno, function(msg) {
alert(msg); //$.post("요청이름","전달될 값","콜백함수");
});
↓
EmpController.java : 전달받은 empno를 매개변수로 service-dao-mapper에서 select(empno) 값을 넘겨받아 if문으로 비교
if (emp != null) msg = "이미 있는 데이터입니다";
else msg = "사용 가능한 사번 입니다";
+ model 객체로 String msg를 공유한 뒤 emp/dupCheck로 리턴
↓
dupCheck.java : 표현언어로 넘겨받은 값 msg를 출력 ---> ${msg} //ㄹㅇ 이것만 넣어놓음
웹 브라우저 창dupCheck.jsp에 출력된 이 값${msg}이 콜백함수 function의 매개변수로 리턴됨★
↓
다시 empInsertForm.jsp로 돌아와서 function의 매개변수로 받은 msg를 메시지 팝업으로 출력
$.post('dupCheck.do', 'empno=' + empno, function(msg) {
alert(msg); //$.post("요청이름","전달될 값","콜백함수");
});
'수업 > 정리' 카테고리의 다른 글
220429 Spring-7 MVC구현2 목록, 상세, 수정, 삭제 (0) | 2022.04.29 |
---|---|
220428 Spring-6 MVC 구현1 환경설정, 작성 (0) | 2022.04.28 |
220426 Spring-4 어노테이션, 인터셉터, 파일 업로드 (0) | 2022.04.26 |
220425 Spring-3 어노테이션 DI (0) | 2022.04.25 |
220422 Spring-2 DI, IoC (0) | 2022.04.23 |