본문 바로가기

programming/Gukbi

국비 교육 81일차 - annotation service

728x90
반응형

하루에 배운걸 두 포스팅에서 나눠서 하고 있다는건.. 오늘 내가 배운게 많다는 뜻이겠지?

힘들어 죽겠다. 복습만 몇시간째 하는지...

 

일단 배운 내용을 써보자면

Mybatis에서 join을 걸어서 값을 가져오는 방법과 service annotation을 활용해서 dao를 한꺼번에 관리하는 방법이다. 

 

일단 모든것의 시작은 VO부터 

package com.sist.dao;

// 사용자 정의 데이터형 : 데이터형 여러개를 모아서 한개로 통합 => 데이터를 모아서 한번에 전송
import java.util.*;
public class EmpVO {
	private int empno;
	private String ename;
	private String job;
	private int mgr;
	private Date hiredate;
	private int comm;
	private int sal;
	private int deptno;
	private DeptVO dvo=new DeptVO(); // JOIN
	
	public DeptVO getDvo() {
		return dvo;
	}
	public void setDvo(DeptVO dvo) {
		this.dvo = dvo;
	}
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public int getMgr() {
		return mgr;
	}
	public void setMgr(int mgr) {
		this.mgr = mgr;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public int getComm() {
		return comm;
	}
	public void setComm(int comm) {
		this.comm = comm;
	}
	public int getSal() {
		return sal;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
	
	
}

 JOIN을 걸어주기 위해서 DeptVO를 변수로 가져온다. getter, setter역시 만들어 준다. 

 

실습을 좀 많이해서 복잡해지긴 했는데 일단은 이게 기본틀이라고 생각하고 정리하겠다. 

 

emp-mapper 파일

<?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">
<!-- 
      String sql="SELECT empno,ename,dname,loc "  => vo.setEmpno() vo.setEname() vo.setDname() vo.setLoc()
                +"FROM emp,dept "
                +"WHERE emp.deptno=dept.deptno;
      ResultSet rs=ps.executeQuery();
      while(rs.next())
      {
         EmpVO vo=new EmpVO();
         vo.setEmpno(rs.getInt(1));
         vo.setEname(rs.getString(2));
         vo.getDvo().setDname(rs.getString(3));
         vo.getDvo().setLoc(rs.getString(4));
      }
 -->
<mapper namespace="com.sist.dao.emp-mapper">
  <!-- MyBatis에서 JOIN일 경우에 Resultset을 설정한다 -->
  <resultMap type="com.sist.dao.EmpVO" id="empMap">
   <result property="empno" column="empno"/>
   <!-- vo.setEmpno(rs.getInt("empno")) -->
   <result property="ename" column="ename"/>
   <result property="job" column="job"/>
   <result property="mgr" column="mgr"/>
   <result property="hiredate" column="hiredate"/>
   <result property="sal" column="sal"/>
   <result property="comm" column="comm"/>
   <result property="deptno" column="deptno"/>
   <result property="dvo.dname" column="dname"/>
   <!-- vo.getDvo().setDname(rs.getString("dname")); -->
   <result property="dvo.loc" column="loc"/>
  </resultMap>
  <select id="empListData" resultType="EmpVO">
   SELECT * FROM emp
  </select>
  <select id="empdeptJoinData" resultMap="empMap">
    SELECT empno,ename,job,mgr,hiredate,sal,comm,emp.deptno,dname,loc
    FROM emp,dept
    WHERE emp.deptno=dept.deptno
  </select>
  <select id="empSubQueryData" resultType="empVO" parameterType="String">
    SELECT empno,ename,job,hiredate,sal
    FROM emp
    WHERE deptno=(SELECT deptno FROM emp WHERE ename=#{ename})
  </select>
</mapper>

 Join을 걸지않고 그냥 값을 가져올때는 sql문장을 그냥 쓰면 되지만 join을 할때는 위와 같이 resultmap으로 결과값을 지정해줘야 한다. 

 

 <result property="dvo.dname" column="dname"/>

 dname이라는 컬럼에 dvo.dname이라는 변수의 값을 셋팅해준다는 뜻이다. 

<!-- vo.getDvo().setDname(rs.getString("dname")); -->

 아래 코드와 같은 뜻이다. 

 

package com.sist.dao;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.*;
@Repository
public class EmpDAO extends SqlSessionDaoSupport{
    // SqlSessionFactory => Config.xml(emp-mapper.xml,dept-mapper.xml) 파싱한 내용을 가지고 있다
	// 자동 주입 
	@Autowired
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		// TODO Auto-generated method stub
		super.setSqlSessionFactory(sqlSessionFactory);
	}
    
	public List<EmpVO> empListData()
	{
		return getSqlSession().selectList("empListData");
	}
	
	public List<EmpVO> empdeptJoinData()
	{
		return getSqlSession().selectList("empdeptJoinData");
	}
	
	public List<EmpVO> empSubQueryData(String ename)
	{
		return getSqlSession().selectList("empSubQueryData",ename);
	}
}

 이렇게 empDAO에 메소드들을 모아주고, 

package com.sist.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class EmpDeptService {
   @Autowired
   private EmpDAO eDao;
   
   @Autowired
   private DeptDAO dDao;
   
   public List<EmpVO> empListData()
   {
	   return eDao.empListData();
   }
   public List<DeptVO> deptListData()
   {
	   return dDao.deptListData();
   }
   
   public List<EmpVO> empdetpJoinData()
   {
	   return eDao.empdeptJoinData();
   }
   
   public List<EmpVO> empSubQueryData(String ename)
   {
	   return eDao.empSubQueryData(ename);
   }
   
}

 각각의 dao 메소드를 호출해서 하나의 service안에 담아준다. 

 

package com.sist.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

//@Controller:Model=> 사용자의 요청을 처리 => 결과값을 보내주는 역할
import java.util.*;
import com.sist.dao.*;
@Controller
public class EmpDeptController {
  /* @Autowired
   private EmpDAO eDao;
   
   @Autowired
   private DeptDAO dDao;
  */
   @Autowired
   private EmpDeptService service;
   
   // 기능 (사용자 요청시 처리) => @RequestMapping , @GetMapping , @PostMapping
   @GetMapping("sawon/list.do")
   public String sawon_list(Model model)
   {
	   List<EmpVO> eList=service.empListData();
	   List<DeptVO> dList=service.deptListData();
	   // list.jsp로 데이터 전송 
	   model.addAttribute("eList", eList);
	   model.addAttribute("dList", dList);
	   return "sawon/list"; //forward
   }
   @GetMapping("sawon/join.do")
   public String sawon_join(Model model)
   {
	   List<EmpVO> list=service.empdetpJoinData();
	   model.addAttribute("list", list);
	   return "sawon/join";
   }
   
   @GetMapping("sawon/subquery.do")
   public String sawon_subquery(Model model)
   {
	   List<EmpVO> list=service.empSubQueryData("SCOTT");
	   model.addAttribute("list", list);
	   return "sawon/subquery";
   }
}

 그러면 이런식으로 service 클래스 하나만으로 제어가 가능해진다. 

 

그리고 소소하고 귀엽게 subquery를 쓴 문장

<select id="empSubQueryData" resultType="empVO" parameterType="String">
    SELECT empno,ename,job,hiredate,sal
    FROM emp
    WHERE deptno=(SELECT deptno FROM emp WHERE ename=#{ename})
  </select>

scott이랑 같은 부서에 있는 놈들의 정보를 가져왔당

 

 

하 이제 진짜 끝

 

 

728x90
반응형