Backend/Spring

[Spring] Mybatis_2

양원준 2023. 6. 9. 12:06
728x90

저번 글에 mybatis 관련 설정을 했다

이젠 domain, dao, service, controller, mapper 코드 등을 작성한 후 관계 설정을 해주면 된다

 

 

dao 인터페이스 , dao 클래스

//MemberDAO 인터페이스

package org.tukorea.wonjoon.persistence;
import java.util.List;
import org.tukorea.myweb.domain.StudentVO;

public interface MemberDAO {

	public void add(StudentVO student) throws Exception;
	public List<StudentVO> readList() throws Exception;
	public StudentVO read(String id) throws Exception;
	public void delete(String id) throws Exception;
	public void update(StudentVO student) throws Exception;
}

기본 crud 인터페이스 작성해주고

 

//MemberDAOImpl
package org.tukorea.wonjoon.persistence;

import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.tukorea.myweb.wonjoon.StudentVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;


@Repository
public class MemberDAOImpl implements MemberDAO {

	@Autowired
	private SqlSession sqlSession;
	private static final String namespace = "org.tukorea.wonjoon.mapper.StudentMapper";
    
	public StudentVO read(String id) throws Exception {
		StudentVO vo = sqlSession.selectOne(namespace+".selectByid", id);
		return vo;
	}
    
	public List<StudentVO> readList() throws Exception {
		List<StudentVO> studentlist = new ArrayList<StudentVO>();
		studentlist = sqlSession.selectList(namespace + ".selectAll");
		return studentlist;
	}

	public void add(StudentVO vo) throws Exception {
		sqlSession.insert(namespace + ".insert", vo);
	}
    
	public void delete(String id) throws Exception {
		sqlSession.delete(namespace + ".delete", id);
	}
    
	public void update(StudentVO student) throws Exception {
		sqlSession.update(namespace + ".update", student);
	}
}

dao 인터페이스에 대한 클래스 작성을 해줌

mapper의 namspace를 통하여 sqlSession에 접근을 해준다

 

그리고 dao에 관한 내용을

//root-context.xml
<context:component-scan base-package="org.tukorea.wonjoon.persistence" />

스프링 빈 등록을 해줌

 

 

 

mapper 생성과 sql문 작성

//studentMapper.xml

<?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="org.tukorea.wonjoon.mapper.StudentMapper">

	<insert id="insert">
		insert into student (id, passwd, username, snum, depart, mobile, email) values
		(#{id}, #{passwd}, #{username}, #{snum}, #{depart}, #{mobile}, #{email})
	</insert>
    
	<select id="selectByid" resultType="org.tukorea.wonjoon.domain.StudentVO">
		select * from student where id = #{id}
	</select>
    
	<select id="selectAll" resultType="org.tukorea.wonjoon.domain.StudentVO">
		<![CDATA[
		select * from student
		]]>
	</select>
    
	<update id="update">
		update student set id =#{id}, passwd =#{passwd}, username =#{username}, snum =#{snum}, depart =#{depart}, mobile =#{mobile}, email =#{email} where id = #{id}
	</update>
    
	<delete id="delete">
		delete from student where id = #{id}
	</delete> 

</mapper>

root-context.xml 의 mapperLoactions 속성에 파일 위치 설정 해두었다

mapper는 sql 문을 저장하는 곳임 , mapper를 통해 sql문과 객체를 연결

파일명은 mapper 인터페이스명으로 함

 

위 코드 중 CDTA 는 xml 내의 sql 문장에 특수 문자가 있으면 태그와 혼동되는데 이를 사용하면 일반 텍스트로 직접 기술 가능

 

 

여기서 SQL 삽입 값의 연계 방법은?

--> #{바인드 변수 명} 을 이용한 바인드 변수 지정

  1. 파라미터가 자바빈즈 객체일 경우 #{num}은 getNum() 혹은 setNum()을 의미
  2. 파라미터가 하나이고, 기본 자료형이나 문자일 경우 값을 그대로 전달
  3. 파라미터가 Map일 경우 #{num}은 Map 객체의 키 값이 'num'인 값을 찾음

 

추가로 mapper의 sql 반환 값에 따라 dao 객체의 메서드 타입이 결정된다

  • insert :  void
  • update : void
  • delete : void
  • read : 자동적으로 객체와 매핑

 

 

 

 

회원 정보 관리 기능 정상 동작 단위 테스트

//MemberDAOTest

package org.tukorea.wonjoon.test;
...................................................
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/root-context.xml" })
	
    public class MemberDAOTest {
	@Autowired
	private MemberDAO dao;
	private static Logger logger = LoggerFactory.getLogger(MemberDAOTest.class);

	@Test
	public void testReadByid() throws Exception {
		StudentVO vo;
		vo = dao.read("yang");
		logger.info(vo.toString());
	}
    
	@Test
	public void testReadList() throws Exception {
		List<StudentVO> voList;
		voList = dao.readList();
		for(StudentVO svo : voList) {
			logger.info(svo.toString());
		}
	}
}

 

 

 

 

 

 

service 인터페이스, service 클래스

//MemberService
package org.tukorea.wonjoon.service;

import java.util.List;
import org.tukorea.wonjoon.domain.StudentVO;

public interface MemberService {

	public StudentVO readMember(String id) throws Exception;
	public List<StudentVO> readMemberList() throws Exception;
	public void addMember(StudentVO student) throws Exception;
	public void deleteMember(String id) throws Exception;
	public void updateMember(StudentVO student) throws Exception;

}
//MemberServiceImpl
..............................................................................................................................
@Service
public class MemberServiceImpl implements MemberService {

	@Autowired
	private MemberDAO memberDAO;
    
	public StudentVO readMember(String id) throws Exception {
		return memberDAO.read(id);
	}
    
	public List<StudentVO> readMemberList() throws Exception{
		return memberDAO.readList();
	}
    
	public void addMember(StudentVO student) throws Exception {
		memberDAO.add(student);
	}
    
	public void deleteMember(String id) throws Exception {
		memberDAO.delete(id);
	}
    
	public void updateMember(StudentVO student) throws Exception {
		memberDAO.update(student);
	}
}

 

이렇게 인터페이스, 클래스 작성 후 스프링 빈 등록

<context:component-scan base-package="org.tukorea.wonjoon.service" />

 

 

 

 

 

컨트롤러 작성

//MemberController

package org.tukorea.wonjoon.controller;
import org.tukorea.wonjoon.domain.StudentVO;
import org.tukorea.wonjoon.service.MemberService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
@RequestMapping(value="/member")
public class MemberController {
	private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
	
    @Autowired(required=true)
	private MemberService memberService;
}

 

//MemberController 중

@RequestMapping(value = {"/register"}, method = RequestMethod.GET)
public String createMemberGet() throws Exception {
	logger.info(" /register URL GET method called. then forward member_register.jsp.");
	return "member/member_register";
}

@RequestMapping(value = {"/register"}, method = RequestMethod.POST)
public String createMemberPost( @ModelAttribute("student") StudentVO vo) throws
Exception {
	memberService.addMember(vo);
	logger.info(vo.toString());
	logger.info(" /register URL POST method called. then createMember method executed.");
	return "redirect:/member/list";
}

url요청이 들어 오면 get 매핑 하고 해당 url로 리다이렉트

post 요청이 들어오면 정보 전달 뒤 jsp 페이지 반환

 

컨트롤러도 스프링 빈까지 등록하면 끗!!!

//servlet-context.xml
<context:component-scan base-package="org.tukorea.wonjoon.controller" />
728x90

'Backend > Spring' 카테고리의 다른 글

[Spring] AOP(Aspect Oriented Programming)  (0) 2023.06.09
[Spring] Mybatis  (0) 2023.06.09