(책) 자바 웹을 다루는 기술

Chap 24 스프링과 마이바티스 연동하기

EunaSon 2023. 9. 19. 17:25

24.1 스프링-마이바티스 연동 관련 XML 파일 설정하기 890p

24.2 마이바티스 관련 XML 파일 설정하기 894p                    

24.3 자바 클래스와 JSP 파일 구현하기 896p                        


24.1 스프링-마이바티스 연동 관련 XML 파일 설정하기

890p

23장에서는 웹 프로젝트에서 마이바티스 라이브러리를 추가하여 독립적으로 사용할 수 있었음

이번 장에서는 스프링과 마이바티스를 연동해 회원 관리 기능을 구현해보자

 

1. 새 프로젝트 pro24 생성 후 책에서 제공하는 스프링 라이브러리를 lib 폴더에 복붙하자 (실습에서 사용되는 스프링 버전-3.0.1 호환되는 마이바티스 라이브러리 - myBatis-3.0.5.jar)

2. /WEB-INF/config - action-mybatis.xml, action-service.xml, jdbc.properties 준비

3. /WEB-INF - action-servlet.xml, web.xml 준비

 

[ web.xml] pro24/WebContent/WEB-INF/web.xml

애플리케이션 실행 시 여러 설정파일들을 /WEB-INF/config 폴더에서 읽어오도록 설정함 - ContextLoaderListener 이용

여러 설정 파일 - action-mybatis.xml (마이바티스 설정파일) , action-service.xml

 

[ action-servlet.xml ] pro24/WebContent/WEB-INF/action-servlet.xml

뷰 관련 빈과 각 URL 요청명에 대해 호출할 메서드들을 설정함 

- viewResolver 빈 - viewClass, prefix, suffix 속성 설정

- memberController - methodNameResolver 속성에 memberMethodNameResolver 빈 주입, memberService 빈 주입

- memberMethodNameResolver - mappings 속성에 각 URL 요청명과 처리할 메서드 설정

- memberUrlMapping 빈 - mappings 속성에 "/member/*.do" 요청에 대해 memberController 빈이 처리하도록 설정

 

=> memberMethodNameResolver 빈 -(주입)-> memberController 빈 -(주입)-> memberUrlMapping 빈

 

[ action-mybatis.xml ] pro24/WebContent/WEB-INF/config/action-mybatis.xml

23장의 sqlMapConfig.xml 파일을 대체하는 파일임,

- propertyPlaceholderConfigurer 빈 : jdbc.properties 파일(db 설정 관련 정보들이 작성되어 있음)을 읽어옴

- dataSource 빈 : 마이바티스의 PooledDataSource 클래스를 이용함, driver, url,username, password 등 db 연결에 필요한 속성에 값을 설정함

- sqlSessionFactory 빈 : SqlSessionFactoryBean 클래스를 이용함,

  dataSource 속성에 dataSource빈을 주입,

  configLocation 속성에 "classpath:mybatis /model/modelConfig.xml" , 

  mapperLocation 속성에 "classpath:mybatis/mappers/*.xml" 을 설정함

- memberDAO 빈 - sqlSession 속성에 sqlSession 빈을 주입함

 

[ action-service.xml ] pro24/WebContent/WEB-INF/config/action-service.xml

- memberService 빈 : memberDAO 속성에 memberDAO 빈을 주입함

 

24.2 마이바티스 관련 XML 파일 설정하기

894p

1. src 패키지 아래에 mybatis.mappers 패키지를 생성 - member.xml (23장 파일 복붙)

2. src/mybatis 패키지 아래에 model 패키지를 생성 - modelConfig.xml 파일 생성 ... memberVO빈 설정에 사용됨

 

[ member.xml ] pro24/src/mybatis/mappers/member.xml

mapper namespace = "mapper.member"

<resultMap> - memberVO 타입, id는 memResult

<select> id="selectAllMemberList", 전체회원정보 조회

<insert> id="insertMember" , 회원 추가

<update> id="updateMember" ,  회원 정보 수정

<delete> id="deleteMember" , 회원 삭제

...

 

[ modelConfig.xml ] pro24/src/mybatis/model/modelConfig.xml

<typeAlias> - type="com.spring.member.vo.MemberVO" 을 alias="memberVO" 로 설정,

memberVO는 마이바티스에서 데이터 전달에 사용됨

 

24.3 자바 클래스와 JSP 파일 구현하기

896p

src 패키지 아래 com.spring.member 패키지 생성,

- controller 패키지 - MemberController, MemberControllerImpl

- dao 패키지 - MemberDAO, MemberDAOImpl

- service 패키지 - MemberService, MemberServiceImpl

- vo 패키지 - MemberVO

WebContent/WEB-INF/views/member 폴더 생성 - liistMembers.jsp, memberForm.jsp, modMember.jsp

 

[ MemberControllerImpl ] pro24/src/com/spring/member/controller/MemberControllerImpl.java

- MemberService 속성 선언

- setMemberService() - memberService 빈 주입 위한 setter

- listMembers() - 전체 회원 목록 조회,

  \memberService.listMembers() 호출해서 결과 memberList 에 저장,

  ModelAndView 객체 생성 (viewName( getViewName() 메서드로 구함 ) 인자로 줌),

  ModelAndView 에 memberList 바인딩(addObject())

- addMember() - 요청인코딩 설정, MemberVO 객체 생성,

  getParameter()&setter 로 값 설정 대신 bind(request, memberVO) 메서드 사용해 memberVO의 해당 속성에 자동으로 설정함,

  memberService.addMember(memberVO) 호출,

  ModelAndView 객체 생성 시 인자로 'redirect:/member/listMembers.do' 를 설정함 (ModelAndView클래스의 redirect 속성을 이용해 /member/listMembers.do 로 리다이렉트함)

  mav 객체를 return

 

* bind() 메서드 : MultiActionController 클래스에서 제공함,

protected void bind(HttpServletRequest request, Object command)

request로부터 자동으로 값을 얻어와 command의 속성에 값을 설정함,

이때 request의 parameter의 name과 command의 속성명이 같을 때 값이 자동설정되며

command는 자바빈이어야 함, null인 객체는 command에 들어갈 수 없음

 

- removeMember() - 회원 삭제

  request 인코딩 설정

  request.getParameter("id")로 삭제할 회원 id를 가져옴

  memberService.removeMember(id) 호출

  ModelAndView 객체 생성 시 인자로 'redirect:/member/listMembers.do' 를 설정하여 회원 삭제 후 목록창으로 리다이렉트함

  - form() - db 연동 작업이 없는 입력창 요청 시 viewName만 mav로 반환함

  - getViewName() - uri를 가져와 앞(경로), 뒤(확장명) 다 잘라내고 파일명만 가져와 반환함

 

[ MemberServiceImpl ] /pro24/src/com/spring/member/service/MembreServiceImpl.java

- MemberDAO 속성 선언

- setMemberDAO() - memberDAO 빈을 주입하기 위한 setter

- listMembers() - memberDAO.selectAllMemberList() 호출하여 반환결과를 membersList에 저장, 컨트롤러로 return

- addMember() - memberDAO.insertMember(memberVO) 를 컨트롤러로 return

- removeMember() - memberDAO.deleteMember(id) 를 컨트롤러로 return

 

[ MemberDAOImpl ] /pro24/src/com/spring/member/dao/MemberDAOImpl.java

- SqlSession 속성 선언

- setSqlSession() - sqlSession 빈 주입을 위한 setter

- selectAllMemberList() - sqlSession.selectList("mapper.member.selectAllMemberList") 호출, 주입된 sqlSession 빈으로 selectList() 메서드를 호출하면서 쿼리id를 인자로 전달함, 쿼리 수행 결과 List에 담아 반환

- insertMember() - sqlSession.insert("mapper.member.insertMember", memberVO) 호출

- deleteMember() - sqlSession.delete("mapper.member.deleteMember", id) 호출

 

[ listMembers.jsp ] /pro24/WebContent/WEB-INF/view/member/listMembers.jsp

컨트롤러에서 바인딩된 membersList를 <c:forEach> 문을 통해 table 태그안에 출력함, id, pwd, name, email, joinDate 에 추가로 a 태그를 이용한 '삭제하기' 링크를 출력하는데, 링크를 통해 ${contextPath}/member/removeMember.do?id=${member.id} 로 요청함

내용 모두 출력 후 테이블 하단에 '회원가입' a 태그 링크를 작성, ${contextPath}/member/memberForm.do 로 요청됨

 

[ memberForm.jsp ] /pro24/WebContent/WEB-INF/view/member/memberForm.jsp

회원 가입창, form태그 안에 table 태그, 그 안에 input 태그를 만들어 회원정보를 입력받음,

form 태그의 action 속성값으로 ${contextPath}/member/addMember.do 를 설정함