Spring/Spring 미니 프로젝트

Spring 게시판 만들기 기초 -1

기발개발 2022. 2. 11. 15:25

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>