Controller07 (전체)
@Controller
@RequestMapping("/cont07")
public class Controller07 {
@RequestMapping("/met01")
public String method01(RedirectAttributes rttr) {
System.out.println("cont07 met01 일함!");
rttr.addAttribute("name", "donald");
rttr.addAttribute("address", "ny");
// return "redirect:/cont07/met02?name=john";
return "redirect:/cont07/met02";
}
@RequestMapping("/met02")
public void method02() {
System.out.println("cont07 met02 일함@@");
}
// 첫번째 요청 주소 : /cont07/met03
// 위의 요청의 응답 : redirect:/cont07/met04
// 응답시 쿼리 스트링 ?id=99&city=seoul&country=korea
// 메소드 method03 작성
@RequestMapping("/met03")
public String method03(RedirectAttributes rttr) {
rttr.addAttribute("id", 99);
rttr.addAttribute("city", "seoul");
rttr.addAttribute("country", "korea");
return "redirect:/cont07/met04";
}
@RequestMapping("/met05")
public String method05(HttpSession session) {
session.setAttribute("name", "trump");
return "redirect:/cont07/met06";
}
@RequestMapping("/met06")
public void method06(HttpSession session) {
System.out.println("cont07 met06 일함!");
System.out.println(session.getAttribute("name"));
}
@RequestMapping("/met07")
public String method07(RedirectAttributes rttr) {
rttr.addFlashAttribute("address", "korea");
return "redirect:/cont07/met08";
}
@RequestMapping("/met08")
public void method08(Model model) {
System.out.println(model.asMap().get("address"));
}
// 요청경로 : /cont07/met09
// 응답 : redirect:/cont07/met10
// flash attribute : Bean02 객체를 전달
@RequestMapping("/met09")
public String method09(RedirectAttributes rttr) {
Bean02 bean = new Bean02();
bean.setAddress("seoul");
bean.setCity("korea");
rttr.addFlashAttribute("bean", bean);
return "redirect:/cont07/met10";
}
@RequestMapping("/met10")
public void method10() {
}
같은 request 를 사용하지 않고 서로 다른 request 를 사용하는 경우라면, 1. session 2.쿼리스트링 으로 값을 전달한다
서로 다른 request 사용하는 경우? redirect
RedirectAttributes 객체를 배워보자
@Controller : 스프링이 객체를 만들어서 DispatcherServlet 과 관련된 일을 할 수 있게
@RequestMapping : 어느 경로로 요청이 왔을 때 일해야 하는지
method01, method02
@RequestMapping("/met01")
public String method01() {
System.out.println("cont07 met01 일함!");
return "redirect:/cont07/met02";
}
@RequestMapping("/met02")
public void method02() {
System.out.println("cont07 met02 일함@@");
}
요청: /cont07/met01
met02 로 리디렉트 됨
결과는 method01 의 "cont07 met01 일함!" , method02 의 "cont07 met02 일함@@" 둘 다 출력됨
> 쿼리스트링으로!
@RequestMapping("/met01")
public String method01() {
System.out.println("cont07 met01 일함!");
return "redirect:/cont07/met02?name=john";
}
@RequestMapping("/met02")
public void method02() {
System.out.println("cont07 met02 일함@@");
}
return "redirect:/cont07/met02?name=john";
으로 method02 로 리디렉스하면서 name 값을 쿼리스트링으로 전달해버림
하지만 쿼리스트링으로 복잡한 정보를 전달하기에는 무리가 있음
> RedirectAttributes 으로!
@RequestMapping("/met01")
public String method01(RedirectAttributes rttr) {
System.out.println("cont07 met01 일함!");
rttr.addAttribute("name", "donald");
rttr.addAttribute("address", "ny");
return "redirect:/cont07/met02";
// return "redirect:/cont07/met02?name=john";
}
@RequestMapping("/met02")
public void method02() {
System.out.println("cont07 met02 일함@@");
}
(RedirectAttributes rttr)
rttr.addAttribute(" ", )
return "redirect:/cont07/met02";
- 리디렉트되어 쿼리스트링으로 정보가 같이 전달된다
method03
- 연습
// 첫번째 요청 주소 : /cont07/met03
// 위의 요청의 응답 : redirect:/cont07/met04
// 응답시 쿼리 스트링 ?id=99&city=seoul&country=korea
// 메소드 method03 작성
@RequestMapping("/met03")
public String method03(RedirectAttributes rttr) {
rttr.addAttribute("id", 99);
rttr.addAttribute("city", "seoul");
rttr.addAttribute("country", "korea");
return "redirect:/cont07/met04";
}
method05, method06
@RequestMapping("/met05")
public String method05(HttpSession session) {
session.setAttribute("name", "trump");
return "redirect:/cont07/met06";
}
@RequestMapping("/met06")
public void method06(HttpSession session) {
System.out.println("cont07 met06 일함!");
System.out.println(session.getAttribute("name"));
}
method05 → method06 리디렉트
session 으로 값을 전달
(HttpSession session) 작성
session.setAttribute(" ", )
method06 에서 getAttribute
요청 : cont07/met05
페이지는 met06 으로 리디렉트됨
05 에서 전달한 값이 잘 출력됨
method07, method08
@RequestMapping("/met07")
public String method07(RedirectAttributes rttr) {
rttr.addFlashAttribute("address", "korea");
return "redirect:/cont07/met08";
}
@RequestMapping("/met08")
public void method08(Model model) {
System.out.println(model.asMap().get("address"));
}
RedirectAttributes 를 session 을 통해 값 전달
addFlashAttribute 는 휘발되는 attribute (세션에 남아있지 않고 잠깐 저장되었다 없어짐)
→ 대신 model 에 옮겨져 남겨짐
model 은 내부에서 map 으로 정의되어있기 때문에, 먼저 map 을 꺼낸 후 map 에서 값을 꺼내면 된다
! 쿼리 스트링에는 전달되지 않음
method07 에서 RedirectAttributes rttr, rttr.addFlashAttribute("", ) 로 korea 를 address 에 저장하여 전달
method08 에서 Model model, model.asMap().get("") 로 값을 꺼냄
method 08 리턴타입 void, 경로와 같은 이름의 jsp 로 포워딩
met08
<body>
<h1>${address }</h1>
</body>
method09, method10
연습
// 요청경로 : /cont07/met09
// 응답 : redirect:/cont07/met10
// flash attribute : Bean02 객체를 전달
@RequestMapping("/met09")
public String method09(RedirectAttributes rttr) {
Bean02 bean = new Bean02();
bean.setAddress("seoul");
bean.setCity("korea");
rttr.addFlashAttribute("bean", bean);
return "redirect:/cont07/met10";
}
@RequestMapping("/met10")
public void method10() {
}
이번에는 bean 을 전달
rttr.addFlashAttribute("bean", bean);
method10 에서 경로와 이름 같은 view 파일로 포워딩
Bean02
package org.zerock.controller.p03controller.bean;
import lombok.Data;
@Data
public class Bean02 {
private String city;
private String address;
}
met10
<body>
<h1>${bean.city }</h1>
<h1>${bean.address }</h1>
</body>

maven repository 검색
mariadb 검색 - mariadb java client - 2.7.4 선택하여 maven 탭의 코드를 복사
pom.xml 에 다음과 같이 붙여넣기

jsp 공부할 때 만들었던 db.properties 파일 복사하여 WEB-INF 폴더 안에 붙여넣고
url=jdbc:mariadb://본인 ip/test 추가 작성
root-context.xml 다음과 같이 수정
<?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"
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>
<context:property-placeholder location="classpath:db.properties" />
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource"
class="org.mariadb.jdbc.MariaDbPoolDataSource">
<property name="url" value="${url}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="maxPoolSize" value="1"></property>
</bean>
</beans>
controller.p04controller
Controller08 (전체)
package org.zerock.controller.p04controller;
import java.sql.Connection;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.zerock.controller.p04controller.dao.CustomerDao;
import lombok.Setter;
@Controller
@RequestMapping("/cont08")
public class Controller08 {
@Setter(onMethod_ = @Autowired)
private DataSource dataSource;
@Setter(onMethod_ = @Autowired)
private CustomerDao dao;
@RequestMapping("/met01")
public void method01() {
System.out.println(dataSource);
}
// /cont08/met02?id=5
@RequestMapping("/met02")
public void method02(Integer id) {
System.out.println(dao);
try (Connection con = dataSource.getConnection()) {
System.out.println(dao.getNameById(con, id));
} catch (Exception e) {
e.printStackTrace();
}
}
}
method01
@Setter(onMethod_ = @Autowired)
private DataSource dataSource;
// test
@RequestMapping("/met01")
public void method01() {
System.out.println(dataSource);
}

콘솔창 확인
method02
@Setter(onMethod_ = @Autowired)
private DataSource dataSource;
@Setter(onMethod_ = @Autowired)
private CustomerDao dao = new CustomerDao();
// /cont08/met2?id=1,2,3
@RequestMapping("/met02")
public void method02(Integer id) {
System.out.println(dao);
try (Connection con = dataSource.getConnection()) {
System.out.println(dao.getNameById(con, id));
} catch (Exception e) {
e.printStackTrace();
}
}
dao 객체 생성 (@Setter(onMethod_=@Autowired) 작성)
dao.getNameById 에서 반환받은 값 출력, id 전달
controller.p04controller.dao
CustomerDao
package org.zerock.controller.p04controller.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.springframework.stereotype.Component;
@Component
public class CustomerDao {
public String getNameById(Connection con, Integer id) {
String sql = "SELECT CustomerName FROM Customers WHERE CustomerID = ?";
try (PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmt.setInt(1, id);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
return rs.getString(1);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
요청 : cont08/met02?id=2
id 를 쿼리스트링으로 전달
결과 (콘솔)

* 에러 떠서 root-context.xml 에 값 다 넣어버림 (커밋하지 말것)


MyBatis 와 Spring 연동
maven repository 검색
mybatis 검색 - MyBatis - 3.4.6
코드 복사하여 pom.xml 에 붙여넣기

mybatis spring 검색 - MyBatis spring - 1.3.2
코드 복사하여 pom.xml 에서 방금 붙여넣은 코드 아래에 붙여넣기

spring tx 검색 - spring transaction
아무 버전이나 상관없음 코드 복사하여 방금 붙여넣은 코드 아래 붙여넣기 x2번

그리고 위와 같이 수정
아래 tx → jdbc 로 , 버전은 아래 내려서 있는 버전 복붙
root-context.xml 다음과 같이 수정
<?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:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://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://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.mariadb.jdbc.MariaDbPoolDataSource" destroy-method="close">
<property name="url" value="${db.url}"></property>
<property name="user" value="${db.user}"></property>
<property name="password" value="${db.password}"></property>
<property name="maxPoolSize" value="1"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<context:component-scan base-package="org.zerock.service"></context:component-scan>
<mybatis-spring:scan base-package="org.zerock.mapper"/>
</beans>
org.zerock.mapper.p05mapper 패키지 생성
TimeMapper 인터페이스 생성
TimeMapper
package org.zerock.mapper.p05mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import org.zerock.controller.p05controller.bean.Bean09;
import org.zerock.controller.p05controller.bean.Bean10;
import org.zerock.controller.p05controller.bean.Bean11;
import org.zerock.controller.p05controller.bean.Bean12;
import org.zerock.controller.p05controller.bean.Bean13;
import org.zerock.controller.p05controller.bean.Bean14;
import org.zerock.controller.p05controller.bean.Bean15;
public interface TimeMapper {
@Select("SELECT NOW()")
public String getTime();
@Select("SELECT CustomerName FROM Customers WHERE CustomerID = 1")
public String getCustomerName();
@Select("SELECT LastName FROM Employees WHERE EmployeeID = 1")
public String getLastName();
@Select("SELECT CustomerName FROM Customers WHERE CustomerID = #{id}")
public String getCustomerNameById(Integer id);
@Select("SELECT LastName FROM Employees WHERE EmployeeID = #{id}")
public String getLastNameById(Integer id);
@Select("SELECT CustomerName FROM Customers")
public List<String> getCustomerNames();
// 직원 테이블의 LastName 들을 조회하는 쿼리를 실행하는 메소드(getLastNames) 작성
@Select("SELECT LastName FROM Employees")
public List<String> getLastNames();
annotation 으로 sql 코드 작성
annotation 과 method 만 작성하면 됨
mybatis 가 나머지 구현해줌
#{id}
여러개의 레코드는 리스트로 반환 List<String>
Controller09
method01
@Controller
@RequestMapping("/cont09")
public class Controller09 {
@Setter(onMethod_ = @Autowired)
private TimeMapper mapper;
@RequestMapping("/met01")
public void method01() {
String time = mapper.getTime();
System.out.println(time);
}
@Setter(onMethod_ = @Autowired)
private TimeMapper mapper;
mapper.getTimer
요청 : cont09/met01

method02, method03
@RequestMapping("/met02")
public void method02() {
String name = mapper.getCustomerName();
System.out.println(name);
}
@RequestMapping("/met03")
public void method03(Model model) {
// 3. business logic
String name = mapper.getCustomerName();
// 4. add attribute
model.addAttribute("name", name);
}
mapper.getCustomerName()
method03 에서는 model 객체 이용하여 name 전달해보기 (Model model) - met03 으로 포워딩
met03
<body>
<h1>${name }</h1>
</body>
요청 : cont09/met03
결과

method04
연습
// 요청 경로 : /cont09/met04
// 실행 쿼리 : SELECT LastName FROM Employees WHERE EmployeeID = 1
// 뷰 : /cont09/met04.jsp 에 LastName 출력
// 작성할 메소드 Controller09#method04
// TimeMapper#getLastName();
@RequestMapping("/met04")
public void method04(Model model) {
model.addAttribute("lastName", mapper.getLastName());
}
method03 같은 코드를 한번에 작성
met04
<body>
<h1>${lastName }</h1>
</body>
method05
@RequestMapping("/met05")
public void method05(Integer id) {
String name = mapper.getCustomerNameById(id);
System.out.println(name);
}
id 는 쿼리 스트링으로 작성


method06
연습
// method06 : request parameter "id"값으로 직원 테이블을 조회해서
// 콘솔에 lastName 출력
@RequestMapping("/met06")
public void method06(Integer id) {
System.out.println(mapper.getLastNameById(id));
}
method07
@RequestMapping("/met07")
public void method07() {
List<String> names = mapper.getCustomerNames();
System.out.println(names);
}
여러개의 레코드이므로, getCustomerNames 에서 리스트 반환
List<String> 타입으로 받음
요청 : cont09/met07

method08
연습
// method08 에서 직원들의 LastName 들 조회하고 콘솔에 출력
@RequestMapping("/met08")
public void method08() {
System.out.println(mapper.getLastNames());
}
'course 2021 > Spring' 카테고리의 다른 글
Spring06 - 12/09 (0) | 2021.12.21 |
---|---|
Spring05 - 12/08(controller09~11) (0) | 2021.12.21 |
Spring03 - 12/06(controller04~06) (0) | 2021.12.18 |
Spring02 - 12/03 (0) | 2021.12.16 |
Spring01 - 12/02 (0) | 2021.12.14 |
Controller07 (전체)
@Controller
@RequestMapping("/cont07")
public class Controller07 {
@RequestMapping("/met01")
public String method01(RedirectAttributes rttr) {
System.out.println("cont07 met01 일함!");
rttr.addAttribute("name", "donald");
rttr.addAttribute("address", "ny");
// return "redirect:/cont07/met02?name=john";
return "redirect:/cont07/met02";
}
@RequestMapping("/met02")
public void method02() {
System.out.println("cont07 met02 일함@@");
}
// 첫번째 요청 주소 : /cont07/met03
// 위의 요청의 응답 : redirect:/cont07/met04
// 응답시 쿼리 스트링 ?id=99&city=seoul&country=korea
// 메소드 method03 작성
@RequestMapping("/met03")
public String method03(RedirectAttributes rttr) {
rttr.addAttribute("id", 99);
rttr.addAttribute("city", "seoul");
rttr.addAttribute("country", "korea");
return "redirect:/cont07/met04";
}
@RequestMapping("/met05")
public String method05(HttpSession session) {
session.setAttribute("name", "trump");
return "redirect:/cont07/met06";
}
@RequestMapping("/met06")
public void method06(HttpSession session) {
System.out.println("cont07 met06 일함!");
System.out.println(session.getAttribute("name"));
}
@RequestMapping("/met07")
public String method07(RedirectAttributes rttr) {
rttr.addFlashAttribute("address", "korea");
return "redirect:/cont07/met08";
}
@RequestMapping("/met08")
public void method08(Model model) {
System.out.println(model.asMap().get("address"));
}
// 요청경로 : /cont07/met09
// 응답 : redirect:/cont07/met10
// flash attribute : Bean02 객체를 전달
@RequestMapping("/met09")
public String method09(RedirectAttributes rttr) {
Bean02 bean = new Bean02();
bean.setAddress("seoul");
bean.setCity("korea");
rttr.addFlashAttribute("bean", bean);
return "redirect:/cont07/met10";
}
@RequestMapping("/met10")
public void method10() {
}
같은 request 를 사용하지 않고 서로 다른 request 를 사용하는 경우라면, 1. session 2.쿼리스트링 으로 값을 전달한다
서로 다른 request 사용하는 경우? redirect
RedirectAttributes 객체를 배워보자
@Controller : 스프링이 객체를 만들어서 DispatcherServlet 과 관련된 일을 할 수 있게
@RequestMapping : 어느 경로로 요청이 왔을 때 일해야 하는지
method01, method02
@RequestMapping("/met01")
public String method01() {
System.out.println("cont07 met01 일함!");
return "redirect:/cont07/met02";
}
@RequestMapping("/met02")
public void method02() {
System.out.println("cont07 met02 일함@@");
}
요청: /cont07/met01
met02 로 리디렉트 됨
결과는 method01 의 "cont07 met01 일함!" , method02 의 "cont07 met02 일함@@" 둘 다 출력됨
> 쿼리스트링으로!
@RequestMapping("/met01")
public String method01() {
System.out.println("cont07 met01 일함!");
return "redirect:/cont07/met02?name=john";
}
@RequestMapping("/met02")
public void method02() {
System.out.println("cont07 met02 일함@@");
}
return "redirect:/cont07/met02?name=john";
으로 method02 로 리디렉스하면서 name 값을 쿼리스트링으로 전달해버림
하지만 쿼리스트링으로 복잡한 정보를 전달하기에는 무리가 있음
> RedirectAttributes 으로!
@RequestMapping("/met01")
public String method01(RedirectAttributes rttr) {
System.out.println("cont07 met01 일함!");
rttr.addAttribute("name", "donald");
rttr.addAttribute("address", "ny");
return "redirect:/cont07/met02";
// return "redirect:/cont07/met02?name=john";
}
@RequestMapping("/met02")
public void method02() {
System.out.println("cont07 met02 일함@@");
}
(RedirectAttributes rttr)
rttr.addAttribute(" ", )
return "redirect:/cont07/met02";
- 리디렉트되어 쿼리스트링으로 정보가 같이 전달된다
method03
- 연습
// 첫번째 요청 주소 : /cont07/met03
// 위의 요청의 응답 : redirect:/cont07/met04
// 응답시 쿼리 스트링 ?id=99&city=seoul&country=korea
// 메소드 method03 작성
@RequestMapping("/met03")
public String method03(RedirectAttributes rttr) {
rttr.addAttribute("id", 99);
rttr.addAttribute("city", "seoul");
rttr.addAttribute("country", "korea");
return "redirect:/cont07/met04";
}
method05, method06
@RequestMapping("/met05")
public String method05(HttpSession session) {
session.setAttribute("name", "trump");
return "redirect:/cont07/met06";
}
@RequestMapping("/met06")
public void method06(HttpSession session) {
System.out.println("cont07 met06 일함!");
System.out.println(session.getAttribute("name"));
}
method05 → method06 리디렉트
session 으로 값을 전달
(HttpSession session) 작성
session.setAttribute(" ", )
method06 에서 getAttribute
요청 : cont07/met05
페이지는 met06 으로 리디렉트됨
05 에서 전달한 값이 잘 출력됨
method07, method08
@RequestMapping("/met07")
public String method07(RedirectAttributes rttr) {
rttr.addFlashAttribute("address", "korea");
return "redirect:/cont07/met08";
}
@RequestMapping("/met08")
public void method08(Model model) {
System.out.println(model.asMap().get("address"));
}
RedirectAttributes 를 session 을 통해 값 전달
addFlashAttribute 는 휘발되는 attribute (세션에 남아있지 않고 잠깐 저장되었다 없어짐)
→ 대신 model 에 옮겨져 남겨짐
model 은 내부에서 map 으로 정의되어있기 때문에, 먼저 map 을 꺼낸 후 map 에서 값을 꺼내면 된다
! 쿼리 스트링에는 전달되지 않음
method07 에서 RedirectAttributes rttr, rttr.addFlashAttribute("", ) 로 korea 를 address 에 저장하여 전달
method08 에서 Model model, model.asMap().get("") 로 값을 꺼냄
method 08 리턴타입 void, 경로와 같은 이름의 jsp 로 포워딩
met08
<body>
<h1>${address }</h1>
</body>
method09, method10
연습
// 요청경로 : /cont07/met09
// 응답 : redirect:/cont07/met10
// flash attribute : Bean02 객체를 전달
@RequestMapping("/met09")
public String method09(RedirectAttributes rttr) {
Bean02 bean = new Bean02();
bean.setAddress("seoul");
bean.setCity("korea");
rttr.addFlashAttribute("bean", bean);
return "redirect:/cont07/met10";
}
@RequestMapping("/met10")
public void method10() {
}
이번에는 bean 을 전달
rttr.addFlashAttribute("bean", bean);
method10 에서 경로와 이름 같은 view 파일로 포워딩
Bean02
package org.zerock.controller.p03controller.bean;
import lombok.Data;
@Data
public class Bean02 {
private String city;
private String address;
}
met10
<body>
<h1>${bean.city }</h1>
<h1>${bean.address }</h1>
</body>

maven repository 검색
mariadb 검색 - mariadb java client - 2.7.4 선택하여 maven 탭의 코드를 복사
pom.xml 에 다음과 같이 붙여넣기

jsp 공부할 때 만들었던 db.properties 파일 복사하여 WEB-INF 폴더 안에 붙여넣고
url=jdbc:mariadb://본인 ip/test 추가 작성
root-context.xml 다음과 같이 수정
<?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"
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>
<context:property-placeholder location="classpath:db.properties" />
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource"
class="org.mariadb.jdbc.MariaDbPoolDataSource">
<property name="url" value="${url}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="maxPoolSize" value="1"></property>
</bean>
</beans>
controller.p04controller
Controller08 (전체)
package org.zerock.controller.p04controller;
import java.sql.Connection;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.zerock.controller.p04controller.dao.CustomerDao;
import lombok.Setter;
@Controller
@RequestMapping("/cont08")
public class Controller08 {
@Setter(onMethod_ = @Autowired)
private DataSource dataSource;
@Setter(onMethod_ = @Autowired)
private CustomerDao dao;
@RequestMapping("/met01")
public void method01() {
System.out.println(dataSource);
}
// /cont08/met02?id=5
@RequestMapping("/met02")
public void method02(Integer id) {
System.out.println(dao);
try (Connection con = dataSource.getConnection()) {
System.out.println(dao.getNameById(con, id));
} catch (Exception e) {
e.printStackTrace();
}
}
}
method01
@Setter(onMethod_ = @Autowired)
private DataSource dataSource;
// test
@RequestMapping("/met01")
public void method01() {
System.out.println(dataSource);
}

콘솔창 확인
method02
@Setter(onMethod_ = @Autowired)
private DataSource dataSource;
@Setter(onMethod_ = @Autowired)
private CustomerDao dao = new CustomerDao();
// /cont08/met2?id=1,2,3
@RequestMapping("/met02")
public void method02(Integer id) {
System.out.println(dao);
try (Connection con = dataSource.getConnection()) {
System.out.println(dao.getNameById(con, id));
} catch (Exception e) {
e.printStackTrace();
}
}
dao 객체 생성 (@Setter(onMethod_=@Autowired) 작성)
dao.getNameById 에서 반환받은 값 출력, id 전달
controller.p04controller.dao
CustomerDao
package org.zerock.controller.p04controller.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.springframework.stereotype.Component;
@Component
public class CustomerDao {
public String getNameById(Connection con, Integer id) {
String sql = "SELECT CustomerName FROM Customers WHERE CustomerID = ?";
try (PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmt.setInt(1, id);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
return rs.getString(1);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
요청 : cont08/met02?id=2
id 를 쿼리스트링으로 전달
결과 (콘솔)

* 에러 떠서 root-context.xml 에 값 다 넣어버림 (커밋하지 말것)


MyBatis 와 Spring 연동
maven repository 검색
mybatis 검색 - MyBatis - 3.4.6
코드 복사하여 pom.xml 에 붙여넣기

mybatis spring 검색 - MyBatis spring - 1.3.2
코드 복사하여 pom.xml 에서 방금 붙여넣은 코드 아래에 붙여넣기

spring tx 검색 - spring transaction
아무 버전이나 상관없음 코드 복사하여 방금 붙여넣은 코드 아래 붙여넣기 x2번

그리고 위와 같이 수정
아래 tx → jdbc 로 , 버전은 아래 내려서 있는 버전 복붙
root-context.xml 다음과 같이 수정
<?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:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://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://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.mariadb.jdbc.MariaDbPoolDataSource" destroy-method="close">
<property name="url" value="${db.url}"></property>
<property name="user" value="${db.user}"></property>
<property name="password" value="${db.password}"></property>
<property name="maxPoolSize" value="1"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<context:component-scan base-package="org.zerock.service"></context:component-scan>
<mybatis-spring:scan base-package="org.zerock.mapper"/>
</beans>
org.zerock.mapper.p05mapper 패키지 생성
TimeMapper 인터페이스 생성
TimeMapper
package org.zerock.mapper.p05mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import org.zerock.controller.p05controller.bean.Bean09;
import org.zerock.controller.p05controller.bean.Bean10;
import org.zerock.controller.p05controller.bean.Bean11;
import org.zerock.controller.p05controller.bean.Bean12;
import org.zerock.controller.p05controller.bean.Bean13;
import org.zerock.controller.p05controller.bean.Bean14;
import org.zerock.controller.p05controller.bean.Bean15;
public interface TimeMapper {
@Select("SELECT NOW()")
public String getTime();
@Select("SELECT CustomerName FROM Customers WHERE CustomerID = 1")
public String getCustomerName();
@Select("SELECT LastName FROM Employees WHERE EmployeeID = 1")
public String getLastName();
@Select("SELECT CustomerName FROM Customers WHERE CustomerID = #{id}")
public String getCustomerNameById(Integer id);
@Select("SELECT LastName FROM Employees WHERE EmployeeID = #{id}")
public String getLastNameById(Integer id);
@Select("SELECT CustomerName FROM Customers")
public List<String> getCustomerNames();
// 직원 테이블의 LastName 들을 조회하는 쿼리를 실행하는 메소드(getLastNames) 작성
@Select("SELECT LastName FROM Employees")
public List<String> getLastNames();
annotation 으로 sql 코드 작성
annotation 과 method 만 작성하면 됨
mybatis 가 나머지 구현해줌
#{id}
여러개의 레코드는 리스트로 반환 List<String>
Controller09
method01
@Controller
@RequestMapping("/cont09")
public class Controller09 {
@Setter(onMethod_ = @Autowired)
private TimeMapper mapper;
@RequestMapping("/met01")
public void method01() {
String time = mapper.getTime();
System.out.println(time);
}
@Setter(onMethod_ = @Autowired)
private TimeMapper mapper;
mapper.getTimer
요청 : cont09/met01

method02, method03
@RequestMapping("/met02")
public void method02() {
String name = mapper.getCustomerName();
System.out.println(name);
}
@RequestMapping("/met03")
public void method03(Model model) {
// 3. business logic
String name = mapper.getCustomerName();
// 4. add attribute
model.addAttribute("name", name);
}
mapper.getCustomerName()
method03 에서는 model 객체 이용하여 name 전달해보기 (Model model) - met03 으로 포워딩
met03
<body>
<h1>${name }</h1>
</body>
요청 : cont09/met03
결과

method04
연습
// 요청 경로 : /cont09/met04
// 실행 쿼리 : SELECT LastName FROM Employees WHERE EmployeeID = 1
// 뷰 : /cont09/met04.jsp 에 LastName 출력
// 작성할 메소드 Controller09#method04
// TimeMapper#getLastName();
@RequestMapping("/met04")
public void method04(Model model) {
model.addAttribute("lastName", mapper.getLastName());
}
method03 같은 코드를 한번에 작성
met04
<body>
<h1>${lastName }</h1>
</body>
method05
@RequestMapping("/met05")
public void method05(Integer id) {
String name = mapper.getCustomerNameById(id);
System.out.println(name);
}
id 는 쿼리 스트링으로 작성


method06
연습
// method06 : request parameter "id"값으로 직원 테이블을 조회해서
// 콘솔에 lastName 출력
@RequestMapping("/met06")
public void method06(Integer id) {
System.out.println(mapper.getLastNameById(id));
}
method07
@RequestMapping("/met07")
public void method07() {
List<String> names = mapper.getCustomerNames();
System.out.println(names);
}
여러개의 레코드이므로, getCustomerNames 에서 리스트 반환
List<String> 타입으로 받음
요청 : cont09/met07

method08
연습
// method08 에서 직원들의 LastName 들 조회하고 콘솔에 출력
@RequestMapping("/met08")
public void method08() {
System.out.println(mapper.getLastNames());
}
'course 2021 > Spring' 카테고리의 다른 글
Spring06 - 12/09 (0) | 2021.12.21 |
---|---|
Spring05 - 12/08(controller09~11) (0) | 2021.12.21 |
Spring03 - 12/06(controller04~06) (0) | 2021.12.18 |
Spring02 - 12/03 (0) | 2021.12.16 |
Spring01 - 12/02 (0) | 2021.12.14 |