반응형

**Spring MVC Project

=>Spring Web Project

=>Legacy Project 에서 선택해서 생성 - 전자정부 프레임워크나 기업이 프레임워크에서 선택해서 만드는 프로젝트의 기본 모양으로 전자정부 프레임워크에서는 여기에 데이터베이스 연동하는 코드가 추가되어 있습니다.

=>spring mvc project android, iOS 프로젝트에서는 기본 패키지이름을 3level 이상으로 만들도록 강제합니다.

회사도메인을 역순으로 기재하고 프로젝트이름나 기술이름을 추가합니다.

회사도메인이 없을 때는 이메일 주소를 이용하는 것을 권장합니다.

 

 

kr.co.pk.springmvc

패키지 이름을 만들면 패키지의 3번째 부분이 도메인이 됩니다.

 

1.디렉토리 구조

=>src/main/java: 컴파일 되어야 하는 java 파일이 위치해야 하는 디렉토리

패키지가 생성되어 있고 그 안에 HomeController가 생성되어 있습니다.

패키지 안에 클래스를 만들 때 @Controller, @Service, @Repository, @Component를 붙이면 bean이 자동 생성되도록 설정되어 있습니다.

 

=>src/main/resources: 컴파일 할 필요가 없는 파일들이 위치하는 디렉토리

이 디렉토리와 java 디렉토리는 나중에 합쳐집니다.

이 디렉토리의 내용들은 컴파일하지 않습니다.

이 디렉토리에 만든 파일들은 java 디렉토리에 만들어도 되지만 java 디렉토리에 만드는 .java 파일은 이 디렉토리에 만들면 안됩니다.

여기에는 설정 파일들이 위치합니다.

 

=>src/test/java resources : 테스트 용 자바파일과 설정파일을 저장하는 디렉토리인데 이 디렉토리는 배포할 때 없어집니다.

이 디렉토리는 소스 차원에서만 존재합니다.

 

=>src/main/webapp: html, css, js, jsp 등 뷰와 관련된 파일들이 위치하는 디렉토리

이 디렉토리가 배포될 때는 WebContent 와 같은 역할

 

2.생성된 파일

1)web.xml

           <!-- 웹 애플리케이션이 시작되면 WEB-INF 디렉토리의

           applicatonContext.xml 파일의 내용을 읽어서 수행한다는 설정 -->

           <listener>

                       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

           </listener>

           <!-- applicationContext.xml 파일의 경로를 변경하는 설정 -->

           <context-param>

                       <param-name>contextConfigLocation</param-name>

                       <param-value>/WEB-INF/spring/root-context.xml</param-value>

           </context-param>

          

 

 

           <!-- / .jsp를 제외한 모든 요청

           .jsp를 제외한 모든 요청을 param-value에 설정된 파일에서 만드는

           Controller가 처리하도록 하는 설정

           FrontController의 역할을 수행하는 설정 파일의 경로를 설정-->

           <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/spring/appServlet/servlet-context.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>

 

2)root-context.xml

=>애플리케이션 내의 모든 곳에서 사용할 수 있는 bean을 생성

=>데이터베이스 연동하는 bean을 이 파일에서 생성

 

3)servlet-context.xml

           <!-- spring mvc 프로젝트에서 사용해야 하는 여러 설정을 한꺼번에 해주는 태그 -->

           <annotation-driven />

 

           <!-- location에 파일을 위치시키면 자동으로 캐싱이 되도록 해주는 태그 -->

           <resources mapping="/resources/**" location="/resources/" />

 

           <!-- Controller 가 리턴한 뷰 이름을 가지고 prefix를 앞에 붙이고

           suffix를 뒤에 추가해서 실제 출력할 뷰 파일을 선택하도록 해주는 태그 -->

           <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>

          

           <!-- 어노테이션이 붙은 클래스의 bean을 자동으로 생성해주는 패키지 설정 -->

           <context:component-scan base-package="com.pk.springmvc" />

          

4)HomeController

=>기본적으로 제공되는 Controller

@Controller

public class HomeController {

          

           private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

          

           // / 요청이 GET 방식으로 오면 처리하는 메소드 설정

          @RequestMapping(value = "/", method = RequestMethod.GET)

           public String home(Locale locale, Model model) {

                       //model attribute를 저장하면 request 객체에 저장됩니다.

                       //문자열을 리턴하면 이 문자열이 view 이름입니다.

                       // /(기본 요청)요청이 오면 serverTime이라는 attribute request에 저장해서

                       // home -> WEB-INF/views/home.jsp 로 포워딩합니다.

                       logger.info("Welcome home! The client locale is {}.", locale);

                       Date date = new Date();

                       DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

                      

                       String formattedDate = dateFormat.format(date);

                      

                       model.addAttribute("serverTime", formattedDate );                      

                       return "home";

           }

          

}

3.실행

=>프로젝트를 선택하고 [Run As] - [Run on Server]를 선택

=>처음 실행하는 경우에는 WAS를 선택해야 합니다.

 

4.pom.xml : Maven Project의 설정 파일

=>라이브러리 의존성이나 build 옵션을 설정하는 파일

=>properties: 자주 사용하는 버전을 이름으로 저장해놓은 설정

=>repositories: 중앙 저장소 이외의 곳에서 다운로드 받을 수 있도록 해주는 설정

=>dependencies: 다운로드 받아서 프로젝트에서 사용할 라이브러리를 설정

 

=>java spring 버전을 properties 태그에서 설정하고 외부 라이브러리를 사용해야 하는 경우가 생기면 repositories dependencies 태그에 설정

 

5.요청을 만들고 Controller를 이용해서 처리해서 결과를 보여주는 페이지 작성

1)home.jsp 파일을 지우고 새로 생성한 후 작성

<a href="display">jsp 출력</a><br/>

 

2)HomeController 클래스에 display 요청을 처리하는 메소드 추가

           //display라는 요청이 왔을 때 처리하는 메소드

           @RequestMapping(value="/display", method=RequestMethod.GET)

           public String display(Model model) {

                       String msg = "Spring MVC Project";

                       //데이터 저장 - request.setAttribute 와 동일

                       model.addAttribute("msg", msg);

                      

                       //출력할 View 이름을 설정

                       return "display";

           }

 

3)WEB-INF/views 라는 디렉토리에 display.jsp 파일을 추가하고 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

           데이터 : ${msg}

</body>

</html>

 

 

4)과정

Web Application 실행 -> pom.xml(필요한 라이브러리를 다운로드 받아서 사용할 수 있도록 해 줍니다.) ->web.xml 파일을 읽어서 애플리케이션 설정을 합니다. -> /WEB-INF/spring/root-context.xml 파일을 읽어서 필요한 작업을 수행 -> /WEB-INF/spring/appServlet/servlet-context.xml 파일을 읽어서 필요한 작업을 수행 -> HomeController 설정에 따라서 / 요청이 오면 home.jsp를 출력

 

display 라는 요청을 전송 -> web.xml 설정에 따라서 servlet-context.xml 이 만든 HomeController에서 요청을 처리해주는 메소드를 찾고 없으면 404에러가 발생하고 메소드가 있으면 메소드의 내용을 수행하고 return 하는 문자열을 가지고 servlet-context.xml ViewResolver 설정을 읽고 실제 출력할 view의 이름을 결정해서 출력

 

 

6.Spring에서 web.xml에 설정할 수 있는 URL Pattern

1)/* : 모든 요청

2)/ : .jsp를 제외한 모든 요청 - spring에서만 사용 가능

3)/디렉토리/* : 디렉토리가 포함된 모든 요청 - 최근에 디렉토리를 이용해서 서비스를 구분하는 경우가 많습니다.

4)*.확장자 : 확장자로 끝나는 모든 요청 - 이전에 *.do 로 많이 사용

5)/경로명 : 경로명에 해당하는 하나의 요청

 

=>기본 설정이 /로 되어 있는데 작은 규모의 웹 애플리케이션에서는 변경하지 않고 사용합니다.

서비스가 많아져서 하나의 웹 애플리케이션으로는 처리하기 힘든 경우 설정을 변경합니다.

=>url-pattern 은 여러 개 설정 가능

 

7.파라미터 인코딩 설정

=>parameter: 클라이언트가 서버에게 전달하는 데이터

1)파라미터 작성 방법

=>URL 뒤에 ?를 추가하고 이름=&이름=.. 의 형태로 작성 가능 - GET

=>form 에서 name을 갖는 객체를 생성하면 form submit 될 때 파라미터로 만들어서 전달 - GET, POST

=>ajax 와 같은 요청에서 parameter를 별도로 만들어서 전송

프로그래밍언어에서 Web Application에게 요청을 보낼때도 ajax 와 유사한 방식 - GET, POST

 

2)파라미터 전송 방식

=>GET: URL 뒤에 파라미터를 붙여서 전송하는 방식, 자동 재전송 기능이 있지만 보안이 되지 않고 파라미터 길이에 제한이 있습니다.

=>POST: 파라미터를 header에 숨겨서 전송하는 방식, 파라미터가 URL에서 보이지 않아서 보안이 GET 보다는 우수하고 파라미터 길이에도 제한이 없습니다.

=>password, textarea, file 이 있는 경우는 반드시 POST 방식을 사용

최근에는 form 의 데이터는 대부분 POST 방식으로 전송하는 것을 권장

검색을 요청하는 form을 제외하고 대부분 POST 방식

링크를 이용해서 전송하는 경우는 대부분 GET 방식을 사용

 

3)파라미터 인코딩

=>GET 방식은 WAS 가 처리하고 POST 방식은 서버의 코드가 처리

=>spring에서는 web.xml 파일에 filter를 이용해서 처리가 가능

           <!-- 스프링에서 파라미터 인코딩 설정 -->

           <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>

=>Spring Web Project에서 무조건 설정

 

 

**Controller

=>URL 요청이 오면 필요한 서비스를 호출하고 그 결과를 저장해서 View를 선택해주는 클래스

 

1.Controller 생성

=>spring에서는 POJO 클래스 위에 @Controller를 추가하면 됩니다.

=>Bean의 생성은 설정 파일의 Component-Scan을 이용

 

2.요청 처리 메소드의 기본 모양

- 포워딩으로 처리

@RequestMapping(value="처리할 URL", method=RequestMethod.전송방식)

public String 이름(Model model){

           //전달할 데이터

           model.setAttribute("이름", 데이터);

           //출력할 View

           return "뷰이름";

}

 

- 여러 개의 요청 처리

value={"URL1", "URL2"...}

 

 

@Controller

public class HomeController{

                       @RequestMapping(value="/display", method=RequestMethod.GET)

           public String display(Model model) {

                       String msg = "Spring MVC Project";

                       //데이터 저장 - request.setAttribute 와 동일

                       model.addAttribute("msg", msg);

                      

                       //출력할 View 이름을 설정

                       return "display";

           }

}

=>display 라는 요청이 GET 방식으로 오면 request msg라는 이름으로 데이터를 저장해서 display라는 곳으로 포워딩

 

3.Spring에서의 파라미터 처리

1)HttpServletRequest 이용

2)@RequestParam 이용

3)Command(DTO 와 유사) 객체 이용

=>HttpServletRequest를 이용하는 방법은 java 의 모든 web project에서 사용가능하지만 나머지 방법은 Spring Project에서만 가능

 

4.HttpServletRequest를 이용한 파라미터 처리

1)String getParameter("파라미터이름")

2)String [] getParameterValues("파라미터이름")

 

5.@RequestParam을 이용하는 방식

=>Controller의 요청 처리 메소드 안에 @RequestParam("파라미터이름") 자료형 변수명 으로 설정

=>변수에 파라미터의 값을 대입주는데 형변환은 자동

 

6.Command 객체를 이용하는 방식

=>모든 파라미터 이름으로 구성된 DTO 클래스를 생성

Controller의 요청 처리 메소드 안에 클래스이름 변수명 을 작성하면 모든 파라미터들이 변수에 대입

 

7.파라미터 처리 실습

1)home.jsp 파일에 링크를 생성

<a href="param?num=10">Request를 이용한 파라미터 처리</a><br/>

 

2)HomeController param 요청을 처리하는 메소드를 생성

           @RequestMapping(value="/param", method=RequestMethod.GET)

          public String param(Model model, HttpServletRequest request) {

                       String num = request.getParameter("num");

                       System.out.println(num);

                       return "";

           }

 

3)home.jsp 파일에 form을 생성

           <form action="get" method="get">

                       검색어:<input type="text" name="keyword" />

                       <input type="submit" value="검색"/>

           </form>

 

4)HomeController 클래스에 get 요청을 처리하는 메소드를 생성

           @RequestMapping(value="/get", method=RequestMethod.GET)

           public String get(Model model,

                                  @RequestParam("keyword") String keyword) {

                       System.out.println(keyword);

                       return "";

           }

 

5)home.jsp 파일에 아이디 와 비밀번호를 입력받는 form을 생성

<form action="login" method="post">

           <input type="text" name="id"

                       placeholder="아이디를 입력하세요!" required='required'/><br/>

                       <input type="password" name="pw"

                       placeholder="비밀번호를 입력하세요!" required='required'/><br/>

                       <input type="submit" value="로그인"/>

</form>

 

6)id pw를 저장할 수 있는 클래스 생성

package com.pk.springmvc.domain;

 

public class User {

           private String id;

           private String pw;

          

           public String getId() {

                       return id;

           }

           public void setId(String id) {

                       this.id = id;

           }

           public String getPw() {

                       return pw;

           }

           public void setPw(String pw) {

                       this.pw = pw;

           }

          

           @Override

           public String toString() {

                       return "User [id=" + id + ", pw=" + pw + "]";

           }

          

          

}

 

7)Controller 에 요청을 처리하는 메소드를 생성

           @RequestMapping(value="/login", method=RequestMethod.POST)

           public String login(Model model,

                                  User user) {

                       System.out.println(user);

                       return "";

           }

 

8.최근에 파라미터가 1개인 경우 처리

=>상세보기가 이러한 형태로 많이 구현

최근에는 파라미터가 1개이면 파라미터로 만들지 않고 URL의 마지막에 추가하는 형태를 많이 사용합니다.

 

https://hht/304

304가 글번호입니다.

 

=>spring에서는 위와 같은 파라미터를 @PathVariable 이라는 어노테이션을 이용해서 처리

@RequestMapping(value="/경로/{num}")

public String ?(@PathVariable 자료형 num) 형태로 처리

{ }안에 입력한 이름과 변수명은 일치해야 합니다.

 

1)home.jsp 파일에 요청을 생성

<a href="article/20">20번글</a><br/>

 

2)HomeController에 위의 요청을 처리하는 메소드를 생성

@RequestMapping(value="/article/{num}", method=RequestMethod.GET)

           public String detail(Model model,

                                  @PathVariable int num) {

                       System.out.println(num);

                       return "";

           }

 

**View에게 데이터 전달

=>Controller의 요청 처리 메소드에 HttpServletRequest를 추가해서 전달

이 방식은 포워딩 할 때만 유효

request.setAttribute("이름", 데이터)

 

=>Controller의 요청 처리 메소드에 HttpSession을 추가해서 전달

이동 방법에 상관없이 데이터를 직접 삭제할 때 까지 유효

session.setAttribute("이름", 데이터)

 

=>Controller의 요청 처리 메소드에 Model을 추가해서 전달

이 방식은 포워딩 할 때만 유효

model.addAttribute("이름", 데이터)

 

=>Controller의 요청 처리 메소드에 RedirectAttributes를 추가해서 전달

리다이렉트로 이동할 때 한번만 사용할 수 있는 데이터를 저장

attr.addFlashAttribute("이름", 데이터)

 

**출력할 View 선택

요청 처리 메소드에서 String을 리턴해서 View을 결정

void로 리턴이 없도록 만들면 요청 URL View 이름이 됩니다.

리다이렉트 하고자 하는 경우에는 redirect:URL 로 작성하면 됩니다.

 

 

**Oracle 데이터베이스를 연동하는 spring mvc project

1.Oracle접속해서 샘플데이터를 생성

--drop table item;

CREATE TABLE ITEM(

itemid number(5),

itemname VARCHAR2(20),

price number(6),

description VARCHAR2(50),

pictureurl VARCHAR2(20),

PRIMARY KEY (itemid)

);

insert into item values(1, 'Lemon', 500, 'Vitamin-A', 'lemon.jpg');

insert into item values(2, 'Orange', 1500, 'Vitamin-B', 'orange.jpg');

insert into item values(3, 'Kiwi', 2000, 'Vitamin-C', 'kiwi.jpg');

insert into item values(4, 'Grape', 1000, 'Vitamin-D', 'grape.jpg');

insert into item values(5, 'Strawberry', 2000, 'Vitamin-E', 'strawberry.jpg');

insert into item values(6, 'Mandarin', 300, 'Vitamin-F', 'mandarin.jpg');

commit;

select * from ITEM;

 

 

 

2.Spring MVC Project생성

=>프로젝트 이름은 springmvc

=>패키지 이름은 com.pk.db

spring legacy project ->spring mvc project

 

지금 까지 다른 점은 템플릿이 있다.

 

 

 

3. pom.xml파일에 의존성을 설정

spring mvc project에서 설정 파일 순선

pom.xml -> web.xml

->root-context.xml -> appServlet.xml

 

 

 

=>위의 2개는 파일이름이 고정

아래 2개는 사용하는 프레임워크에 따라 다른 이름이 될 수 있습니다ㅣ.

 

2)dependencies 태그 바깥에 추가

<!-- 중앙 저장소 이외의 곳에서 라이브러리를 다운로드 받을 때

           다운로드 받는 위치를 설정하는 태그 -->

           <repositories>

                       <repository>

                                  <id>oracle</id>

                                  <name>ORACLE JDBC Repository</name>

                                  <url>http://maven.jahia.org/maven2</url>

                       </repository>

           </repositories>

 

3)dependencies 태그 안에 작성

<!-- 오라클 라이브러리 -->

                       <dependency>

                                  <groupId>com.oracle</groupId>

                                  <artifactId>ojdbc7</artifactId>

                                  <version>12.1.0.2</version>

                       </dependency>

                      

                       <!-- spring에서 데이터베이스를 사용할 때 설정 -->

                       <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>

 

                       <!-- 롬북 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>

 

                       <!-- 하이버네이트 사용을 위한 라이브러리 -->

                       <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(프로젝트 설정 파일) 파일에 작성

필드 설정 바꿀 것이 없고 그대로 사용한다.

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

 

          

           <!-- Creates the Spring Container shared by all Servlets and Filters -->

           <!--웹 앱플리캐이션이 시작할 때 실행할 스프링 설정파일을

           web-inf/application-context.xml로 설정 -->

           <listener>

                       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

           </listener>

          

           <!-- 위의 파일 경로를 변경하는 설정 -->

           <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->

           <context-param>

                       <param-name>contextConfigLocation</param-name>

                       <param-value>/WEB-INF/spring/root-context.xml</param-value>

           </context-param>

 

           <!-- Processes application requests -->

           <!-- jsp를 제이한 요청이 왔을 떄 처리를 위한 스프링 설정 파일의 경로를 실행 -->

           <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/spring/appServlet/servlet-context.xml</param-value>

                       </init-param>

                       <load-on-startup>1</load-on-startup>

           </servlet>

           <!-- .jsp를 제외한 요청은 appServlet이 처리 -->   

           <servlet-mapping>

                       <servlet-name>appServlet</servlet-name>

                       <url-pattern>/</url-pattern>

           </servlet-mapping>

 

</web-app>

 

5. 데이터베이스 를 연동할 때는 하나의 행을 나타낼 dto클래스를 생성

=>기본패키지.domain.Item

=>변수를 만들 때 되도록이면 테이블에서 사용하는 컬럼이름과 일치시키는 것을 권장

getters and setters , toString()

package com.pk.db.domain;

 

import lombok.Data;

 

@Data

public class Item {

           private int itemid;

           private String itemname;

           private int price;

           private String description;

           private String pictureurl;

}

 

6.mybatis mapper 인터페이스를 만들고 필요한 sql을 생성

=>기본 패키지 com.pk.db.dao.ItemDao

package com.pk.db.dao;

 

import java.util.List;

 

import org.apache.ibatis.annotations.Select;

 

import com.pk.db.domain.Item;

 

public interface ItemDao {

           //Item테이블의 모든 데이터를 가져오는 메소드

           @Select("select * from item")

           public List<Item> allItem();

          

           //Item 테이블에서 Itemid를 이용해서 데이터 1개를 찾아오는 메소드

           @Select("select * from item wehre itemid = #{itemid}")

           public Item getItem(int itemid);

}

 

7. root-context.xml 파일에 mybatis 연동을 위한 설정을 추가

=>Datasource:데이터베이스 연동할 떄 필수

=>SqlSessionFactoryBean, MapperFactoryBean: 인터페이스를 이용한 mybatis 사용하는 경우 생성

<?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:context="http://www.springframework.org/schema/context"

           xmlns:tx="http://www.springframework.org/schema/tx"

       xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd

                       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd

                       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

          

           <!-- Root Context: defines shared resources visible to all other web components -->

           <!-- 애플리케이션 모든 곳에서 사용할 bean을 생성 -->      <!-- 스프링에서 데이터베이스를 사용할 때 접속 정보를 저장할 bean -->

           <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">

                       <!-- 데이터베이스 종류 -->

                       <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>

                       <!-- 데이터베이스 위치 -->

                       <!-- 데이터베이스 응용법 마다 다르다. -->

                       <property name="url" value="jdbc:oracle:thin:@ip주소1521:xe"></property>

                       <property name="username" value="user29"></property>

                       <property name="password" value="user29"></property>

           </bean>

          

           <!-- MyBatis를 인터페이스를 이용해서 사용할 떄 필요한 Bean -->

           <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">

                       <property name="dataSource" ref="dataSource"></property>

           </bean>

          

           <bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="itemDao">

                       <property name="sqlSessionFactory" ref ="sqlSessionFactory"></property>

                       <property name="mapperInterface" value="com.pk.db.dao.ItemDao"></property>

           </bean>

          

 

</beans>

 

 

 

**DaosERVICE가 가져다가 사용합니다.

=>Service를 만들 때는 탬플릿 메소드 패턴 사용

=>인터페이스를 생성하고 메소드를 선언한 후 클래스에서 메소드를 구현

 

8.Service인터페이스를 만들고 전체 데이터를 전부 가져오는 메소드를 선언

=>기본패키지.service.ItemService

=>Service인터페이스의 메소드는 기본적으로 HttpServletRequest는 매개변수로 무조건 갖도록 만듭니다.

package com.pk.db.service;

 

import java.util.List;

 

import javax.servlet.http.HttpServletRequest;

 

import com.pk.db.domain.Item;

 

public interface ItemService {

           //전체 데이터를 가져오는 메소드

           public List<Item> allItem(HttpServletRequest request);

}

 

 

9.Service 인터페이스를 implements Service 클래스를 만들고 메소드를 구현

=>기본패키지.service.ItemServiceImpl

package com.pk.db.service;

 

import java.util.List;

 

import javax.servlet.http.HttpServletRequest;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

 

import com.pk.db.dao.ItemDao;

import com.pk.db.domain.Item;

 

//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.Controller 클래스 수정

package com.pk.db;

 

import java.util.List;

 

import javax.servlet.http.HttpServletRequest;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

 

import com.pk.db.domain.Item;

import com.pk.db.service.ItemService;

 

@Controller

public class HomeController {

           //service객체르르 주입

           @Autowired

           private ItemService itemService;

          

          

           @RequestMapping(value="/", method = RequestMethod.GET)

           public String home(HttpServletRequest request,Model model) {

                       //서비스 메소드 호출

                       List<Item> list = itemService.allItem(request);

                       //데이터 저장

                       model.addAttribute("list", list);

                       return "home";

           }

}

 

11. webapp/WEB-INF/views디텍토리의 home.jsp를 삭제하고 새로 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

${list }

           <h2 align='center'>상품목록</h2>

           <table border="1" aling="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>

 

 

css파일 ->html, jsp적용

<style> 스타일 </style>

웹 어플리캐이션은 파일의 경로가 아니고고 url의 경로이다.

webapp에 해야 한다.

 

 

 

**cssjs 이외의 기타 자원의 경로 설정

=>출력되는 파일의 위치가 기준이 아니고 url이 기준입니다.

 

 

12. webapp(WebContent) 디렉토리에 css디렉토리를 생성하고 item.css 파일을 만들어서 작성

css.item.css

.header{

           background: #C98FED;

          

}

.record{

           background: #EDEDED;

}

 

13. home.jsp파일에 css 파일의 링크 설정

 

 

14. mvc:default-servlet-handler

=>spring 프로젝트에서 servleturl-pattern//*로 하는 경우 모든 요청을 controller가 처리 할려고 합니다.

cssjs 등의 확장자를 가진 링크도 controller가 처리 할려고 합니다.

이런 이유로 404 에러가 발생합니다.

=>cssjs등의 확장자를 가진 파일의 링크를 사용하고자 할 때는 servlet-context.xml파일에 태그를 추가해서 controller가 처리할 수 없는 요청은 was가 대신 처리하도록 해주어야 합니다.

이 설정도 필수 입니다.

<link rel="stylesheet" href="./css/item.css">

 

15. servelt-context.xml파일에 아래 태그 추가

       <!-- controller가 처리하지 못하도록 하는 요청은 was가 처리하도록 해주는 요청 -->

           <default-servlet-handler/>

 

urlfile path 안 같다.

url이라고 파일의 경로는 다르다.

 

 

16. 상세보기 구현을 위해서 home.jsp파일에서 이름을 출력하는 부분을 수정

//파라미터로 기본키의 값이 itemid를 넘겨줍니다.

<a href="detail?itemid=${item.itemid }">${item.itemname }</a>

 

17.Servide 인터페이스에 상세보기를 위한 메소드를 선언

       //데이터 1개를 가져오는 메소드

           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디렉토리에 deetail.jsp파일을 만들고 출력하는 코드를 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

${item}

</body>

</html>

 

 

요청이 발생하면 Controller로 이동 ->

Service메소드로 이동

Dao메소드로 이동 ->sql확인 ->

Service메소드로 이동 ->

Controller메소드로 이동

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>${item.itemname }</title>

<link rel ="stylesheet" href="./css/item.css">

</head>

<body>

           <%-- ${item } --%>

           <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>

                                                                                <td width="160">${item.itemname}</td>

                                                                     </tr>

                                                                     <tr height='50'>

                                                                                <td width="80">가격</td>

                                                                                <td width="160">${item.price}</td>

                                                                     </tr>

                                                                     <tr height='50'>

                                                                                <td width="80">효능</td>

                                                                                <td width="160">${item.description}</td>

                                                                     </tr>

                                                                     <tr height='50'>

                                                                                <td colspan="2" align="center">

                                                                                           <a href="./" >목록보기</a>

                                                                                </td>

                                                                     </tr>

                                                         </table>

                                              </td>

                                  </tr>

                       </table>

           </div>

</body>

</html>

 

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

 

최근에는 http://www.naver.net/archives/371849이런식으로 한다.

 

 

**itemidparameter 가 아니라 path variable로 처리하기

1.Service인터페이스에서 detail을 처리해주는 메소드를 추가로 선언

파라미터를 읽을 수 없기 때문에 Controller 로 부터 itemid를 받아야 합니다.

           //파라미터를 읽지 않고 받는 메소드

           public Item getItem(HttpServletRequest request,int itemid);

 

 

 

2.ItemServiceImpl클래스의 메소드 구현

       @Override

           public Item getItem(HttpServletRequest request, int itemid) {

                       return itemDao.getItem(itemid);

           }

 

3.HomeController 메소드 구현

             

       @RequestMapping(value = "/detail/{itemid}", method = RequestMethod.GET)

           public String detail(HttpServletRequest request, Model model,@PathVariable int itemid) {

           System.out.println("===================================="+itemid);

                       // 서비스 메소드 호출

                       Item item = itemService.getItem(request,itemid);

                       // 데이터 저장

                       model.addAttribute("item", item);

                       return "detail";///출력할 페이지 이름

           }

 

 

4.home.jsp에 제목 링크 수정

<a href="detail/${item.itemid}">${item.itemname}</a>

 

5.detail.jsp 모두 .을 하나 더 추가해야 한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>${item.itemname }</title>

<link rel ="stylesheet" href="../css/item.css">

</head>

<body>

           <%-- ${item } --%>

           <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>

                                                                                <td width="160">${item.itemname}</td>

                                                                     </tr>

                                                                     <tr height='50'>

                                                                                <td width="80">가격</td>

                                                                                <td width="160">${item.price}</td>

                                                                     </tr>

                                                                     <tr height='50'>

                                                                                <td width="80">효능</td>

                                                                                <td width="160">${item.description}</td>

                                                                     </tr>

                                                                     <tr height='50'>

                                                                                <td colspan="2" align="center">

                                                                                           <a href="../" >목록보기</a>

                                                                                </td>

                                                                     </tr>

                                                         </table>

                                              </td>

 

                                  </tr>

                       </table>

           </div>

</body>

</html>

 

 

hibernateTransaction을 이용해야 한다.

트랜잭션은 dao에 하는 것이 아니라

 

 

 

 

 

 

**하이버네이트 적용

1.    pom.xml파일에 hibernatespring-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>

 

2.    dao패키지에 테이블과 dto매핑하는 xml파일을 생성하고 작성

=>기본패키지.dao(이름.hbm.xml) : 하이버네이트 설정 파일이라는 것을 알려주기 위해서 중간에 hbm을 추가

 

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.pk.db.domain">

           <class name="Item" table="ITEM">

                       <id name="itemid" column="ITEMID">

                       </id>

                       <property name="itemname" column="ITEMNAME" />

                       <property name="pictureurl" column="PICTUREURL" />

                       <property name="price" column="PRICE" />

                       <property name="description" column="DESCRIPTION" />

           </class>

</hibernate-mapping>

 

3.    root-context.xml파일에 하이버네이트 사용을 위한 설정을 추가

=>tx 네임스페이스에서 추가하고 작성

 

 

              <!-- 하이버네이트 사용을 위한 설정 -->

           <bean id="sessionFactory"

                class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

                       <property name="dataSource" ref="dataSource" />

                       <property name="mappingResources">

                                  <list>

                                             <value>com/pk/db/dao/item.hbm.xml</value>

                                  </list>

                       </property>

                       <property name="hibernateProperties">

                                  <value>

                                             hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

                                  </value>

                       </property>

           </bean>

          

           <!-- 하이버네이트는 트랜잭션 사용이 필수이기 때문에 추가 -->

          

           <tx:annotation-driven />

           <bean id="transactionManager"

           class="org.springframework.orm.hibernate5.HibernateTransactionManager">

                       <property name="sessionFactory" ref="sessionFactory" />

           </bean>

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'Study > spring' 카테고리의 다른 글

spring-6  (0) 2020.10.26
spring-5  (0) 2020.10.23
spring-3  (0) 2020.10.23
spring-2  (0) 2020.10.22
spring-1  (0) 2020.10.22

+ Recent posts