본문 바로가기

programming/Gukbi

국비 교육 89일차 - 차세대 개발, java로만 spring 개발하기

728x90
반응형

제목 그대로 xml 없이 자바로만 스프링을 사용할 수 있는데, 이걸 차세대 개발이라고 칭한다. 

어노테이션만을 이용해서 스프링 개발이 가능하다. 

 

package com.sist.config;

import javax.inject.Scope;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
// <context:component-scan base-package="com.sist.*"/>
@ComponentScan(basePackages={"com.sist.*"})
@EnableWebMvc
public class EmpConfig implements WebMvcConfigurer{
    /*
                  요청 *.do
             |
         DispatcherServlet 
             |
          ***HandlerMapping : Model클래스를 찾아주는 역할 (스프링에서 동작하는 자체 라이브러리)
             |
           Model(사용자 정의 => @Controller) => POJO (상속,인터페이스 구현 이 없는 클래스)
             |
          ***HandlerAdapter : 형변환을 동일해게 제작  (스프링에서 동작하는 자체 라이브러리)
             |
         DispactherServlet : 설정 (web.xml)
             |
          ViewResolver : 설정  (자바,appplication-context.xml)
             |
            JSP 
     */
	// HandlerMapping,HandlerAdapter 생성 
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
	
	// DataSource
	// @Bean(name="") => <bean id="ds" scope="propotype"> : XML코드는 자바로 변경할 때 주로 어노테이션 (XML을 대체하는 프로그램) 
	@Bean(name="ds")
	//@Scope("prototypy")
	public DataSource dataSource()
	{
		BasicDataSource ds=new BasicDataSource();
		ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		ds.setUrl("jdbc:oracle:thin:@localhost:1521:XE");
		ds.setUsername("hr");
		ds.setPassword("happy");
		return ds;
	}
	// SSF
	@Bean(name="ssf")
	public SqlSessionFactory sqlSessionFactory() throws Exception
	{
		SqlSessionFactoryBean ssf=new SqlSessionFactoryBean();
		ssf.setDataSource(dataSource());
		return ssf.getObject();
	}
	// Mapper : SQL문장을 저장하고 있는 인터페이스의 메소드를 구현해 주는 역할 수행 => MapperFactoryBean  
	@Bean(name="mapper")
	public MapperFactoryBean mapperFactoryBean() throws Exception
	{
		MapperFactoryBean mapper=new MapperFactoryBean();
		mapper.setSqlSessionFactory(sqlSessionFactory());
		mapper.setMapperInterface(com.sist.dao.EmpMapper.class);
		return mapper;
	}
	// ViewResolver
	@Bean(name="viewResolver")
	public ViewResolver viewResolver()
	{
		InternalResourceViewResolver vr=new InternalResourceViewResolver();
		vr.setPrefix("/");
		vr.setSuffix(".jsp");
		return vr;
	}
	// Transcation
    
}

 사용을 하기 위해서는 xml이 아니라 자바 파일에 등록을 해줘야 한다. xml에 등록했을때와 클래스들은 동일하다. 

 

package com.sist.dao;
import java.util.*;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
public interface EmpMapper {
   // 조인 <resultMap>
   @Results({
	   @Result(property="empno",column="empno"), // 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"), // setDeptno(rs.getInt("deptno"))
	   @Result(property="dvo.dname",column="dname"),  // getDvo().setDname(rs.getString("dname"))
	   @Result(property="dvo.loc",column="loc")
   })
   @Select("SELECT empno,ename,job,mgr,hiredate,sal,comm,emp.deptno,dname,loc "
		  +"FROM emp,dept "
		  +"WHERE emp.deptno=dept.deptno")
   public List<EmpVO> empJoinData();
   // ResultSet rs=ps.executeQuery();
   // rs.next(); => vo.setXxx()...
   @Results({
	   @Result(property="empno",column="empno"), // 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"), // setDeptno(rs.getInt("deptno"))
	   @Result(property="dvo.dname",column="dname"),  // getDvo().setDname(rs.getString("dname"))
	   @Result(property="dvo.loc",column="loc")
   })
   @Select("SELECT empno,ename,job,mgr,hiredate,sal,comm,emp.deptno,dname,loc "
		  +"FROM emp,dept "
		  +"WHERE emp.deptno=dept.deptno "
		  +"AND empno=#{empno}")
   public EmpVO empFindData(int empno);
   /*
    *   <select id="empFindData" resultType="com.sist.dao.EmpVO" parameterType="hashmap">
		    SELECT empno,ename,job,TO_CHAR(hiredate,'YYYY/MM/DD') as dbday,sal
		    FROM emp 
		    <trim prefix="WHERE ename IN(" suffix=")" suffixOverrides=")">
		     <foreach collection="names" item="ename" close=")" separator=",">#{ename}</foreach>
		    </trim>
		  </select>
    */
   // 동적 SQL
   @Select("<script>"
		  +"SELECT empno,ename,job,TO_CHAR(hiredate,'YYYY-MM-DD HH24:MI:SS') as dbday,sal "
		  +"FROM emp "
		  +"WHERE ename "
		  +"<trim prefix='IN'>"
		  +"<foreach item='name' collection='nameArr' open='(' close=')' separator=','>#{name}"
		  +"</foreach>"
		  +"</trim>"
		  +"</script>"
		  )
   public List<EmpVO> empSearchData(Map map);
   
   
}

 mapper역시 이렇게 써준다. xml로 쓰는게 덜 귀찮은거 같은 기분이지만.. 일단 이렇게 사용하는 방법도 당연히 알아 놔야한다. 

 

마지막에 써준건 동적 sql로 사용자가 입력한 같에 따라서 쿼리의 내용이 달라진다. 

 

 

<form method="POST" action="find.do">
      <table class="table">
        <caption>검색</caption>
        <tr>
          <td>
            <c:forEach var="vo" items="${list }">
             <input type="checkbox" name="names" value="${vo.ename }">${vo.ename }
            </c:forEach> 
          </td>
        </tr>
        <tr>
          <td class="text-center">
           <button class="btn btn-sm btn-info">검색</button>
          </td>
        </tr>
      </table>
      </form>

여러명의 이름을 checkbox로 선택하고 그 값을 받아서 find.do쪽으로 넘겨주고 있다. 

 

@PostMapping("emp/find.do")
	public String emp_find(String[] names,Model model)
	{
		// DAO연결 
		for(String name:names)
		{
			System.out.println(name);
		}
		Map map=new HashMap();
		map.put("nameArr", names);
		List<EmpVO> list=dao.empSearchData(map);
		model.addAttribute("list",list);
		return "emp/find";
	}

 find만 조금 달라서 여기만 살펴보면 이렇다. 매개변수로 문자열 배열을 받아온적은 처음인거 같다. 

여튼 이름들의 배열인 names를 map에 담아주고, 메소드의 매개변수로 채워 넣어줘서 list를 뽑아낸다. 

 

 

이 다음에는 RestController를 사용해서 창을 띄워보는 연습을 할거다,,

 

 

728x90
반응형