spring legecy MVC프로젝트 만들기
new-other를 클릭한 후 spring을 검색, spring legecy 프로젝트 선택
next 선택 후 spring MVC Project 선택. 프로젝트이름은 아무렇게나 지으면 된다.
이 후 project setting 창에서는 패키지를 3단까지 쓰면 된다. 여기서 작성한 패키지에
HomeController가 위치하게 된다. 적당히 com.study.home으로 작성하자.
com.study.home에 HomeController가 있는 것을 확인할 수 있다.
프로젝트 세팅
1. 프로젝트 properties
spring legecy프로젝트는 기본적으로 빌드를 Maven으로 한다. Maven은 빌드된 파일을 배포할 때 jre가 아닌 jdk를
필요로 한다. 그래서 프로젝트 java build-path에는 jre가 아닌 jdk가 있어야 한다.
프로젝트 우클릭-properties- Java-Build-path에서 기존의 JRE System Library가 jre로 되어있다면 jdk로 바꿔주자.(1.8로)
이번엔 properties-Project Facets에 가서
Dynamic Web Module은 3.1, Java는 1.8, Javascript는 1.0으로 하고 체크해주자.
그리고 오른쪽의 Runtimes에서 Apache Tomcat 9.0 체크하자.
이상을 다 끝냈으면 Apply and Close를 누러 설정을 저장하자.
2. pom.xml
pom.xml은 메이븐설정으로 메이븐은 pom.xml에 명시 된 dependency가 현재 프로젝트 라이브러리에 있는지
확인한 후 없다면 mvn repository에서 해당 라이브러리를 다운받아 프로젝트 라이브러리에 추가한다.
다음은 기본 게시판을 만드는데 필요한 lib를 위해 pom.xml이다. 만들어진 프로젝트에 복사하자.
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 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>home</artifactId>
<name>study4_1</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.8</java-version>
<org.springframework-version>4.3.28.RELEASE</org.springframework-version>
<org.aspectj-version>1.9.6</org.aspectj-version>
<org.slf4j-version>1.7.30</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- spring ORM : 스프링에서 DB관련 설정하는데 필요한 것들 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- aop할려면 jrt+ weaver tools 필요한데 아직 안하니까.. -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<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.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Apache 및 사용자가 추가한 거 -->
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.8.1</version>
</dependency>
<!-- jstl은 위에 받았으니까 패스 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.6.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle.database.nls/orai18n -->
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>19.6.0.0</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
3. web.xml
Project Facet에서 Dynamic Web module을 3.1로 바꿔줬기 때문에 web.xml의 DTD도 3.1로 바꿔준다.
Spring 프로젝트가 처리하는 과정에서의 encoding을 전부 UTF-8로 해줄거다.
또한 스프링에서 제공하는 파일들의 설정파일 위치를 /WEB-INF/classes/spring 폴더로 지정하자.
그리고 spring 설정파일의 이름을 바꿀 것이다. 이를 위해 web.xml을 다음과 같이 작성하자.(복사하자)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>encoding</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- The definition of the Root Spring Container shared by all Servlets
and Filters -->
<!-- 전체 컨테이너 파라미터 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/context-*.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Processes application requests -->
<!-- init-param은 이 Servlet안에서만 쓰이는 파라미터 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/mvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
web.xml에서 작성한대로 스프링 설정파일을 위치시켜야 한다.
프로젝트 생성 시 처음 생성되는 spring설정파일들이다.
servlet-context.xml ===> mvc-servlet.xml로,
root-context.xml ===> context-main.xml로 변경해준다.
이후 java Resource - src/main/resources 우클릭 new other 후 folder를 생성해준다. 폴더의 이름은 spring.
이 폴더에다가 아까 이름을 변경한 mvc-servlet.xml, context-main.xml을 이동시킨다.
WEB-INF/spring 폴더는 이제 필요없으므로 삭제한다.
4. mvc-servlet.xml , context-main.xml
mvc-servlet.xml
com.study의 하위패키지를 스캔. @Controller만 찾아서 빈등록하도록 설정,그 외에는 기본값.
아래 내용을 복사하자.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
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">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<!-- 이 태그만 있으면 HandlerMapping을 비롯한 여러가지 mvc에 필요한 설정들이 자동으로 세팅 (기본값)
annotation-driven태그 안에 내용을 하나하나 다 써도 됩니다. 80줄정도-->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- 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>
<!-- component-scan은 기본적으로 use-default-filter가 트루 일 때
@Controller,@Service,@Respoitory,@Component 등이 붙은 걸 빈으로 다 등록 (기본값도 true)
DS은 Presentation,Controller단 빈만 등록 -> @Controller만 가지도록
-->
<context:component-scan base-package="com.study" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans:beans>
context-main.xml
com.study의 하위패키즈를 스캔해서 @Controller을 제외한 몇 가지 @을 빈으로 등록하자.
또 mybatis 관련 설정도 하자. 이 때 mybatis 설정 값을 직접 입력하지 않고 properties를 이용해
입력하도록 properties에 관한 빈도 추가하자.
아래내용을 복사한다.
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- ContextLoaderListenr, 프로젝트 전체에서 공유되는 빈들 관리 Buisness, Persistence layer의
빈들을 가지고 있도록 설정 =>@Controller 제외하고 전부입니다. -->
<context:component-scan base-package="com.study"
use-default-filters="true">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- properties파일 읽은 프로퍼티 객체, DB말고도 여러가지 작성할 거라 main에 빈등록 -->
<util:properties id="util"
location="/WEB-INF/classes/spring/appconfig.properties" />
<!-- ContextLoaderListenr 빈 중 DB관련 빈들 등록 -->
<!-- pdf 8페이지 , commons.dbcp대신 commons.dbcp2, name=" driverClassName " 띄어쓰기
주의 -->
<bean id="dataSource"
class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="#{util['jdbc.driverClassName']}" />
<property name="url" value="#{util['jdbc.url']}" />
<property name="username" value="#{util['jdbc.username']}" />
<property name="password" value="#{util['jdbc.password']}" />
<property name="defaultAutoCommit"
value="#{util['jdbc.defaultAutoCommit']}" />
</bean>
<!-- SqlSession setup for MyBatis Database Layer -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="/WEB-INF/classes/mybatis/mybatis-config.xml" />
<property name="mapperLocations"
value="/WEB-INF/classes/mybatis/mapper/*.xml" />
</bean>
<mybatis-spring:scan base-package="com.study"
annotation="org.apache.ibatis.annotations.Mapper" />
</beans>
mybatis 설정값에 관한 appconfig.properties를 만들자.
spring 폴더 우클릭-new-other file 선택 후 이름을 appconfig.properties라고 짓자.
appconifg를 다음과 같이 작성하자.
# appconfig.properties
# file encoding is UTF-8
# JDBC information
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.username=jsp
jdbc.password=oracle
jdbc.defaultAutoCommit=true
jdbc.maxTotal=4
jdbc.minIdle=4
jdbc.validationQuery=SELECT 1 FROM dual
5. mybatis 파일들
context-main.xml에서 기입한 mybatis 설정대로 mybatis 관련 파일을 만들면 된다.
src/main/resource폴더밑에 mybatis폴더를 만들고
우클릭 new-other-xml File을 선택한다. 파일이름은 mybatis-config.xml로 한다.
mybatis-config.xml 파일 내용은 다음과 같다.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
이번엔 mybatis 폴더 안에 또 mapper라는 폴더를 만들자.
(이클립스에 따라 폴더안에 폴더가 mybatis.mapper 형태로 보일수도
mybatis/mapper 형태로 보일수도 있다. 상관없다. 중요한건 mybatis폴더안에 mapper 폴더를 만드는 거다.)
그리고 mybatis/mapper 폴더안에 new-other-mybatis XML Mapper파일을 하나 만들고 freeBoard.xml이라 하자.
(freeBoard.xml 내용은 나중에 작성한다)
그 다음으로 DB의 데이터를 담을 FreeBoardVO를 만들자. 패키지는 com.study.free.vo이다.
FreeBoardVO.java
package com.study.free.vo;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
public class FreeBoardVO {
private int boNo; /*글 번호*/
private String boTitle; /*글 제목*/
private String boCategory; /*글 분류 코드*/
private String boWriter; /*작성자명*/
private String boPass; /*비밀번호*/
private String boContent; /*글 내용*/
private int boHit; /*조회수*/
private String boRegDate; /*등록 일자*/
private String boModDate; /*수정 일자*/
private String boDelYn; /*삭제 여부*/
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
public int getBoNo() {
return boNo;
}
public void setBoNo(int boNo) {
this.boNo = boNo;
}
public String getBoTitle() {
return boTitle;
}
public void setBoTitle(String boTitle) {
this.boTitle = boTitle;
}
public String getBoCategory() {
return boCategory;
}
public void setBoCategory(String boCategory) {
this.boCategory = boCategory;
}
public String getBoWriter() {
return boWriter;
}
public void setBoWriter(String boWriter) {
this.boWriter = boWriter;
}
public String getBoPass() {
return boPass;
}
public void setBoPass(String boPass) {
this.boPass = boPass;
}
public String getBoContent() {
return boContent;
}
public void setBoContent(String boContent) {
this.boContent = boContent;
}
public int getBoHit() {
return boHit;
}
public void setBoHit(int boHit) {
this.boHit = boHit;
}
public String getBoRegDate() {
return boRegDate;
}
public void setBoRegDate(String boRegDate) {
this.boRegDate = boRegDate;
}
public String getBoModDate() {
return boModDate;
}
public void setBoModDate(String boModDate) {
this.boModDate = boModDate;
}
public String getBoDelYn() {
return boDelYn;
}
public void setBoDelYn(String boDelYn) {
this.boDelYn = boDelYn;
}
}
여기까지 했으면 모든 준비는 끝났다.
(여기까지의 과정은 구글드라이브 anything_start 압축파일에 있다. import하자)
--------------------------------------------------------------------------------------------------------------------------------
이제 요청을 처리할 Controller와
DB에 연결해서 쿼리문을 수행할 InterfaceDao와 mybatis-mapper파일(freeBoard.xml : 이미 만들어 놨다 내용은없지만),
그리고 화면을 보여줄 JSP만 만들면 된다.
(간단한 게시판을 만드는 버전에서 Service는 필요없다.)
com.study.free.dao에 interface를 만들자. 중요한건 @Mapper를 꼭 적용하자.
IFreeBoardDao.java
package com.study.free.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.study.free.vo.FreeBoardVO;
@Mapper
public interface IFreeBoardDao {
public List<FreeBoardVO> getBoardList();
}
이제 IFreeBoardDao 대신 쿼리문을 실행할 mybatis-mapper파일인 freeBoard.xml을 작성하자.
먼저 namespace에 com.study.free.dao.IFreeBoard를 입력해 IFreeBoardDao의 mapper라는걸 명시해주자.
그리고 getBoardList()메소드에 대한 select쿼리문을 작성한다.
freeBoard.xml
<?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">
<mapper namespace="com.study.free.dao.IFreeBoardDao">
<select id="getBoardList" resultType="com.study.free.vo.FreeBoardVO">
SELECT bo_no
, bo_title , bo_category, bo_writer
, bo_pass, bo_content, bo_hit
, to_char(bo_reg_date,'YYYY-MM-DD') AS bo_reg_date
, to_char(bo_mod_date,'YYYY-MM-DD') AS bo_mod_date
, bo_del_yn
FROM free_board
WHERE bo_del_yn='N'
ORDER BY bo_no desc
</select>
</mapper>
이제 DB관련부분을 끝났다. 요청을 받아 처리할 Controller를 만들자.
com.study.free.web 패키지에 FreeController를 만들자.
꼭 @Controller를 붙이고 IfreeBoardDao에 @Inject하자.
그리고 각각의 요청을 처리할 @RequestMapping이 붙은 메소드를 작성하면 된다.
@RequestMapping의 url은 마음대로 해도 되지만 "/free/freeList.wow"로 하겠다.
FreeController
package com.study.free.web;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.study.free.dao.IFreeBoardDao;
import com.study.free.vo.FreeBoardVO;
@Controller
public class FreeController {
@Inject
IFreeBoardDao freeBoardDao;
@RequestMapping("/free/freeList.wow")
public String freeList(Model model) {
List<FreeBoardVO> freeBoardList=freeBoardDao.getBoardList();
model.addAttribute("freeBoardList",freeBoardList);
return "free/freeList";
}
}
마지막으로 freeList.jsp를 만들면 된다. Controller에서 "free/freeList"로 return했으므로
"/WEB-INF/views/free/freeList.jsp" 에 위치하는 freeList.jsp를 만들자.
model에 담긴 List<FreeBoardVO>를 보여주기 위해 테이블을 만들고
<tbody>안의 <tr>태그가 반복되니까 <c:forEach>를 써주자.
또 제목을 클릭하면 해당 글 상세페이지로 가야되니까 <a>태그에 href속성에
파라미터로 boNo=${freeBoard.boNo}를 준다.
또 list에서 글쓰기 버튼 하나 만들어주자.
freeList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<a href="freeForm.wow">글쓰기</a> <br>
<table border="1">
<thead>
<tr>
<td>글번호</td>
<td>제목</td>
<td>글 분류</td>
<td>작성자</td>
<td>등록일</td>
</tr>
</thead>
<tbody>
<c:forEach items="${freeBoardList }" var="freeBoard">
<tr>
<td>${freeBoard.boNo }</td>
<td><a href="freeView.wow?boNo=${freeBoard.boNo }"> ${freeBoard.boTitle } </a> </td>
<td>${freeBoard.boCategory }</td>
<td>${freeBoard.boWriter }</td>
<td>${freeBoard.boRegDate }</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
지금까지 잘 따라했다면 파일들은 다음과 같습니다.
이제 프로젝트를 서버에 올리고 localhost:8080/home/free/freeList.wow로 요청해봅시다.
(※스프링 프로젝트를 만들면 기본적으로 contextPath는 'home'으로 설정되어 있습니다.)
다음과 같이 화면이 잘 나온다면 됩니다.
-----------------------------------------------------------------------------------------------------------------------------------
이제 남은건 List뿐만 아니라 나머지 화면들도 만들어 주기만 하면 됩니다.
화면 하나당 우리가 할 일은 다음과 같습니다.
- FreeController에 메소드 추가, RequestMapping붙이고 안에 내용 작성( jsp에서의 요청에 맞는 url값 처리)
- IFreeBoardDao에 메소드추가
- freeBoard.xml에 메소드 추가 후 쿼리문 작성
- /WEB-INF/views/free 폴더에 jsp 작성 (form태그 및 a태그를 이동하고 싶은 페이지에 맞게 작성)
기본적인 CRUD를 구성은 다음과 같습니다. 원래는 비밀번호가지고 여러가지를 했지만
기본CRUD에서는 아무조건없이 다 업데이트되고 다 볼 수 있습니다.
- List: 테이블에서 여러개의 데이터 보여주기 (del_yn이 'N'인 것만 보여줍시다.)
- view: 테이블에서 where조건절로 1개 데이터 자세히 보여주기. 사용자 입력x only 구경
- edit : 테이블에서 where조건절로 1개 데이터 자세히 보여주기, 사용자가 입력 가능. form태그 있음
- modify : edit(form태그)에서 넘어온 파라미터를 DB에서 update
- delete : edit에서 넘어온 파라미터(글번호 있음)가지고 DB에서 *_del_yn을 'Y'로 업데이트
- form : form태그에서 사용자가 여러 데이터 입력
- regist : form에서 온 데이터가지고 DB에 insert
완성된 파일들은 다음과 같습니다.
IFreeBoardDao
package com.study.free.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.study.free.vo.FreeBoardVO;
@Mapper
public interface IFreeBoardDao {
public List<FreeBoardVO> getBoardList();
public FreeBoardVO getBoard(int boNo);
public int updateBoard(FreeBoardVO freeBoard);
public int deleteBoard(FreeBoardVO freeBoard);
public int insertBoard(FreeBoardVO freeBoard);
}
freeBoard.xml
<?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">
<mapper namespace="com.study.free.dao.IFreeBoardDao">
<select id="getBoardList" resultType="com.study.free.vo.FreeBoardVO">
SELECT bo_no
, bo_title , bo_category, bo_writer
, bo_pass, bo_content,bo_hit
, to_char(bo_reg_date,'YYYY-MM-DD') AS bo_reg_date
, to_char(bo_mod_date,'YYYY-MM-DD') AS bo_mod_date
, bo_del_yn
FROM free_board
WHERE bo_del_yn='N'
ORDER BY bo_no desc
</select>
<select id="getBoard" resultType="com.study.free.vo.FreeBoardVO" parameterType="int">
SELECT bo_no
, bo_title , bo_category, bo_writer
, bo_pass, bo_content, bo_hit
, to_char(bo_reg_date,'YYYY-MM-DD') AS bo_reg_date
, to_char(bo_mod_date,'YYYY-MM-DD') AS bo_mod_date
, bo_del_yn
FROM free_board
WHERE bo_no=#{boNo}
</select>
<update id="updateBoard"
parameterType="com.study.free.vo.FreeBoardVO">
UPDATE free_board SET
bo_title=#{boTitle}
,bo_category=#{boCategory}
,bo_content=#{boContent}
,bo_mod_date=sysdate
WHERE bo_no=#{boNo}
</update>
<update id="deleteBoard"
parameterType="com.study.free.vo.FreeBoardVO">
UPDATE free_board SET
bo_del_yn='Y'
WHERE bo_no=#{boNo}
</update>
<insert id="insertBoard"
parameterType="com.study.free.vo.FreeBoardVO">
INSERT INTO free_board (
bo_no, bo_title, bo_category
, bo_writer , bo_pass, bo_content
, bo_hit , bo_reg_date
, bo_mod_date , bo_del_yn
) VALUES(
seq_free_board.nextval,#{boTitle} ,
#{boCategory},
#{boWriter}, #{boPass}, #{boContent},
0, sysdate,
null, 'N'
)
</insert>
</mapper>
FreeController
package com.study.free.web;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.study.free.dao.IFreeBoardDao;
import com.study.free.vo.FreeBoardVO;
@Controller
public class FreeController {
@Inject
IFreeBoardDao freeBoardDao;
@RequestMapping("/free/freeList.wow")
public String freeList(Model model) {
List<FreeBoardVO> freeBoardList=freeBoardDao.getBoardList();
model.addAttribute("freeBoardList",freeBoardList);
return "free/freeList";
}
@RequestMapping("/free/freeView.wow")
public String freeView(Model model,int boNo) {
FreeBoardVO freeBoard=freeBoardDao.getBoard(boNo);
model.addAttribute("freeBoard",freeBoard);
return "free/freeView";
}
@RequestMapping("/free/freeEdit.wow")
public String freeEdit(Model model,int boNo) {
FreeBoardVO freeBoard=freeBoardDao.getBoard(boNo);
model.addAttribute("freeBoard",freeBoard);
return "free/freeEdit";
}
@RequestMapping("/free/freeModify.wow")
public String freeModify(@ModelAttribute("freeBoard")FreeBoardVO freeBoard) {
freeBoardDao.updateBoard(freeBoard);
return "free/freeModify";
}
@RequestMapping("/free/freeDelete.wow")
public String freeDelete(@ModelAttribute("freeBoard")FreeBoardVO freeBoard) {
freeBoardDao.deleteBoard(freeBoard);
return "free/freeDelete";
}
@RequestMapping("/free/freeForm.wow")
public String freeForm() {
return "free/freeForm";
}
@RequestMapping("/free/freeRegist.wow")
public String freeEdit(@ModelAttribute("freeBoard")FreeBoardVO freeBoard) {
freeBoardDao.insertBoard(freeBoard);
return "free/freeRegist";
}
}
freeList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<a href="freeForm.wow">글쓰기</a> <br>
<table border="1">
<thead>
<tr>
<td>글번호</td>
<td>제목</td>
<td>글 분류</td>
<td>작성자</td>
<td>등록일</td>
</tr>
</thead>
<tbody>
<c:forEach items="${freeBoardList }" var="freeBoard">
<tr>
<td>${freeBoard.boNo }</td>
<td><a href="freeView.wow?boNo=${freeBoard.boNo }"> ${freeBoard.boTitle } </a> </td>
<td>${freeBoard.boCategory }</td>
<td>${freeBoard.boWriter }</td>
<td>${freeBoard.boRegDate }</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
freeView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<table border="1">
<tr><td>글번호</td> <td>${freeBoard.boNo }</td></tr>
<tr><td>제목</td> <td>${freeBoard.boTitle }</td></tr>
<tr><td>분류</td> <td>${freeBoard.boCategory }</td></tr>
<tr><td>작성자</td> <td>${freeBoard.boWriter }</td></tr>
<tr><td>비밀번호</td> <td>${freeBoard.boPass }</td></tr>
<tr><td>내용</td> <td><textarea readonly="readonly" rows="5">${freeBoard.boContent }</textarea></td></tr>
<tr><td>등록일</td> <td>${freeBoard.boRegDate }</td></tr>
<tr><td>삭제여부</td> <td>${freeBoard.boDelYn }</td></tr>
<tr> <td> <a href="freeEdit.wow?boNo=${freeBoard.boNo }">수정</a></td></tr>
</table>
</body>
</html>
freeEdit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="freeModify.wow" method="post">
<table border="1">
<tr>
<th>글번호</th>
<td>${freeBoard.boNo }<input type="hidden" name="boNo"
value="${freeBoard.boNo }">
</td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="boTitle"
value="${freeBoard.boTitle }" required="required"></td>
</tr>
<tr>
<th>작성자</th>
<td>${freeBoard.boWriter }<input type="hidden" name="boWriter"
value="${freeBoard.boWriter }">
</td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="boPass" value=""
required="required"></td>
</tr>
<tr>
<th>분류</th>
<td><input type="text" name="boCategory"
value="${freeBoard.boCategory }"></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="10" name="boContent">${freeBoard.boContent } </textarea></td>
</tr>
<tr>
<th>최근등록일자</th>
<td>${freeBoard.boModDate eq null ? freeBoard.boRegDate : freeBoard.boModDate }
</td>
</tr>
<tr>
<td>
<button type="submit" > 수정</button>
<button type="submit" formaction="freeDelete.wow">삭제</button>
</td>
</tr>
</table>
</form>
</body>
</html>
freeModif.y.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
수정했음
</body>
</html>
freeDelete.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
삭제했음
</body>
</html>
freeForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="freeRegist.wow" method="post">
<table border="1">
<tr>
<th>제목</th>
<td><input type="text" name="boTitle" value="" required="required"></td>
</tr>
<tr>
<th>작성자</th>
<td><input type="text" name="boWriter" value=""></td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="boPass" value="" required="required"></td>
</tr>
<tr>
<th>분류</th>
<td><input type="text" name="boCategory" value=""></td>
</tr>
<tr>
<th>내용</th>
<td><textarea rows="10" name="boContent"> </textarea></td>
</tr>
<tr>
<td>
<button type="submit" > 등록</button>
</td>
</tr>
</table>
</form>
</body>
</html>
freeRegist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
등록함
</body>
</html>