방명록 만들기 

    1. Spring JDBC 를 이용한 Dao 작성
    2. Controller + Service + Dao
    3. 트랜잭션 처리
    4. Spring MVC에서 폼 값 입력받기
    5. Spring MVC에서 redirect하기
    6. Controller에서 jsp에게 전달한 값을 JSTL과 EL을 이용해 출력하기

    방명록 요구사항 1

     

    방명록 정보는 guestbook 테이블에 저장된다.

    id는 자동으로 입력된다.

    id, 이름, 내용, 등록일을 저장한다.


    방명록 요구사항 2

     

    1. http://localhost:8080/guestbook/ 을 요청하면 자동으로 /guestbook/list 로 리다이렉팅 한다.
    2. 방명록이 없으면 건수는 0이 나오고 아래에 방명록을 입력하는 폼이 보여진다.


    방명록 요구사항3

     

    1. 이름과 내용을 입력하고, 등록버튼을 누르면 /guestbook/write URL로 입력한 값을 전달하여 저장한다.
    2. 값이 저장된 이후에는 /guestbook/list로 리다이렉트 된다.


    방명록 요구사항4

     

    1. 입력한 한건의 정보가 보여진다. 
    2. 방명록 내용과 폼 사이의 숫자는 방명록 페이지 링크, 방명록 5건당 1페이지로 설정한다.


    방명록 요구사항 5

     

    1. 방명록이 6건이 입력되자 아래 페이지 수가 2건 보여진다. 1페이지를 누르면 /guestbook/list? start=0 을 요청하고, 2페이지를 누르면 /guestbook/list? start=5 를 요청하게 된다.
    2. /guestbook/list 는/guestbook/list? start=0 과 결과가 같다.


    방명록 요구사항 6

     

    방명록에 글을 쓰거나. 방명록의 글을 삭제할 때는 Log테이블에 클라이언트 IP주소,

    등록(삭제) 시간, 등록/삭제(method칼럼) 정보를 데이터 베이스에 저장한다.

    사용하는 테이블은 log이다.

    id는 자동으로 입력되도록 한다.


    guestbook/pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>kr.or.connect</groupId>
      <artifactId>mvcexam</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>mvcexam Maven Webapp</name>
      <url>http://www.example.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      	<spring.version>4.3.5.RELEASE</spring.version>
      </properties>
    	
    
      <dependencies>
      		<dependency>
        		<groupId>org.springframework</groupId>
        		<artifactId>spring-tx</artifactId>
        		<version>${spring.version}</version>
    		</dependency>
      		
      		
      		<dependency>
       			 <groupId>org.springframework</groupId>
       			 <artifactId>spring-jdbc</artifactId>
        		<version>${spring.version}</version>
    		</dependency>
      		
      		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    			<version>${spring.version}</version>
    		</dependency>
    		<dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
    			<version>${spring.version}</version>
    		</dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.6</version>
    </dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.8.6</version>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.45</version>
    </dependency>
    
    		<dependency>
       		    <groupId>org.apache.commons</groupId>
        		<artifactId>commons-dbcp2</artifactId>
        		<version>2.1.1</version>
    		</dependency>
    
    
    
      
         <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
         </dependency>
        
         <dependency>
    		    <groupId>javax.servlet</groupId>
    		    <artifactId>javax.servlet-api</artifactId>
    		    <version>3.1.0</version>
    		    <scope>provided</scope>
    	 </dependency>
    		
        
         <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>javax.servlet.jsp-api</artifactId>
                <version>2.3.1</version>
                <scope>provided</scope>
            </dependency>
        
        <dependency>
        		<groupId>jstl</groupId>
        		<artifactId>jstl</artifactId>
        		<version>1.2</version>
    	</dependency>
    
      </dependencies>
    		
    
    
      <build>
        <finalName>mvcexam</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
                <plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>3.6.1</version>
    				<configuration>
    					<source>1.7</source>
    					<target>1.7</target>
    				</configuration>
    			</plugin>
    		
           
          </plugins>
        </pluginManagement>
      </build>
    </project>
    
    

     

    WebMvcContextConfiguration.java

    package kr.or.connect.guestbook.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    
    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = { "kr.or.connect.guestbook.controller" })
    public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter{
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
            registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
            registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
        }
     
        // default servlet handler를 사용하게 합니다.
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
       
        @Override
        public void addViewControllers(final ViewControllerRegistry registry) {
        		System.out.println("addViewControllers가 호출됩니다. ");
            registry.addViewController("/").setViewName("index");
        }
        
        @Bean
        public InternalResourceViewResolver getInternalResourceViewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/views/");
            resolver.setSuffix(".jsp");
            return resolver;
        }
    }
     

     

    DBConfig.java

    package kr.or.connect.guestbook.config;
    
    import javax.sql.DataSource;
    
    import org.apache.commons.dbcp2.BasicDataSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.transaction.annotation.TransactionManagementConfigurer;
    
    @Configuration
    @EnableTransactionManagement
    public class DBConfig implements TransactionManagementConfigurer {
    	private String driverClassName = "com.mysql.jdbc.Driver";
    
    	private String url = "jdbc:mysql://localhost:3306/connectdb?useUnicode=true&characterEncoding=utf8";
    
    	private String username = "connectuser";
    
    	private String password = "connect123!@#";
    
    	@Bean
    	public DataSource dataSource() {
    		BasicDataSource dataSource = new BasicDataSource();
    		dataSource.setDriverClassName(driverClassName);
    		dataSource.setUrl(url);
    		dataSource.setUsername(username);
    		dataSource.setPassword(password);
    		return dataSource;
    	}
    
    	@Override
    	public PlatformTransactionManager annotationDrivenTransactionManager() {
    		return transactionManger();
    	}
    
    	@Bean
    	public PlatformTransactionManager transactionManger() {
    		return new DataSourceTransactionManager(dataSource());
    	}
    }

     

    ApplicationConfig.java

    package kr.or.connect.guestbook.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    
    @Configuration
    @ComponentScan(basePackages = { "kr.or.connect.guestbook.dao",  "kr.or.connect.guestbook.service"})
    @Import({ DBConfig.class })
    public class ApplicationConfig {
    
    }

     

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app>
    
    	<display-name>Spring JavaConfig Sample</display-name>
    	<context-param>
    		<param-name>contextClass</param-name>
    		<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    		</param-value>
    	</context-param>
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>kr.or.connect.guestbook.config.ApplicationConfig
    		</param-value>
    	</context-param>
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener
    		</listener-class>
    	</listener>
    
    	<servlet>
    		<servlet-name>mvc</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet
    		</servlet-class>
    		<init-param>
    			<param-name>contextClass</param-name>
    			<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    			</param-value>
    		</init-param>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>kr.or.connect.guestbook.config.WebMvcContextConfiguration
    			</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>mvc</servlet-name>
    		<url-pattern>/</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>
    </web-app>

    Listener 어떤 특정한 이벤트가 일어났을 때 동작하는 것

    contextLoaderListener 

    - run on server 하면 context가 로딩되는 이벤트가 일어날때 클래스를 실행한다.

    context param 을 참고하게 된다. -> applicationConfig 읽어들여서 실행을 한다.

     

    filter 요청이 수행되지전 응답이 나가기 전에 한번식 걸쳐서 수행을 할 수 있도록 해주는 부분

    한글 인코딩 하기 위해

     

     

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <% 
    	response.sendRedirect("list");
    %>

    여기 까지 실행하면 /list 로 redirect 되고 404에러


    레이어드 아키텍처(Layered Architecture)실습 (Spring MVC 종합 실습) 2 에서 이어서

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading