** 스프링 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("요청이름","전달될 값","콜백함수");
});

+ Recent posts