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

image-20200220150621038

//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>&nbsp; &nbsp; ${item.itemname }</td>
                <td align='right'>${item.price }원&nbsp;&nbsp;</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>

21.이미지를 다운로드 받아서 압축해제한후 webapp 디렉토리에 복사

https://ggangpae1.tistory.com/307?category=840479

results matching ""

    No results matching ""