스프링 컨테이너와 어노테이션 사용으로 서블릿보다 조금더 간단하게 설정하기

준비


new-Other-Dynamic Web Project로 02_SpringTest 생성

 

  • 간략한 작업순서

    index.jsp 실행하여 전체보기를 클릭 personList.go ⇒ Controller (@RequestMapping("personList.go")) ⇒PersonDAOImpl(dao) personList(){} ⇒ select sql문으로 가져온 결과값을 List형태에 담음⇒ModelAndView 객체에 저장⇒전체보기 jsp에서 뿌려줌

 


  • web.xml 코드 추가
<servlet>
<servlet-name>springtest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springtest</servlet-name>
<url-pattern>*.go</url-pattern>
</servlet-mapping>

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 


  • context.xml 에 코드 추가
<Resource name="jdbc/spring" auth="Container" 
  type="javax.sql.DataSource" 
  driverClassName="oracle.jdbc.driver.OracleDriver"
  url="jdbc:oracle:thin:@localhost:1521:xe" 
  username="scott" password="1234"
  maxTotal="20" maxIdle="20"
  maxWaitMillis="-1"
  />

 

 


  • springtest-servlet.xml 작성
💡
namespace 탭에서 context를 선택하고 다시 Source탭으로 가면 context가 잡혀있다. 찾을 폴더(패키지)를 등록해주고 jsp로 끝나는 파일들도 등록시켜준다.

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

<!-- 찾을 폴더(패키지) 등록 -->
<context:component-scan base-package="com.test.controller"/>

<!-- person하위에 있는 패키지는 모두 어노테이션을 참조하게 됨.-->
<context:component-scan base-package="com.person"/> 

<!-- 등록 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

<!-- db설정(ds정의) -->
<bean id="ds" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
	<value>jdbc/spring</value>
</property>
<property name="resourceRef" value="true"></property>
</bean>

<!-- template 설정 -->
<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
	<property name="dataSource" ref="ds"></property>
</bean>
</beans>

 

 

테스트하기


  • TestController.java
package com.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {
	
	@RequestMapping("test.go")
	public String test() {
		return "result";
	}
	
	@RequestMapping("test22.go")
	public String test22() {
		return "result22";
	}
}

 

💡
src에 com.test.controller 패키지 생성 후 TestController.java 클래스 파일을 생성한다. 어노테이션 사용이 제대로 되는지 확인하기 위한 테스트용 클래스이다.
💡
@Controller 어노테이션을 적어주면 xml에서 알아서 찾아온다. @RequestMapping 어노테이션과 jsp를 돌려주는 String 형의 메소드를 적어준다. return "result"에 의해 result.jsp가 리턴된다.

 

 


 

  • result.jsp
💡
return 되어질 result.jsp 파일이다. 간단하게 어노테이션 테스트 성공이라고 body 태그 안에 적었다. (index.jsp를 실행하고 링크를 클릭하면 result.jsp의 내용이 나타남)

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
어노테이션 사용 테스트 성공
</body>
</html>

 


 

  • index.jsp

 

💡
run on server 실행파일로 WebContent 폴더 내, WEB-INF 폴더 바깥에 생성한다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="test.go">테스트</a>
<a href="test22.go">테스트22</a>
<hr/>
<a href="personInsert.go">person 추가하기</a>
<a href="personList.go">전체보기</a>
</body>
</html>

 

 


 

테스트용 TestController.java 외에도 전체보기, 추가하기, 수정, 삭제 실행에 필요한 패키지와 클래스 파일들을 생성한다.

 

  • PersonController.java
💡
@Controller, @Autowired 어노테이션에 의해 스프링 컨테이너로 자동 등록된다. 이 클래스 파일을 통하여 db에 추가, 선택, 수정, 삭제가 실행된다.
package com.person.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.person.model.Person;
import com.person.model.PersonDAOImpl;

@Controller
public class PersonController {
	@Autowired
	private PersonDAOImpl dao;

	//추가폼
	@RequestMapping(value="personInsert.go",method=RequestMethod.GET)
	public String insert() {
		return "personForm";
	}    
	
	//추가
	@RequestMapping(value="personInsert.go",method=RequestMethod.POST)
	public String insert(Person p) {
		dao.personInsert(p);
		return "redirect:personList.go";
	}
	
	//전체보기
	@RequestMapping("personList.go")
	public ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		ModelAndView mv=new ModelAndView();
		List<Person> userlist=dao.personList();
		mv.addObject("userlist", userlist);
		mv.setViewName("personList");
		return mv;
	}
	
	//상세보기
	@RequestMapping("personView.go")
	protected ModelAndView view (String id) {
		ModelAndView mv=new ModelAndView();
		Person p=dao.personView(id);
		mv.addObject("user", p);
		mv.setViewName("personView");
		return mv;
	}
	
	//수정하기 폼으로 가기
	@RequestMapping(value="update.go",method=RequestMethod.GET)
	public String personUpdate(Model model, String id) {
		Person p=dao.personView(id);
		model.addAttribute("user", p);
		return "updateForm";
	}
	
	//수정하기
	@RequestMapping(value="update.go",method=RequestMethod.POST)
	public String personUpdate(Person p) {
		dao.personUpdate(p);
		return "redirect:personList.go";
	}
	
	//삭제하기
	@RequestMapping("personDelete.go")
	public String personDelete(String id) {
		dao.personDelete(id);
		return "redirect:personList.go";
	}
}

 


 

객체와 db 연결에 필요한 com.person.model 패키지 하위의 클래스 파일들

  • Person.java
package com.person.model;

import org.springframework.stereotype.Component;


public class Person {
	//getter, setter
	private String id;
	private String name;
	private String gender;
	private String password;
	private String job;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
}

 


package com.person.model;

import java.util.List;

public interface PersonDAO {
	//추가
	public void personInsert(Person p);
	//전체보기
	public List<Person> personList();
	//수정
	public void personUpdate(Person p);
	//삭제
	public void personDelete(String id);
	//상세보기
	public Person personView(String id);
}

 


💡
Repository, Autowired 어노테이션을 통해 자동으로 springtest-servlet.xml과 연결된다.
💡
<지금까지의 스프링 컨테이너 이용 작업 순서> 1. springtest-servlet.xml에서 찾을 패키지 등록 2. com.person 하위에서 가장 먼저 controller이 찾아짐. PersonController의 상단에 있는 @Controller 어노테이션에 의해 스프링 컨테이너에 PersonController 객체가 들어감. 3. com.person 그 다음 하위인 model 패키지 내의 Person.java에는 @Component 어노테이션이 붙었음. (getter, setter는 어노테이션을 떼도 된다.) 4. Person.java의 객체들을 인식한뒤 PersonDAOImpl.java로 넘어가서 template을 자동으로 연결한다.
package com.person.model;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

@Repository
public class PersonDAOImpl implements PersonDAO{
	@Autowired
	private JdbcTemplate template;
	
	//추가
	public void personInsert(Person p) {
		String sql="insert into person values(?,?,?,?,?)";
		Object[]param=new Object[] {
				p.getId(),p.getName(),p.getPassword(),p.getGender(),p.getJob()
		};
		template.update(sql, param);
	}

	//전체보기
	public List<Person> personList() {
		String sql="select * from person";
		List<Person> personlist=template.query(sql, new RowMapper<Person>() {

			@Override
			public Person mapRow(ResultSet rs, int arg1) throws SQLException {
				Person p=new Person();
				p.setGender(rs.getString("gender"));
				p.setId(rs.getString("id"));
				p.setJob(rs.getString("job"));
				p.setName(rs.getString("name"));
				p.setPassword(rs.getString("password"));
				return p;
			}
		});
		return personlist;
	}

	//수정하기
	public void personUpdate(Person p) {
		String sql="update person set job=?, gender=?, name=?, password=? where id=?";
		Object[] param=new Object[] {
				p.getJob(),p.getGender(),p.getName(),p.getPassword(),p.getId()
		};
		template.update(sql, param);
	}

	//삭제하기
	public void personDelete(String id) {
		String sql="delete from person where id='"+id+"'";
		template.update(sql);
	}

	//상세보기
	public Person personView(String id) {
		String sql="select * from person where id='"+id+"'";
		Person p=template.queryForObject(sql, new RowMapper<Person>() {
			@Override
			public Person mapRow(ResultSet rs, int arg1) throws SQLException {
				Person user=new Person();
				user.setGender(rs.getString("gender"));
				user.setId(rs.getString("id"));
				user.setJob(rs.getString("job"));
				user.setName(rs.getString("name"));
				user.setPassword(rs.getString("password"));
				return user;
			}
		});
		return p;
	}

}

 

 


 

그 외 personForm.jsp, personList.jsp, personView.jsp, updateForm.jsp는 지난 시간과 거의 똑같다.

 

 

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

Maven (JDBC template 방식)  (0) 2020.10.13
Mybatis 회원가입  (0) 2020.10.08
@Service 추가 간단한 주소록  (0) 2020.10.08
간단한 회원가입 실습  (0) 2020.10.06
스프링 설치 및 간단 주소록 만들기  (0) 2020.10.05

+ Recent posts