https://intheham.tistory.com/83
Spring
- 자바 기반 웹 프로그래밍에서 많이 활용되는 프레임워크
( 프레임워크 : 프로그램의 기본 뼈대와 api를 구축해놓은 미들웨어)
Spring boot
- Spring을 경량으로 최적화한 프레임워크 --- 요즘 많이 사용됨!!
- 서버를 stand alone으로 쓸 수 있음.
: 이전엔 하나의 톰캣 서버(8787)에 여러 프로젝트를 올렸다면, 스프링부트는 하나의 서버에 하나의 프로젝트만.
==> 포트가 충돌날 수 있음.
-- 프로젝트 이름을 쓰지 않아도 됨. 단, 상위 루트를 다르게 정해줘야 함.
- 기존 Spring은 Servlet 파일을 요청할 url 주소를 xml 파일에 했음. (오타가 있으면 실행이 안돼서 너무 불편함 ㅠ)
=> xml 파일과 DispatcherServlet 파일을 다루지 않아도 되도록 속에 숨겨놓음.
- Spring boot는 application.properties에 함.
# port -- 프로젝트 시작 시 사용할 포트 지정
server.port=8081
# JSP view -- "/WEB-INF/views/myinfo.jsp" => "myinfo" 만 써도 되게!
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# oracle set -- dbconn 역할!
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=hr
spring.datasource.password=hr
# encoding
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
# JSP view
spring.mvc.view.prefix=/WEB-INF/views/
에서 굳이 /WEB-INF/ 를 붙이는 이유는
views만 할 경우 혹여나 프로그램이 혼동해 다른 파일을 실행시킬 수 있어서,
Controller를 통한 경로로만 실행되도록 하기 위함.
- 메이븐 포함 (jar 파일 관리)
=> 사용할 라이브러리를 자동으로 다운받을 수 있도록 도움.
(윈도우즈 사용자폴더에 있음,, )
인텔리제이 - 그레이들 기반
이클립스 - 메이븐 기반 (그레이들도 가능함)
Spring boot project 구성요소
- src/main/java : 자바 파일 저장.
--- 스프링이 자동으로 스캐닝해서 객체를 생성하고 생명주기를 관리해주기 위해서는
(1) 기본 패키지(com.example.demo) 밑에 자동으로 생성되어야 하는 클래스를 만들어야 함.
==> dao, service, controller 등
(2) 클래스 파일의 스테레오타입을 어노테이션(@)으로 지정해야 함. (@Controller)
- src/main/resources : 프로젝트 자원 파일들을 저장
---- static 폴더 : html, css, javascript 와 같은 정적 웹페이지 저장.
---- templates 폴더 : 뷰 템플릿 파일들 저장
---- application.properties 파일 : 이 프로젝트 설정 작성 파일.
(서버 포트, db 설정, 인코딩, jpa, 멀티파트 등..)
- webapp 폴더 : 뷰페이지 저장. jsp 페이지 저장.
- pom.xml : 라이브러리 의존성 등록. 기능을 추가하려면 pom.xml에 의존성 추가.
--- 이 파일에 x가 있으면 파일이 안돌아감! (버전이 안맞거나..
Spring mvc
- 가장 많이 사용되는 개발 패턴.
- Model View Controller에 필요한 구조는 모두 내부에 있다.
- 모든 요청은 내부에 있는 DispatcherServlet이 받는다.
1. 받은 요청 url이 controller에 등록된 것인지 urlMapper에게 확인한다.
2. 없는 url이면 404 / 있으면 맵핑된 메서드 실행.
3. 맵핑된 메서드 실행 후 뷰페이지 경로 반환.
4. DispatcherServlet이 viewResolver(api class)에게 뷰페이지 경로를 전달하여 뷰페이지를 생성하고 실행하도로고 함.
1. controller 클래스
- url별로 실행될 메서드를 등록 및 구현하는 클래스.
- 일반 클래스로 만들고 @Controller 어노테이션 붙여야 함.
@Controller : Controller 클래스
@Repository : Dao 클래스.
@Service : Service 클래스
- 각 url 별로 실행할 코드 작성. 이동할 뷰 페이지 경로를 반환.
- url 맵핑 :
@RequestMapping("url") : 전송방법 상관없이 url만 지정.
@GetMapping("url") : get 방식 url 지정
@PostMapping("url") : post 방식 url 지정
@PutMapping("url") : put 방식 url 지정
... 전송방식 모두 지원함.
- request mapping 메서드의 반환타입 :
(1) String : 뷰페이지 경로
(2) void : 맵핑된 url과 동일한 경로로 뷰페이지 경로 설정
(3) ModelAndView : 경로 및 데이터 전달
(4) Map, ModelMap : 키, 값을 저장해서 리턴하면 뷰페이지로 전달. 뷰페이지에서 키 이름으로 값 사용.
( ModelMap은 Spring에서 제공하는 api )
(5) Map, ModelMap 메서드의 파라메터로 지정 : 리턴을 하지 않아도 자동으로 뷰페이지로 전달됨.
- 일반 컨트롤러의 경우 뷰페이지 겸용이기 때문에 String 은 뷰페이지 경로를 반환함.
- Rest 컨트롤러는 백과 뷰가 나뉘기 때문에 @ResponseBody가 주로 쓰여 String은 JSON 같은 값을 반환하게 됨.
@ResponseBody
@ResponseBody // 뷰페이지 경로가 아니라 응답 몸체를 보냄. 붙이지 않으면 뷰페이지경로 반환.
@RequestMapping("/insert")
public String insert() {
service.addBoard();
return "board에 새글 추가"; // 응답페이지에 출력될 텍스트 리턴
}
package com.example.demo.hello;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller // 꼭 써줘야 함!
// 기존의 commands.properties 역할~
// Dao, Service, controller .. 기본 패키지 밑에 있어야 함.
public class HelloController { // 이름을 그냥 Controller 라고 하면 오해함.
// get방식 요청 url 등록
@GetMapping("/hello/test1")
public String test1() { // 반환타입이 String 이면 view 페이지 경로 반환..
return "hello/test1"; // application.properties에서 설정했기 때문에 간단하게 씀.
}
// 전송방식 지정 안함. get, post 상관없이 해당 url로 요청이 오면 메서드 자동 실행.
@RequestMapping("/hello/test2")
public void test3() { // url과 리턴 경로가 같으면 생략해도 됨.
// 맵핑 메서드의 반환타입이 void 면 url 맵핑과 동일한 뷰 페이지로 설정됨.
// return "hello/test3"; 로 지정한 것과 동일.
}
}
2. 커맨드 객체
: url 맵핑된 메서드의 파라메터로 vo객체를 작성하면 폼 양식에 입력한 값을 담아온다.
- vo의 멤버변수 이름과 입력양식의 이름이 같아야 한다.
- 파람 없는 생성자로 vo 객체를 자동으로 생성하고 입력양식의 이름으로 setter를 호출하여 값을 vo에 담는다.
- 커맨드 객체는 자동으로 뷰페이지로 전달되고 뷰페이지에서 소문자 클래스명으로 사용한다. (MemberVo vo => membervo)
- 커맨트 객체를 뷰페이지에서 부를 이름을 설정 :
@ModelAttribute("이름") ==> ${이름.멤버변수}
기본은 ${memberVo.id}
@ModelAttribute("m") ==> ${m.id}
!!! 꼭 VO 안에 디폴트생성자와 세터, 게터가 있어야 함!
그리고 jsp의 input name 과 멤버변수 이름이 같아야 한다!
// join.jsp
<form action="/member/join" method="post">
id:<input type="text" name="id"><br/>
pwd:<input type="password" name="pwd"><br/>
name:<input type="text" name="name"><br/>
email:<input type="text" name="email"><br/>
<input type="submit" value="가입"><br/>
</form>
// MemberController.java
@PostMapping("/join")
// @ModelAttribute("v") : 커맨드객체를 뷰페이지에서 부를 이름 지정. "v"라고 부르기로 지정.
public String join(@ModelAttribute("v") MemberVo vo) {
System.out.println(vo);
System.out.println("id:" + vo.getId());
System.out.println("pwd:" + vo.getPwd());
return "member/result";
}
// result.jsp
id:${v.id }<br/>
pwd:${v.pwd }<br/>
name:${v.name }<br/>
email:${v.email }<br/>
@RequestParam("tel") String tel
=> String tel = request.getParameter("tel");
폼 양식 값을 읽어서 변수에 담는 어노테이션!
3. ModelAndView (값과 뷰페이지)
- 이동할 뷰페이지 경로 지정 및 뷰페이지에 전달할 값을 담는 객체
-- 뷰페이지 경로는 생성자에서 지정할 수도 있고 setViewName(뷰경로)로 지정할 수도 있다.
- 뷰페이지로 전달할 값은 addObject("뷰페이지에서 부를 이름", 전달할 값); 으로 전달.
(@RequestParam("tel") String tel, @RequestParam(name="num", defaultValue="0") int num)
- 형변환을 자동으로 해준다.
그러나, default 값을 지정하지 않고 파라메터 값을 보내지 않으면 오류가 남.
@RequestMapping("/paramtest")
public ModelAndView paramtest(@RequestParam("tel") String tel, @RequestParam(name="num", defaultValue="0") int num) {
// 입력양식 이름이 "tel"인 파라메터 값을 읽어와서 String tel에 담아라!
ModelAndView mav = new ModelAndView("member/paramtest"); // 생성자에서 뷰 경로지정
//mav.setViewName("member/paramtest"); // 뷰페이지 경로 지정 메서드
mav.addObject("tel", tel);
mav.addObject("num", num);
return mav;
}
4. Map, ModelMap
- new로 선언
@RequestMapping("/ret1")
public Map ret1() {
Map<String, String> map = new HashMap<>();
map.put("val1", "aaa");
map.put("val2", "bbb");
return map;
}
@RequestMapping("/ret2")
public ModelMap ret2() { // 뷰페이지에 전달할 값만 지정. 자동으로 url 따라감.
ModelMap map = new ModelMap();
map.addAttribute("val1", "aaa");
map.addAttribute("val2", "bbb");
return map;
}
- 파라메터로 지정
=> 스프링이 자동으로 객체를 생성해서 넣어줌.
==> return을 하지 않아도 파라메터 값이 자동으로 뷰페이지로 전달됨.
// Map, ModelMap 파람으로 받으면 자동으로 뷰페이지로 전달
@RequestMapping("/ret3")
public void ret3(Map<String, String> map) {
map.put("val1", "aaa");
map.put("val2", "bbb");
}
@RequestMapping("/ret4")
public void ret4(ModelMap map) {
map.addAttribute("val1", "aaa");
map.addAttribute("val2", "bbb");
}
5. session 사용
- request mapping 메서드의 파라메터로 받아서 사용.
@GetMapping("url")
public void test(HttpSession session) {
session.setAttribute("id", "aaa");
}
// login.jsp
<form action="/member/login" method="post">
id:<input type="text" name="id"><br/>
pwd:<input type="password" name="pwd">
<input type="submit" value="로그인">
</form>
// MemberController
@PostMapping("/login")
public String login(MemberVo vo, HttpSession session) { // 세션을 자동으로 생성해줌
String id="aaa", pwd="111";
String msg = "로그인 실패..";
if (id.equals(vo.getId()) && pwd.equals(vo.getPwd())) {
session.setAttribute("loginId", id);
msg="로그인 성공!";
}
session.setAttribute("msg", msg);
return "member/result";
}
// result.jsp
<h3>로그인 처리 결과</h3>
${msg }<br/>
${sessionScope.loginId }
https://intheham.tistory.com/85