Oracle 데이터베이스를 연동하는 Spring MVC Project
1. Oracle에 접속해서 샘플 데이터를 생성
2.SpringMVCProject 생성
- 프로젝트이름 : spring02202
- 패키지 이름 : com.gmail.hiwony7933
- Spring Lefacy Project - Spring MVC Project
3.pom.xml 파일에 의존성을 설정 (DB 연동할때 꼭 필요함)
1) java 버전 1.8, spring 버전 5.0.7 으로 변경
- pom.xml
<properties>
<java-version>1.6</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
2) 태그 바깥쪽에 아래 코드 추가
=> </properties> 밑에
<!-- 중앙 저장소 이외의 곳에서 라이브러리를 다운로드 받을 때 다운로드 받는 위치를 설정하는 태그 -->
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>
=> <dependencies> 안쪽에
<!-- 오라클 라이브러리 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
</dependency>
<!-- 스프링에서 데이터베이스를 사용할 때 설정 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- Spring-MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- lombok : DTO 편리하게 만드는 라이브러리 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<!-- 로그를 출력하기 위한 라이브러리 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<!-- ORM, 하이버네이트 사용을 위한 라이브러리 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.2.Final</version>
</dependency>
<!-- JSON 출력을 위한 라이브러리 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
4.web.xml(프로젝트 설정 파일) 파일에 작성
<!-- 스프링에서 파라미터 인코딩 설정 -->
<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>
5. 데이터베이스를 연동할 때는 하나의 행을 나타낼 DTO 클래스를 생성
- 기본패키지.domanin.item
- 변수를 만들 때 되도록이면 테이블에서 사용하는 컬럼이름과 일치시키는 것을 권장
mybatis - 자료형, 이름
hibernate - 자료형
@Data //lombok
public class Item {
private int teimdid;
private String itemname;
private int price;
private String description;
private String pictureurl;
}
6.MyBatis Mapper 인터페이스를 만들고 필요한 SQL을 생성
- 기본 패키지 .dao.ItemDao
public interface ItemDao {
//Item 테이블의 모든 데이터를 가져오는 메소드
@Select("select * from item")
public List<Item> allItem();
//Item 테이블에서 ItemId를 이용해서 데이터1개를 찾아오는 메소드
@Select("select * from item where itemid = #{itemid}")
public Item getItem(int itemid);
}
7.root-context.xml 파일에 MyBatis 연동을 위한 설정을 추가
- DataSoure : 데이터베이스 연동할 때 필수
- SqlSessionFactoryBeam, MapperFactoryBean : 인터페이스를 이용한 MyBatis 사용하는 경우 생성
- context, tx 네임스페이스 설정
<!-- 애플리케이션 모든 곳에서 사용할 bean을 생성 -->
<!-- 스프링에서 데이터베이스를 사용할 때 접속 정보를 저장할 bean -->
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<!-- 데이터 베이스 종류 -->
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<!-- 데이터베이스 위치 : 데이터베이스 종류마다 작성법 다름 (검색필요) -->
<property name="url" value="jdbc:oracle:thin:@211.183.6.60:1521:xe"/>
<!-- 계정과 비밀번호 -->
<property name="username" value="user13" />
<property name="password" value="user13" />
</bean>
<!-- MyBaits를 인터페이스를 이용해서 사용할 때 필요한 Bean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"/> <!-- 맨위에 id와 같아야된다. -->
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="itemDao"> <!-- id : 이름 -->
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<property name="mapperInterface" value="com.gmail.hiwony7933.dao.ItemDao"/> <!-- value : 위치 -->
</bean>
<!-- 어노테이션 설정을 사용할 수 있도록 해주는 태그 -->
<context:annotation-config/>
<!-- bean 자동생성 패키지 등록 -->
<context:component-scan base-package="db"/>
<!-- MyBaits 트랜잭션 적용을 위한 클래스의 객체 생성 -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 트랜잭션을 어노테이션으로 설정하기 위한설정 -->
<tx:annotation-driven transaction-manager = "transactionManager"/>
8.Service 인터페이스를 만들고 전체 데이터를 전부 가져오는 메소드를 선언
- 기본패키지.service.ItemService
- Service 인터페이스의 메소드는 기본적으로 HttpServletRequest는 매개변수로 무조건 갖도록 만든다.
public interface ItemService {
// 전체 데이터를 가져오는 메소드
public List<Item> allItem(HttpServletRequest request);
}
9.Service 인터페이스를 Implements 한 Service 클래스를 만들고 메소드를 구현
- 기본패키지.service.ItemServiceImpl
//Bean을 자동생성해주는 어노테이션
@Service
public class ItemServiceImpl implements ItemService {
// ItemDao 타입의 Bean이 있으면 자동으로 주입시켜주는 어노테이션
@Autowired
private ItemDao itemDao;
@Override
public List<Item> allItem(HttpServletRequest request) {
// Dao 메소드에 파라미터가 없는 경우는 Dao 메소드를 호출해서 리턴
return itemDao.allItem();
}
}
10.HomeController 메소드 추가
@Controller
public class HomeController {
// 1. Service 객체를 주입
@Autowired
private ItemService itemService;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(HttpServletRequest request, Model model) {
// 2. 서비스 메소드 호출
List<Item> list = itemService.allItem(request);
// 3. 데이터 저장
model.addAttribute("list", list);
return "home";
}
}
11.webapp/WEB-INF/views 디렉토리의 homs.jsp를 삭제하고 새로 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- if 나 forEach를 사용하기 위한 태그 라이브러리를 설정 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>목록 출력</title>
</head>
<body>
<h2 align='center'>상품목록</h2>
<table border='1' align='center'>
<tr class='header'>
<th width='80'>상품ID</th>
<th width='160'>상품이름</th>
<th width='80'>가격</th>
</tr>
<c:forEach items="${list}" var="item">
<tr class="record">
<td align='center'>${item.itemid}</td>
<td> ${item.itemname }</td>
<td align='right'>${item.price }원 </td>
</tr>
</c:forEach>
</table>
</body>
</html>
12.webapp(WebContent) 디렉토리에 css 디렉토리를 생성하고 item.css 파일을 만들어서 작성
.header{
background:#C98FED;
}
.record{
background:#EDEDED;
}
13.home.jsp 파일에 css 파일의 링크 설정
<link rel="stylesheet" href="./css/item.css">
14.mvc:default-servlet-handler
spring 프로젝트에서 servlet의 url-pattern을
/
나/*
로 하는 경우 모든 요청을 Controller가 처리할려고 한다.- css나 js 등의 확장자를 가진 링크도 Controller가 처리할려고 한다.
- 이런 이유로 404 에러가 발생한다.
css나 js등의 확장자를 가진 파일의 링크를 사용하고자 할 때는 servlet-context.xml 파일에 태그를 추가해서 Controller가 처리 할 수 없는 요청은 WAS가 대신 처리하도록 해줘야 합니다.
- 이 설정도 필수 입니다.
<!-- Controller가 처리하지 못하는 요청은 WAS가 처리하도록 해주는 요청 -->
<default-servlet-handler/>
16.상세보기 구현을 위해서 home.jsp 파일에서 이름을 출력하는 부분을 수정
<!-- 파라미터로 기본키의 값이 itemid를 넘겨줍니다. -->
<a href="detail?itemid=${item.itemid}"> ${item.itemname}</a>
17. Service 인터페이스에 상세보기를 위한 메소드를 선언
// 데이터 한개를 가져오는 메소드
public Item getItem (HttpServletRequest request);
18. ItemServiceImpl 클래스에 상세보기를 위한 메소드를 구현
@Override
public Item getItem(HttpServletRequest request) {
// 파라미터 읽어오기
String itemid = request.getParameter("itemid");
// 파라미터를 정수로 변환해서 Dao 메소드를 호출
return itemDao.getItem(Integer.parseInt(itemid));
}
19.HomeController 클래스에 detail 요청을 처리하는 메소드를 생성
@RequestMapping(value = "/detail", method = RequestMethod.GET)
public String detail(HttpServletRequest request, Model model) {
// 서비스 메소드 호출
Item item = itemService.getItem(request);
// 데이터 저장
model.addAttribute("item", item);
return "detail";
}
20.views 디렉토리에 detail.jsp 파일을 만들고 출력하는 코드를 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${item.itemname}</title>
<link rel="stylesheet" href="./css/item.css">
</head>
<body>
<div align="center">
<h2>상품 상세보기</h2>
<table border="1">
<tr>
<td><img src="./img/${item.pictureurl }" /></td>
<td>
<table>
<tr height="50">
<td width="80">상품명</td>
<th width="160">${item.itemname }</th>
</tr>
<tr height="50">
<td width="80">가격</td>
<th width="160">${item.price }</th>
</tr>
<tr height="50">
<td width="80">효능</td>
<th width="160">${item.description}</th>
</tr>
<tr height="50">
<td colspan="2" align="center"><a href='./'>O.목록보기 </a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</body>
</html>