반응형

# Spring WEB MVC_01버전_06 MVC 동작원리_1 : 톰캣 실행 시

1. listener (ContextLoaderListener)

  • web.xml 에서.. listener가 먼저 실행.   
  • context-param : listener가 참조할 수 있는 것을 설정할때 사용. 해당 태그 내에 있는 param-name으로 param-value를 읽어온다.

## Spring Container 

  • 객체를 관리하는 메모리 공간.
  • A 클래스가 B 클래스를 사용할 경우 일반적으로 A 클래스가 아래와 같이 객체를 생성해야 한다. 이렇게 되면 A클래스와 B클래스는 서로 의존관계가 형성된다. 그래서 B클래스에 변화가 발생하면 A클래스에 영향을 주게 된다.
B b = new B();
  • 스프링에서는 의존관계를 느슨하게하는 DI 기법을 적용한다. 스프링에서는 위에서처럼 A클래스에서 B클래스를 사용할때 객체를 생성해서 하지 않고, 어디엔가(Spring Container) 미리 만들어진 것을 주입받아 사용. 이를 의존성 주입 이라고 한다. (DI)

2. Servlet (DispatcherServlet)

  • servlet-context.xml을 실행.
  • 어노테이션(@)을 사용할 수 있게 하고.
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
  • css, image, js 등의 파일의 resource 위치를 mapping 부분을 참조하겠다는 것.
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

참조할 resource 위치.

  • ViewResolver : view의 논리적인 이름을 prefix 와 suffix 부분을 붙여서 하나의 물리적인 경로를 만들어내는 것.
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <beans:property name="prefix" value="/WEB-INF/views/" />
  <beans:property name="suffix" value=".jsp" />
</beans:bean>
  • context:component-scan : 입력된 base-package를 스캐닝
<context:component-scan base-package="kr.narp.myapp" />

## 정리

  • 아래처럼 실행되면서 DispatcherServlet (FrontController)가 준비상태에 되어있다가 클라이언트의 요청을 받아 *.do 등의 요청을 받으면 HandlerMapping 에 맞는 메서드부터 프로그램이 진행된다.

 

# Spring WEB MVC_01버전_07 MVC 동작원리_2 : 클라이언트 요청

## web.xml

  • 기존 / 에서 *.do 로 변경.
<servlet-mapping>
  <servlet-name>appServlet</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
  • 모든 클라이언트에서 *.do 요청이 오게되면 DispatcherServlet이 요청을 받게 된다.
  • 요청을 받은 DispatcherServlet => HandlerMapping 에서 요청에 맞는 응답 메서드 확인 => DispatcherServlet => MemberController (POJO)에서 요청에 따른 응답 메서드 실행.

## root-context.xml

  • context:component-scan 추가해서 kr.bit.model 에 있는 MemberDAO, MemberVO가 component-scan이 되도록 설정.
<?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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	
	<!-- MyBatis SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	    <property name="dataSource"  ref="dataSource"/>
	    <property name="configLocation" value="/WEB-INF/mybatis/config.xml"/>
	    <property name="mapperLocations" value="classpath:kr/bit/mybatis/*.xml"/>
	</bean>
	<!-- JDBC 연결(DataSource) -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="${driver}"/>
		<property name="url" value="${url}"/>
		<property name="username" value="${username}"/>
		<property name="password" value="${password}"/>
	</bean>
	<!-- db.properties 파일 연결 -->
	<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	    <property name="locations" value="/WEB-INF/mybatis/db.properties"/>
	</bean>
	
	<context:component-scan base-package="kr.bit.model" />	
	
</beans>
  • 그리고 컴포넌트 스캔 지정한 MemberDAO에 어노테이션 추가. 이렇게 해주면 Spring Container에 객체가 생성된다.
@Repository
public class MemberDAO {
	...
}

## DI (Dependency Injection) 방법 (의존성 주입 방법).

  • 스프링의 핵심 기술.

1. @Autowried

  • Spring Container에 가서 Autowied 걸린 MemberDAO를 찾아서 dao에 연결해주겠다.
@Autowired
	private MemberDAO dao;

2. @Inject

## MemberDAO 개선

  • @Autowried 사용하여 개선 진행
package kr.bit.model;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MemberDAO {
	
	@Autowired
	private SqlSessionFactory sqlSessionFactory;	// DB를 연결하고 있는 객체들이 존재.
	
	// 회원 리스트 조회 기능
	public List<MemberVO> memberList() {
		// SqlSession 은 Connection + Statement 의 기능을 합쳐 놓은 것.
		SqlSession session = sqlSessionFactory.openSession();
		List<MemberVO> list = session.selectList("memberList");		// mapper와 연결 ""에는 id이름 적기 일반적으로 해당 매서드 이름적음.
		session.close();	// 연결 종료(반납)
		return list;
	}
	
	// 회원 가입 기능
	public int memberInsert(MemberVO vo) {
		SqlSession session = sqlSessionFactory.openSession();
		int cnt = session.insert("memberInsert", vo);
		session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
		session.close();	// 연결 종료(반납)
		return cnt;
	}
	
	// 회원 삭제 기능
	public int memberDelete(int num) {
		SqlSession session = sqlSessionFactory.openSession();
		int cnt = session.delete("memberDelete", num);
		session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
		session.close();	// 연결 종료(반납)
		return cnt;
	}
	
	// 회원 상세보기
	public MemberVO memberContent(int num) {
		SqlSession session = sqlSessionFactory.openSession();
		MemberVO vo = session.selectOne("memberContent", num);
		session.close();	// 연결 종료(반납)
		return vo;
	}
	
	// 회원 수정하기
	public int memberUpdate(MemberVO vo) {
		SqlSession session = sqlSessionFactory.openSession();
		int cnt = session.update("memberUpdate", vo);
		session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
		session.close();	// 연결 종료(반납)
		return cnt;
	}
}

## Model

  • 객체 바인딩을 하기 위해 스프링이 제공해주는 클래스.
  • HttpServletRequest 객체 == Model
@RequestMapping("/memberList.do")
public String memberList(Model model) {
  List<MemberVO> list = dao.memberList();
  // 객체 바인딩.
  model.addAttribute("list", list);	
  return "memberList";
}

 

# Spring WEB MVC_01버전_08 Spring WEB MVC를 이용한 회원관리

## 스프링 한글처리 (한글 깨짐 방지)

  • 요청이 DispatcherServlet으로 가기 전. 필터를 거치도록 하여 한글 깨짐 방지 처리.
  • 아래 코드를 web.xml에 추가.
<!-- Character Encoding -->
<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>

## 회원가입 기능 작업

  • MemberVO의 경우 Default 생성자에 의해서 내부적으로 vo = new MemberVO( ); 만들어진다. 그렇기 때문에 MemberVO에 public MemberVO() { } 가 존재해야 한다. 그렇지 않으면 에러 발생. (스프링에서 중요한 부분.)
@RequestMapping("/memberInsert.do")
public String memberInsert(MemberVO vo) {
  int cnt = dao.memberInsert(vo);

  return "redirect:/memberList.do";
}

## 회원 삭제 기능 작업

  • 넘어오는 변수를 다른이름으로 받으려면 @RequestParam("num") int su 사용
@RequestMapping("/memberDelete.do")
public String memberDelete(int num) {	// 넘어오는 변수를 다른이름으로 받으려면 @RequestParam("num") int su 사용
  int cnt = dao.memberDelete(num);

  return "redirect:/memberList.do";
}

## 회원 상세정보 보기 기능 작업

@RequestMapping("/memberContent.do")
public String memberContent(int num, Model model) {
  MemberVO vo = dao.memberContent(num);
  // 객체 바인딩
  model.addAttribute("vo", vo);

  return "memberContent";
}

## 회원 정보 수정하기 기능 작업

@RequestMapping("/memberUpdate.do")
public String memberUpdate(MemberVO vo) {
  int cnt = dao.memberUpdate(vo);

  return "redirect:/memberList.do";
}
반응형

+ Recent posts