초급의 끄적거림

[Spring] Spring 기본설정 / 기본 사용 방법 본문

Framework/Spring

[Spring] Spring 기본설정 / 기본 사용 방법

codingD 2019. 10. 15. 16:21

1. Spring Framework

- 환경설정이 복잡하다
- 어노테이션 방식으로 구성할 수 있다

- MVC를 편하게 사용하도록 지원해줌

- Spring Legacy : 아무것도 없는 빈 페이지

 

- 패키지가 'com.mycompany.myapp' 처럼 라는 삼단으로 만들어져야 함

- request.getContextPath() 프로젝트 루트값 불러오는 것

- 라이브러리를 제대로 다운 받지 못하면 빨간 X → 인터넷이 연결되어 있어야 다운이 되면서 X가 사라짐 (미리 다운로드 받아둘 것)

- 필요한 라이브러리를 가지게 되면 자연스럽게 사라짐 

 

 - 원칙적으로 라이브러리를 넣기 위해서는 각자의 사이트에 가서 다운로드 받아야 했음

 - Spring Framework는 repository 라는 곳에서 라이브러리를 한번에 관리함

 - 다운로드 되어져 있는 라이브러리를 사용자가 관리할 수 있고 따로 USB에 가지고 다니며 사용 가능

 - 설정이 복잡하다는 단점

 - 개발하는데 좋기 위해 만들어진 패턴이고 배포할 때는 프로젝트를 .war배포

 

https://mvnrepository.com

자주 쓰게 될 것

기존에 있는 라이브러리가 어디에 있는지 알려주는 것

 

 - src\main\webapp\WEB-INF = WebContent 로 (view 단의 root 에 해당)

 - web.xml

 

 

2. Maven 설정 파일의 생성

 - 라이브러리 다운로드 장소

 - Mavnen의 디폴트모습

 

 - 경로에 맞춰서 'maven' 폴더 생성 (D:/java0514/maven)

 - 아래의 settings를 'settings.xml'로 'D:/java0514/maven' 경로에 저장

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                              http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <localRepository>D:/java0514/maven</localRepository>
    <interactiveMode>true</interactiveMode>
    <usePluginRegistry>false</usePluginRegistry>
    <offline>false</offline>
    <pluginGroups>
        <pluginGroup>org.codehaus.mojo</pluginGroup>
    </pluginGroups>
</settings>

 

 - 디폴트값 쓰지 않고 위에서 만든 settings.xml 이 들어있는 폴더를 설정해줌

 

3. basicSpring 생성

 - 프로젝트 이름은 의미 없음

 - 위에서 maven 에 새로운 라이브러리 경로를 생성해주었기 때문에 새로운 Spring Project를 만들었을 때 maven 에 라이브러리가 자동적으로 생성됨

 

 +) 정상적으로 했음에도 프로젝트에 빨간 X가 없어지지 않을 경우,

     '프로젝트' 에서 우클릭 → 'Maven' → 'Update Project' 로 해결 가능

 

4. HomeController.java

 -  결과확인 방법 : http://localhost:8090/basicspring/hello.do

 - @RequestMapping 의 value를 hello.do 로 변경

 - method의 get은 get방식을 말하는 것. 

  → hello.do가 method가 get 방식으로 들어오면 아래의 내용을 실행하라는 것

package kr.co.basicspring;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/* 결과확인 방법
	 * http://localhost:8090/basicspring/hello.do 
	 */
	@RequestMapping(value = "hello.do", method = RequestMethod.GET) //hello.do가 method가 get 방식으로 들어오면 아래의 내용을 실행하라는 것
	public String home(Locale locale, Model model) {
		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";
	}
	
}

 

 

5. test01 패키지

 5-1) CalcController 클래스 생성

 

사용자가 요청한 정보는 request에 들어감 → request 라는 내부객체가 필요함

request.getParameter("no1")

reqeust.getParameter("no2")

1. view 단으로 이동하기 위한 클래스
 : Model, ModelAndView

2. view 페이지로 이동
 : setViewName(" ");  - 뷰 이름 설정

3. addObject(String name, Object value)  & req.setAttribute("", ""_;
 : 뷰에 전달할 값 추가, 공유 장소 req영역에 값을 올림
package kr.co.basicspring.test01;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

/* 스프링 프레임워크 특징
- 환경설정이 복잡하다
- 어노테이션 방식으로 구성할 수 있다
*/

@Controller	//해당 클래스는 컨트롤러 기능이다
			//스프링컨테이너 (서버)에서 자동으로 객체가 생성된다
public class CalcController {
	//new CalcController() → 객체
	public CalcController() {
		System.out.println("-----CalcController() 객체 생성됨");
	}//CalcController() end
	
	//결과확인
	//http://localhost:8090/basicspring/add.do?no1=5&no2=8
	//@RequestMapping → 요청 명령어 등록 (add.do를 등록하기 위한 것)
	//		  → 요청 명령어 등록 후 실행의 주체는 클래스 X, 메소드 O (한 개의 클래스 안에 여러 개의 메소드 가능)
	//		  → 클래스를 만들 때마다 관리할 필요 없이 메소드만 수정하면 됨
		
		
	//1) @RequestMapping(value="요청명령어", method=GET / POST)
	@RequestMapping(value = "/add.do", method = RequestMethod.GET)
	public ModelAndView add(HttpServletRequest req) {	//value가 들어왔을 때 자동으로 add() 메소드가 실행
		//사용자가 요청값 가져오기
		int no1=Integer.parseInt(req.getParameter("no1"));
		int no2=Integer.parseInt(req.getParameter("no2"));
		System.out.println(no1);
		System.out.println(no2);
		int result=no1+no2;
		
		//view단으로 이동하기 위한 클래스
		//→ Model
		//→ ModelAndView 
		// 둘 중 아무거나 써도 무방
		ModelAndView mav=new ModelAndView();
		
		//view 페이지로 이동
		//servlet-context.xml 20행 → prefix (setViewName의 접두사, 종종 바뀌기도 함): /WEB-INF/views/
		// 		      21행 → suffix (setViewName의 접미사): .jsp
		//  /WEB-INF/views/calcResult.jsp
		mav.setViewName("calcResult");   	//.jsp로
		
		
		// 공유 장소 req영역에 값 올리기 (calcResult.jsp 에서도 사용해야하기 때문에 공유공간에 올리고 가야함)
		req.setAttribute("msg", "<h1>두 수의 합</h1>");
		req.setAttribute("img", "<img src='resources/images/add.png'>"); // servlet-context.xml 의 16행 resources 가 외부에서 불러오는 것들을 저장함 
		
		req.setAttribute("no1", no1);
		req.setAttribute("no2", no2);
		req.setAttribute("result", result);
		
		return mav;
	}//add() end
		
	@RequestMapping(value = "/sub.do", method =RequestMethod.GET )
	public ModelAndView sub(HttpServletRequest req) {
		int no1=Integer.parseInt(req.getParameter("no1"));
		int no2=Integer.parseInt(req.getParameter("no2"));

		int result=no1-no2;
	
		ModelAndView mav=new ModelAndView();	
		mav.setViewName("calcResult");  
	
		//공유공간 request영역에 값 올리기 (req.setAttribute() = mav.addObject())
		mav.addObject("msg", "<h1>두 수의 차</h1>");
		mav.addObject("img", "<img src='resources/images/sub.png'>"); // servlet-context.xml 의 16행 resources 가 외부에서 불러오는 것들을 저장함 
		
		mav.addObject("no1", no1);
		mav.addObject("no2", no2);
		mav.addObject("result", result);
		
		return mav;
	}//sub() end
	
	@RequestMapping(value = "/mul.do", method = RequestMethod.GET)
	public ModelAndView mul(HttpServletRequest req) {
		int no1=Integer.parseInt(req.getParameter("no1"));
		int no2=Integer.parseInt(req.getParameter("no2"));

		int result=no1*no2;
		
		ModelAndView mav=new ModelAndView();	
		mav.setViewName("calcResult");  
		
		//공유공간 reqeust영역에 값 올리기 (둘이 같은 의미이기 때문에 겹쳐서 사용)
		mav.addObject("msg", "<h1>두 수의 곱</h1>");
		mav.addObject("img", "<img src='resources/images/mul.png'>");
		
		req.setAttribute("no1", no1);
		req.setAttribute("no2", no2);
		req.setAttribute("result", result);
		
		return mav;
	}//mul() end
	
	@RequestMapping(value = "/div.do", method = RequestMethod.GET)
	public ModelAndView div(HttpServletRequest req) {
		int no1=Integer.parseInt(req.getParameter("no1"));
		int no2=Integer.parseInt(req.getParameter("no2"));

		int result=no1/no2;
		
		ModelAndView mav=new ModelAndView();	
		mav.setViewName("calcResult");  
		
		//공유공간 reqeust영역에 값 올리기		
		mav.addObject("msg", "<h1>두 수의나누기</h1>");
		mav.addObject("img", "<img src='resources/images/div.png'>");
		
		req.setAttribute("no1", no1);
		req.setAttribute("no2", no2);
		req.setAttribute("result", result);
		
		return mav;
	}//div() end
	
//-------------------------------------------------------------------------------------
	
	//2) 요청명령어를 처리하는 메소드의 매개변수의 유연성
	//@RequestParam("요청변수명") 자료형 변수명 
	//→ 사용자가 요청한 값을 직접 변수에 저장가능하다
	@RequestMapping("diff.do") // ← get post 방식이 정해지지 않고 생략된 경우, 상관 없이 get이든 post든 진행
	public ModelAndView diff(@RequestParam ("no1") int a, 
					 		 @RequestParam ("no2") int b) {
		//두 수 사이의 차이
		int result=Math.abs(a-b);  
		
		ModelAndView mav=new ModelAndView();	
		mav.setViewName("calcResult");  
	
		//공유공간 request영역에 값 올리기 (req.setAttribute() = mav.addObject())
		mav.addObject("msg", "<h1>두 수의 차</h1>");
		 
		
		mav.addObject("no1", a);
		mav.addObject("no2", b);
		mav.addObject("result", result);
		
		return mav;
		
	}//diff() end
	
//------------------------------------------------------------------------------------------------------------
	//3) 사용자가 요청한 값을 매개변수로 직접 저장가능하다
	//→ 요청변수명과 매개변수명이 동일해야 함
	@RequestMapping("max.do")
	public ModelAndView max(int no1, int no2) {
		//두 수 중 큰수
		int result=Math.max(no1, no2);
		
		ModelAndView mav=new ModelAndView();
		mav.setViewName("calcResult");
		
		//공유공간 request영역에 값 올리기 (req.setAttribute() = mav.addObject())
		mav.addObject("msg", "<h1>두 수의 차</h1>");	
		mav.addObject("no1", no1);
		mav.addObject("no2", no2);
		mav.addObject("result", result);
		
		return mav;
	}//max() end	
}//class end

 

 

 5-2)  calcResult.jsp 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>calcResult.jsp</title>
</head>
<body>
<h1>1) JSP</h1>
	<%=request.getAttribute("msg") %>
	숫자 1 : <%=request.getAttribute("no1") %><br>
	숫자 2 : <%=request.getAttribute("no2") %><br>
	결과 : <%=request.getAttribute("result") %><br>
	<%=request.getAttribute("img") %>
	<hr>
	
	<h1>2) EL </h1>
	${requestScope.msg }
	숫자 1 : ${requestScope.no1 }<br>
	숫자 2 : ${requestScope.no2 }<br>
	결과 : ${requestScope.result }<br>
	${requestScope.img }<br>
	<hr>
	<h1>3) EL </h1>
	${msg }
	숫자 1 : ${no1 }<br>
	숫자 2 : ${no2 }<br>
	결과 : ${result }<br>
	
	${img==null ? "" : img}
</body>
</html>

 

 기본 에노테이션

1) @Controller
  : 접속자의 URL 요청을 처리하는 클래스라는 정의
  : 접속자가 브라우정서 URL을 입력하여 접근시 주소에 해당하는 메소드를 구현하고, 데이터를 처리하여 JSP페이지로 이동하는 기능
  : 주소에 해당하는 메소드 실행 / DTO, DAO 등 데이터 처리, JSP 페이지로 이동
2) @RequestMapping : 접속자의 요청주소에 따라 실행할 클래스나 메소드의 구분자로 사용
3) @RequestParam : <form> 태그에서 전송한 데이터의 접근

 1) @RequestMapping (value="요청명령어", method=GET / POST)

 

2) 요청명령어를 처리하는 메소드의 매개변수의 유연성
@RequestParam("요청변수명") 자료형 변수명

 

3)  사용자가 요청한 값을 매개변수로 직접 저장 가능하다

 

6. bbs

 - 입출력해주는 form

 - WEB-INF\views\bbs

 6-1) src/main/java\kr.co.basicspring.test02\BbsCont.java 생성

package kr.co.basicspring.test02;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class BbsCont {
	public BbsCont() {
			System.out.println("----- BbsCont() 객체 생성됨");
	}//BbsCont() end
	
	
	//결과확인
	//http://localhost:8090/basicspring/bbs/create.do
	
	/* 1)
	@RequestMapping(value = "bbs/create.do", method = RequestMethod.GET)
	public ModelAndView bbsForm () {
		ModelAndView mav=new ModelAndView();
		mav.setViewName("bbs/bbsForm");
		return mav;
	}//bbsFrom() end
	*/
	
	//2) 단순히 페이지 이동만 할 때 많이 사용하는 방식
	@RequestMapping(value = "bbs/create.do", method = RequestMethod.GET)
	public String bbsForm() {
		return "bbs/bbsForm";
	}//bbsForm() end
	
//-----------------------------------------------------------------------------------------------------------------------------------
	//동일한 요청명령어를 GET | POST방식으로 분리해서 호출가능
	@RequestMapping(value = "bbs/create.do", method = RequestMethod.POST)
	public ModelAndView bbsInt(HttpServletRequest req) {
		String wname=req.getParameter("wname").trim();
		String subject=req.getParameter("subject").trim();
		String content=req.getParameter("content").trim();
		String passwd=req.getParameter("passwd").trim();
		
		ModelAndView mav=new ModelAndView();
		mav.setViewName("bbs/bbsResult");
		
		mav.addObject("wname", wname);
		mav.addObject("subject", subject);
		mav.addObject("content", content);
		mav.addObject("passwd", passwd);
		
		return mav;		
	}//bbsInt() end
}//class end

 

 6-2) bbsForm.jsp (폼생성)

  - 1)과 2)의 방식이 동일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>bbs/bbsForm.jsp</title>
</head>
<body>

<h3>* 글쓰기 *</h3>
<form name="bbsfrm"
      method="post"
      action="create.do">
<table border="1">
<tr>
    <th>작성자</th>
    <td><input type="text" name="wname" size="10" maxlength="20" required></td>
</tr> 
<tr>
    <th>제목</th>
    <td><input type="text" name="subject" size="20" maxlength="100" required></td>
</tr> 
<tr>
    <th>내용</th>
    <td>
      <textarea rows="5" cols="30" name="content"></textarea>
    </td>
</tr> 
<tr>
    <th>비밀번호</th>
    <td><input type="password" name="passwd" size="10" maxlength="10" required></td>
</tr> 
<tr>
    <td colspan="2" align="center">
      <input type="submit" value="쓰기">
      <input type="reset" value="취소">
    </td>
</tr> 
</table>
</form>

</body>
</html>

 

6-3) bbsResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bbs/bbsResult.jsp</title>
</head>
<body>
	<h3> * 글쓰기 결과 *</h3>
	작성자 : ${wname }<br>
	제목 : ${subject }<br>
	내용 : ${content }<br>
	비밀번호 : ${passwd }<br>
</body>
</html>

 

 

 

* 아직 인코딩을 하지 않았기 때문에 한글이 깨져 나오게 됨!

 

7. 인코딩 서블릿  등록

MVC 버전은 encodefilter 를 작성하고 서블릿 등록을 해주었지만, spring에서는 서블릿 등록만 해주면 한글필터 통과

 

bbsCont.java

 - 필터 인코딩을 서블릿에 등록하기 위해 bbsCont.java (현재 운영중인 controller)에 아래 코드를 import.

import org.springframework.web.filter.CharacterEncodingFilter;

 

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>

 

8. 요청 명령어 매개변수 (parameter)가 DTO객체인 경우

 8-1) BbsDTO 생성

 package kr.co.basicspring.test02;

  - 아래 칼럼으로 BbsDTO 를 생성하고 'getter'와 'setter' 생성

 8-2) BbsCont.java

매개변수 (parameter)가 DTO 객체인 경우
→ 해당 클레스에 반드시 폼 컨트롤 요소 이름으로 되어 있는 멤버 변수와 각 getter와 setter 함수가 있어야 한다

@RequestMapping(value = "bbs/create.do", method=RequestMethod.GET)
	public String bbsForm(){return "bbs/bbsForm";}

@RequestMapping(value = "bbs/create.do", method=RequestMethod.POST)
		public ModelAndView bbsInt(BbsDTO dto) {
		System.out.println("wname : "+dto.getWname());
		System.out.println("subject : "+dto.getSubject());
		System.out.println("content : "+dto.getContent());
		System.out.println("passwd : "+dto.getPasswd());
		
		ModelAndView mav=new ModelAndView();
		mav.setViewName("bbs/bbsResult2");
		
		//request영역에 dto 객체 올리기 (객체에 담은 bbsResult2 파일을 생성 후 테스트)
		mav.addObject("dto", dto);
		
		return mav;
	}//bbsInt() end

 

 8-3) bbsResult2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bbs/bbsResult2.jsp</title>
</head>
<body>
	<h3>* 글쓰기 결과 *</h3>
	작성자 : ${dto.wname }<br>
	제목 : ${dto.subject }<br>
	내용 : ${dto.content }<br>
	비밀번호 : ${dto.passwd }<br>
</body>
</html>

올바르게 진행된 경우 나오는 결과

Comments