[spring] MyBatis framework

sang·2024년 4월 14일

MyBatis

마이바티스

Persistence 솔루션으로 SQL 실행 결과 관리 (SQL -> XML)
SQL문과 프로그래밍 코드 분리 구현
DataSource 기능, 트랜잭션 처리 기능 제공

SqlMapConfig.xml: 사용할 SqlMap.xml 파일들 등록
SqlMap.xml: SQL문 저장


xml 파일들

pro23/src/mybatis/SqlMapConfig.xml

SQL문 파일 연결

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
  <typeAliases>
    <typeAlias type="com.spring.ex01.MemberVO" alias="memberVO"/> <!-- MemberDAO - MemberVO - SQL -->
  </typeAliases>
  
  <environments default="development">
  <environment id="development">
    <transactionManager type="JDBC"/>
      <dataSource type="POOLED"> <!-- DB 연결 -->
        <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="JDBC:oracle:thin:@localhost:1521:XE" />
        <property name="username" value="scott" />
        <property name="password" value="tiger"/>
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="mybatis/mappers/member.xml"/>
  </mappers>
</configuration>

pro23/src/mybatis/mappers/member.xml

SQL문 저장

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
<mapper namespace="mapper.member">
  <resultMap id="memResult" type="java.util.HashMap">
  <!-- <resultMap id="memResult" type="memberVO"> -->
      <result property="id" column="id" />
      <result property="pwd" column="pwd" />
      <result property="name" column="name" />
      <result property="email" column="email" />
      <result property="joinDate" column="joinDate"/>
  </resultMap>

  <select id="selectAllMemberList" resultMap="memResult">
      <![CDATA[
        select * from t_member order by joinDate desc
      ]]>
  </select>
  
  <select id="selectMemberById" resultType="memberVO" parameterType="String" >
      <![CDATA[
        select * from t_member
        where
        id= #{id}
      ]]>
  </select>

  <select id="selectMemberByPwd" resultMap="memResult" parameterType="int" >
      <![CDATA[
        select * from t_member
        where
        pwd = #{pwd}
      ]]>
  </select>
  
  <insert id="insertMember" parameterType="memberVO"> <!-- 회원 추가 SQL문 -->
    <![CDATA[
      insert into t_member(id,pwd, name, email)
      values(#{id}, #{pwd}, #{name}, #{email}) <!-- 속성 이름으로  설정 -->
    ]]>
  </insert>
  
  <insert id="insertMember2" parameterType="java.util.HashMap"> <!-- HashMap 회원 추가 SQL문 -->
    <![CDATA[
      insert into t_member(id,pwd, name, email)
      values(#{id}, #{pwd}, #{name}, #{email})
    ]]>
  </insert>
  
  <update id="updateMember" parameterType="memberVO"> <!-- 회원 정보 수정 SQL문 -->
    <![CDATA[
      update t_member
      set pwd=#{pwd}, name=#{name}, email=#{email}
      where
      id=#{id}
    ]]>
  </update>
  
  <delete id="deleteMember" parameterType="String"> <!-- 회원 삭제 SQL문 -->
      <![CDATA[
      delete from t_member
      where
      id=#{id}
      ]]>
  </delete>
</mapper>

java 파일들

pro23/src/com/spring/ex01/MemberServlet.java

요청을 DAO에 전달

package com.spring.ex01;
...
@WebServlet("/mem.do")
public class MemberServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    doHandle(request,response);
  }

  protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException , IOException {
    doHandle(request,response);
  }

  private void doHandle(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    
    MemberDAO dao = new MemberDAO();
    
    MemberVO memberVO=new MemberVO();
    String action=request.getParameter("action");
    String nextPage="";
    if(action==null || action.equals("listMembers")){ //회원 목록 조회
      List<MemberVO> membersList=dao.selectAllMemberList();
      request.setAttribute("membersList", membersList);
      nextPage="test02/listMembers.jsp";
    }
    else if(action.equals("selectMemberById")){ //ID로 회원 검색
      String id=request.getParameter("value");
      memberVO=dao.selectMemberById(id);
      
      request.setAttribute("member",memberVO);
      nextPage="test02/memberInfo.jsp";
    }
    else if(action.equals("selectMemberByPwd")){ //pw로 회원 검색
      int pwd =Integer.parseInt(request.getParameter("value"));
      List<MemberVO> membersList=dao.selectMemberByPwd(pwd);
      
      request.setAttribute("membersList",membersList);
      nextPage="test02/listMembers.jsp";
    }
    else if(action.equals("insertMember")) { //회원 추가
      String id=request.getParameter("id");
      String pwd=request.getParameter("pwd");
      String name=request.getParameter("name");
      String email = request.getParameter("email");
      
      memberVO.setId(id);
      memberVO.setPwd(pwd);
      memberVO.setName(name);
      memberVO.setEmail(email);
      dao.insertMember(memberVO);
      nextPage="/mem4.do?action=listMembers";
    }  
    else if(action.equals("insertMember2")) { //HashMap 회원 추가
      String id=request.getParameter("id");
      String pwd=request.getParameter("pwd");
      String name=request.getParameter("name");
      String email = request.getParameter("email");
      
      Map memberMap=new HashMap();
      memberMap.put("id", id);
      memberMap.put("pwd", pwd);
      memberMap.put("name", name);
      memberMap.put("email", email);
      dao.insertMember2(memberMap);
      nextPage="/mem4.do?action=listMembers";
    }
    else if(action.equals("updateMember")) { //회원 정보 수정
      String id=request.getParameter("id");
      String pwd=request.getParameter("pwd");
      String name=request.getParameter("name");
      String email = request.getParameter("email");
      
      memberVO.setId(id);
      memberVO.setPwd(pwd);
      memberVO.setName(name);
      memberVO.setEmail(email);
      dao.updateMember(memberVO);
      nextPage="/mem4.do?action=listMembers";
    }
    
    else if(action.equals("deleteMember")) { //회원 삭제
      String id=request.getParameter("id");
      dao.deleteMember(id);
      nextPage="/mem4.do?action=listMembers";
    }
  
    RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);
    dispatch.forward(request, response);
    
    /* HashMap 회원 목록 조회
    List<HashMap<String, String>> membersList = dao.selectAllMemberList();
    //List<MemberVO> membersList = dao.selectAllMemberList();
    request.setAttribute("membersList", membersList);
    
    RequestDispatcher dispatch = request.getRequestDispatcher("test01/listMembers.jsp");
    dispatch.forward(request, response); */
}

pro23/src/com/spring/ex01/MemberDAO.java

SQL문 호출

package com.spring.ex01;
...
public class MemberDAO{
  private static SqlSessionFactory sqlMapper=null;
  
  public static SqlSessionFactory getInstance() {
    /* DB 연동 */
    if(sqlMapper==null) {
      try {
        String resource = "mybatis/SqlMapConfig.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        sqlMapper = new SqlSessionFactoryBuilder().build(reader);
        
        reader.close();
      } catch(Exception e) { e.printStackTrace(); }
    }
    
    return sqlMapper;
  }
  
  public List<MemberVO> selectAllMemberList() {
    sqlMapper=getInstance();
    SqlSession session=sqlMapper.openSession();
    
    List<HashMap<String, String>> memlist = null; //List<MemberVO> memlist=null;
    memlist=session.selectList("mapper.member.selectAllMemberList"); //SQL 실행
    
    return memlist;
  }
  
  public MemberVO selectMemberById(String id){
    sqlMapper=getInstance();
    SqlSession session=sqlMapper.openSession();
    MemberVO memberVO=session.selectOne("mapper.member.selectMemberById", id);
    
    return memberVO;
  }

  public List<MemberVO> selectMemberByPwd(int pwd) {
    sqlMapper = getInstance();
    SqlSession session = sqlMapper.openSession();
    List<MemberVO> membersList = null;
    membersList= session.selectList("mapper.member.selectMemberByPwd", pwd);
    
    return membersList;
  }
  
  public int insertMember(MemberVO memberVO) { //회원 추가
    sqlMapper = getInstance();
    SqlSession session = sqlMapper.openSession();
    int result = session.insert("mapper.member.insertMember", memberVO);
    session.commit();
    
    return result;
  }
  
  public int insertMember2(Map<String,String> memberMap) { //HashMap으로 회원 추가
    sqlMapper=getInstance();
    SqlSession session=sqlMapper.openSession();
    int result = session.insert("mapper.member.insertMember2", memberMap);
    session.commit();
    
    return result;
  }
  
  public int updateMember(MemberVO memberVO) { //회원 정보 수정
    sqlMapper = getInstance();
    SqlSession session = sqlMapper.openSession();
    int result = session.update("mapper.member.updateMember", memberVO);
    session.commit();
    
    return result;
  }
  
  public int deleteMember(String id) { //회원 삭제
    sqlMapper = getInstance();
    SqlSession session = sqlMapper.openSession();
    int result = 0;
    result = session.delete("mapper.member.deleteMember", id);
    session.commit();
    
    return result;
  }
}

pro23/src/com/spring/ex01/MemberVO.java

package com.spring.ex01;
...
public class MemberVO {
  private String id;
  private String pwd;
  private String name;
  private String email;
  private Date joinDate;

  public MemberVO() { }

  public MemberVO(String id, String pwd, String name, String email) {
    this.id = id;
    this.pwd = pwd;
    this.name = name;
    this.email = email;
  }
  
  /* setter, getter */
  ...

jsp 파일들

pro23/WebContent/test01/listMembers.jsp

...
  <table border="1" align="center" width="80%">
    <tr align="center" bgcolor="lightgreen">
      <td ><b>아이디</b></td>
      <td><b>비밀번호</b></td>
      <td><b>이름</b></td>
      <td><b>이메일</b></td>
      <td><b>가입일</b></td>
      <td><b>삭제</b></td>
    </tr>
    
<c:forEach var="member" items="${membersList}" >
    <tr align="center">
      <td>${member.id}</td>
      <td>${member.pwd}</td>
      <td>${member.name}</td>
      <td>${member.email}</td>
      <td>${member.joinDate}</td>
      <td><a href="${contextPath}/mem4.do?action=deleteMember&id=${member.id}">
      삭제하기</a></td>
    </tr>
</c:forEach>

  </table>
...

pro23/WebContent/test02/search.jsp

...
   <title>회원 검색창</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/mem3.do">
    입력 : <input type="text" name="value"/>
    <select name="action">
      <option value="listMembers" >전체</option>
      <option value="selectMemberById" >아이디</option>
      <option value="selectMemberByPwd">비밀번호</option>
    </select>
    <br>
    <input type="submit" value="검색" />
</form>
</body>
</html>

pro23/WebContent/test02/memberInfo.jsp

...
  <table border="1" align="center" width="100%" >
    <tr align="center" bgcolor="lightgreen">
      <td ><b>아이디</b></td>
      <td><b>비밀번호</b></td>
      <td><b>이름</b></td>
      <td><b>이메일</b></td>
      <td><b>가입일</b></td>
    </tr>
    <tr align="center">
      <td>${member.id}</td>
      <td>${member.pwd}</td>
      <td>${member.name}</td>
      <td>${member.email}</td>
      <td>${member.joinDate}</td>
    </tr>
  </table>
...

pro23/WebContent/test03/memberForm.jsp

...
  <form method="post" action="${ contextPath}/mem4.do?action=insertMember">
    <h1 class="text_center">회원 가입창</h1>
    <table align="center">
      <tr>
        <td width="200"><p align="right">사용자 아이디</td>
        <td width="400"><input type="text" name="id"></td>
    </tr>
...

pro23/WebContent/test03/modMember.jsp

...
<form method="post" action="${contextPath}/mem4.do?action=updateMember">
  <h1 class="text_center">회원 정보 수정창</h1>
  <table align="center">
    <tr>
      <td width="200"><p align="right">아이디</td>
      <td width="400"><input type="text" name="id"></td>
    </tr>
    <tr>
      <td width="200"><p align="right">비밀번호</td>
      <td width="400"><input type="text" name="pw"></td>
    </tr>
    <tr>
      <td width="200"><p align="right">이름</td>
      <td width="400"><input type="text" name="name"></td>
    </tr>
    <tr>
      <td width="200"><p align="right">이메일</td>
      <td width="400"><input type="text" name="email"></td>
    </tr>
    ...
    <input type="submit" value="수정하기">
...


SqlSession 클래스 메소드

List selectList(query_id)
List selectList(query_id, 조건)
T selectOne(query_id): select 타입 지정
T selectOne(query_id, 조건)
Map<K, V> selectMap(query_id, 조건): Map 타입 반환

int insert(query_id, Object obj)
int update(query_id, Object obj)
int delete(query_id, Object obj)



동적 SQL문

SQL문 조건절에 동적으로 조건 추가
JSTL과 XML 기반 동적 SQL문 작성

if

<where>
<if test="조건식"> 추가할 구문 </if>
</where>

pro23/src/mybatis/mappers/member.xml

...
  <select id="searchMember" parameterType="memberVO" resultMap="memResult">
    <![CDATA[
      select * from t_member
    ]]>
    <where>
      <if test="name != '' and name != null"> name = #{name} </if>
      <if test=" email != '' and email != null "> and email=#{email} </if>
    </where>
    order by joinDate desc
  </select>
</mapper>

pro23/src/com/spring/ex04/MemberServlet.java

...
private void doHandle(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
  ...
    } else if(action.equals("searchMember")){
      String name=request.getParameter("name");
      String email=request.getParameter("email");
      memberVO.setName(name);
      memberVO.setEmail(email);
      List<MemberVO> membersList =dao.searchMember(memberVO);
      request.setAttribute("membersList",membersList);
      nextPage="test03/listMembers.jsp";
    }
  ...

pro23/src/com/spring/ex04/MemberDAO.java

...
  public List<MemberVO> searchMember(MemberVO memberVO) {
    sqlMapper=getInstance();
    SqlSession session = sqlMapper.openSession();
    List<MemberVO> list = session.selectList("mapper.member.searchMember",memberVO);
    
    return list;
  }
  ...

pro23/WebContent/test03/searchMember.jsp

...
<body>
  <h1>회원검색</h1>
  <form action="${contextPath}/mem4.do">
    <input type="hidden" name="action" value="searchMember" />
    이름 : <input type="text" name="name" /><br>
    이메일 : <input type="text" name="email" /><br>
   <input type="submit" value="검색" />
  </form>
</body>
...

choose(when, otherwise)

<choose>
<when test="조건식1"> 구문1 </when>
<when test="조건식2"> 구문2 </when>
...
<otherwise> 구문 n+1; </otherwise>
</choose>

pro23/src/mybatis/mappers/member.xml

...
  <select id="searchMember" parameterType="memberVO" resultMap="memResult">
    <![CDATA[
          select * from t_member
    ]]>
      <where>
        <choose>
          <when test="name != '' and name != null and email != '' and email != null"> name=#{name} and email=#{email} </when>
          <when test="name != '' and name != null"> name = #{name} </when>
          <when test="email != '' and email != null"> email = #{email} </when>
        </choose>
      </where>
    order by joinDate desc
  </select>
</mapper>

foreach

collection: 순회할 객체 모음
index
item: 현재 선택된 객체
open: 시작할 때 추가
close: 끝날 때 추가
separator: 구분자 추가

pro23/src/mybatis/mappers/member.xml

...
  <!-- 조회 -->
  <select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
    <![CDATA[
  		select * from t_member
    ]]>
    where name in
    <foreach item="item" collection="list" open="(" separator="," close=")" >
      #{item}
    </foreach>
    order by joinDate desc
  </select>
  
  <!-- 추가 -->
  <insert id="foreachInsert" parameterType="java.util.Map">
    <foreach item="item" collection="list" open="INSERT ALL" separator=" "close="SELECT * FROM DUAL" >
      INTO t_member(id, pwd, name, email)
      VALUES (#{item.id},
              #{item.pwd},
              #{item.name},
              #{item.email})
    </foreach>
  </insert>
  
</mapper>

pro23/src/com/spring/ex04/MemberServlet.java

...
  private void doHandle(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    ...
    
    else if(action.equals("foreachSelect")) { //조회
      List<String> nameList = new ArrayList();
      nameList.add("홍길동");
      nameList.add("차범근");
      nameList.add("이순신");
      List<MemberVO> membersList=dao.foreachSelect(nameList);
      request.setAttribute("membersList", membersList);
      nextPage="test03/listMembers.jsp";
    }
    
    else if(action.equals("foreachInsert")) { //추가
      List<MemberVO> memList = new ArrayList();
      memList.add(new MemberVO("m1", "1234", "박길동", "m1@test.com"));
      memList.add(new MemberVO("m2", "1234", "이길동", "m2@test.com"));
      memList.add(new MemberVO("m3", "1234", "김길동", "m3@test.com"));
      int result=dao.foreachInsert(memList);
      nextPage="/mem4.do?action=listMembers";
    }
    
    RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);
    dispatch.forward(request, response);
  }
  ...

pro23/src/com/spring/ex04/MemberDAO.java

...
  public List<String> foreachSelect(List<String> nameList) {
    sqlMapper=getInstance();
    SqlSession session=sqlMapper.openSession();
    
    List<String> list=session.selectList("mapper.member.foreachSelect", nameList);
    
    return list;
  }
  
  public int foreachInsert(List<MemberVO> memList) {
    sqlMapper=getInstance();
    SqlSession session=sqlMapper.openSession();
    
    int result = session.insert("mapper.member.foreachInsert", memList);
    session.commit();
    
    return result ;
  }
...

sql-include

<sql id="a"> 재사용할 sql문 </sql>
sql문을 적용할 위치: <include refid="a" />

pro23/src/mybatis/mappers/member.xml

...
  <!-- 재사용 코드 -->
  <sql id="a">
    <![CDATA[
      select * from t_member
    ]]>
  </sql>
  
  <select id="searchMember" parameterType="memberVO" resultMap="memResult">
    <include refid="a" />
    <where>
      <choose>
        <when test="name != '' and name != null and email != ’’ and email != null"> name=#{name} and email=#{email} </when>
        <when test="name != '' and name != null"> name = #{name} </when>
        <when test="email !=’’ and email != null"> email = #{email} </when>
      </choose>
    </where>
    order by joinDate desc
  </select>

  <select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
    <include refid="a" />
    where name in
    <foreach item="item" collection="list" open="(" separator="," close=")" >
      #{item}
    </foreach>
  </select>
</mapper>

trim(where, set)



스프링 MyBatis

스프링 - MyBatis 연동 설정

pro24/WebContent/WEB-INF/web.xml

<web-app ...>
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      /WEB-INF/config/action-mybatis.xml
      /WEB-INF/config/action-service.xml
    </param-value>
  </context-param>
...
</web-app>

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

...
<beans>
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/views/member/" />
    <property name="suffix" value=".jsp"/>
  </bean>
  
  <bean id="memberController" class="com.spring.member.controller.MemberControllerImpl">
    <property name="methodNameResolver"> <ref local="memberMethodNameResolver"/> </property>
    <property name="memberService" ref="memberService"/>
  </bean>

  <bean id="memberMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">

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

...
  <!-- DB 설정 정보 가져오기 -->
  <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <value>/WEB-INF/config/JDBC.properties</value>
    </property>
  </bean>
  
  <!-- dataSource bean 생성 -->
  <bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
    <property name="driver" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
  </bean>

  <!-- 설정 파일 지정 -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:mybatis /model/modelConfig.xml" />
    <property name="mapperLocations" value="classpath:mybatis/mappers/*.xml" />
  </bean>
  
  <!-- sqlSession bean 생성-->
  <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
  </bean>
  
  <!-- memberDAO: sqlSession bean 주입 -->
  <bean id="memberDAO" class="com.spring.member.dao.MemberDAOImpl">
    <property name="sqlSession" ref="sqlSession"></property>
  </bean>
</beans>

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

...
  <bean id="memberService" class="com.spring.member.service.MemberServiceImpl">
    <property name="memberDAO" ref="memberDAO"/>
  </bean>
</beans>


MyBatis 설정

pro24/src/mybatis/mappers/member.xml

<mapper namespace="mapper.member">
  <resultMap id="memResult" type="memberVO">
    <result property="id" column="id" />
    <result property="pwd" column="pwd" />
    <result property="name" column="name" />
    <result property="email" column="email" />
    <result property="joinDate" column="joinDate" />
  </resultMap>

  <select id="selectAllMemberList" resultMap="memResult">
    <![CDATA[
      select * from t_member order by joinDate desc
    ]]>
  </select>
  
  <insert id="insertMember" parameterType="memberVO">
    <![CDATA[
      insert into t_member(id,pwd, name, email)
      values(#{id}, #{pwd}, #{name}, #{email})
    ]]>
  </insert>

  <update id="updateMember" parameterType="memberVO">
    <![CDATA[
      update t_member
      set pwd=#{pwd}, name=#{name}, email=#{email}
      where
      id=#{id}
    ]]>
  </update>

  <delete id="deleteMember" parameterType="String">
    <![CDATA[
      delete from t_member
      where
      id=#{id}
    ]]>
  </delete>
...
</mappers>

pro24/src/mybatis/model/modelConfig.xml

...
<configuration>
  <typeAliases>
    <typeAlias type="com.spring.member.vo.MemberVO" alias="memberVO" /> <!-- 클래스명 별칭 설정 -->
  </typeAliases>
</configuration>


java, jsp 구현

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

View - MemberService

package com.spring.member.controller;
...
public class MemberControllerImpl extends MultiActionController implements MemberController {
  private MemberService memberService;
  
  public void setMemberService(MemberServiceImpl memberService) { //setter
    this.memberService = memberService;
  }
  
  @Override
  public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception { //회원 조회
    String viewName = getViewName(request);
    List<MemberVO> membersList = memberService.listMembers();
    ModelAndView mav = new ModelAndView(viewName);
    mav.addObject("membersList", membersList);
    return mav;
  }
  
  @Override
  public ModelAndView addMember(HttpServletRequest request, HttpServletResponse response) throws Exception { //회원 추가
    request.setCharacterEncoding("utf-8");
    MemberVO memberVO = new MemberVO();
    bind(request, memberVO); //전송받은 정보를 각 속성으로 자동 바인딩
    
    int result = 0;
    result = memberService.addMember(memberVO);
    ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do"); //회원 목록으로 redirect
    return mav;
  }

  @Override
  public ModelAndView removeMember(HttpServletRequest request, HttpServletResponse response) throws Exception{ //회원 삭제
    request.setCharacterEncoding("utf-8");
    String id=request.getParameter("id");
    memberService.removeMember(id);
    ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do"); //회원 목록으로 redirect
    return mav;
  }
 
  public ModelAndView form(HttpServletRequest request, HttpServletResponse response) throws Exception {
    /* DB 연동 없을 시 뷰이름 반환 */
    String viewName = getViewName(request);
    ModelAndView mav = new ModelAndView();
    mav.setViewName(viewName);
    
    return mav;
  }
}

pro24/src/com/spring/member/service/MemberServiceImpl.java

Controller - MemberDAO

package com.spring.member.service;
...

@Transactional(propagation=Propagation.REQUIRED)
public class MemberServiceImpl implements MemberService {
  private MemberDAO memberDAO;
  
  public void setMemberDAO(MemberDAO memberDAO) { //setter
    this.memberDAO = memberDAO;
  }
  
  @Override
  public List<MemberVO> listMembers() throws DataAccessException {
    List<MemberVO> membersList = null;
    membersList = memberDAO.selectAllMemberList();
    return membersList;
  }

  @Override
  public int addMember(MemberVO memberVO) throws DataAccessException {
    return memberDAO.insertMember(memberVO);
  }

  @Override
  public int removeMember(String id) throws DataAccessException {
    return memberDAO.deleteMember(id);
  }
}

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

MemberService - DB(SqlSession)

package com.spring.member.dao;
...
public class MemberDAOImpl implements MemberDAO {
  private SqlSession sqlSession;
  
  public void setSqlSession(SqlSession sqlSession) { //setter
    this.sqlSession = sqlSession;
  }
  
  @Override
  public List selectAllMemberList() throws DataAccessException {
  List<MemberVO> membersList = null;
    membersList = sqlSession.selectList("mapper.member.selectAllMemberList");
    return membersList;
  }

  @Override
  public int insertMember(MemberVO memberVO) throws DataAccessException {
    int result = sqlSession.insert("mapper.member.insertMember", memberVO);
    return result;
  }
  @Override
  public int deleteMember(String id) throws DataAccessException {
    int result = sqlSession.delete("mapper.member.deleteMember", id);
    return result;
  }
}

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

...
<c:forEach var="member" items="${membersList}" >
  <tr align=center>
    <td>${member.id}</td>
    <td>${member.pwd}</td>
    <td>${member.name}</td>
    <td>${member.email}</td>
    <td>${member.joinDate}</td>
    <td><a href="${contextPath}/member/removeMember.do?id=${member.id}">삭제하기</a></td>
  </tr>
</c:forEach>
  </table>
  <a href="${contextPath}/member/memberForm.do">
    <h1 style="text-align:center">회원가입</h1>
  </a>
...

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

...
<form method="post" action="${contextPath}/member/addMember.do">
<h1 class="text_center">회원 가입창</h1>
<table align="center">
  <tr>
    <td width="200"><p align="right">사용자 아이디</td>
    <td width="400"><input type="text" name="id"></td>
  </tr>
  ...
  ...
  <tr>
    <td width="200"><p>&nbsp;</p></td>
    <td width="400"> <input type="submit" value="가입하기"><input type="reset" value="다시입력"> </td>
  </tr>
...


*자바 웹을 다루는 기술

profile
CS 메모장

0개의 댓글