일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- javascript
- 스프링
- 프로그레시브웹앱
- TIL
- 국비지원
- js
- CSS
- 메이븐
- sqldeveloper
- 서브쿼리
- tdd
- HTML
- TodayILearned
- javaprogramming
- 오라클
- 자바프로그래밍
- 자바스크립트
- 프레임워크
- web
- sql
- 생활코딩
- JavaScript 내장객체
- maven
- Oracle
- mybatis
- springaop
- SpringMVC
- framework
- progressive web app
- PWA
- Today
- Total
1cm
자바 프로그래밍_Day_107_Spring MVC, mybatis 연동 본문
2022. 01. 17
Spring MVC
Spring Framework 에서는 클라이언트의 화면을 표현하기 위한 View와 서비스를 수행하기 위한 개발 로직 부분을 나누는 MVC2 패턴을 지원한다.
또한 Model, View, Controller 사이의 의존관계를 DI 컨테이너에서 관리하여 유연한 웹 애플리케이션을 쉽게 구현 및 개발할 수 있다.
Spring MVC 요청 처리 과정
DispatcherServlet : FrontControllerServlet이라고도 부른다.(FrontControllerPattern) 하나의 서블릿이 모든 요청을 받고, 그 요청에 대한 처리 로직을 Controller 객체에게 요청 위임을 해준다.
Client에서 요청을 보낸다(member, board 등) -> Dispatcher Servlet에서 해당하는 요청을 찾기 위해 Handler Mapping을 통해 매핑한 요청을 Controller로 넘겨준다.
Spring MVC 구성 요소
구성 요소 | 설명 |
DispatcherServlet | 클라이언트의 요청(Request)을 전달 받고, 요청에 맞는 컨트롤러가 리턴한 결과 값을 View에 전달하여 알맞은 응답(Response)을 생성 |
HandlerMapping | 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정 |
Controller | 클라이언트의 요청을 처리한 뒤, 결과를 DispatcherServlet에게 리턴 |
ModelAndView | 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담음 |
ViewResolver | 컨트롤러의 처리 결과를 생성할 View를 결정 |
View | 컨트롤러의 처리 결과 화면을 생성, JSP나 Velocity 템플릿 파일 등을 View로 사용 |
- web.xml
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<!--
ContextLoaderListener에서 WebApplicationContext를 생성하기 위한 설정 파일의 경로 지
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<!--
스프링에서 제공하는 서블릿 컨텍스트 리스너(웹 애플리케이션의 시작, 종료 이벤트에 대한 이벤트 리스너)를 구현한 리스너이다.
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<!--
DispatcherServlet : 사용자의 모든 요청을 받아주는 용도의 객체이다.
(서블릿마다 독립적인 WebApplicationContext을 갖는다.)
-->
<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>
- HomeController.java
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
<!-- @Component 클래스를 찾아서 Bean으로 등록 -->
<context:component-scan base-package="com.kh.mvc" />
<!--
<annotation-driven />, <context:component-scan base-package="com.kh.mvc" />을 사용하지 않을 경우
아래와 같이 HandlerMapping과 Controller를 명시적으로 bean으로 등록해야 한다.
각 요청을 수행할 Controller들의 클래스를 빈으로 등록하고
<beans:bean id="loginController" class="com.kh.spring.member.controller.LoginController"/>
<beans:bean id="logoutController" class="com.kh.spring.member.controller.LogoutController"/>
HandlerMapping에 각각의 Controller들을 매핑해야 한다.
<beans:bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<beans:property name="mappings">
<beans:props>
<beans:prop key="login.me">loginController</beans:prop>
<beans:prop key="logout.me">logoutController</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
* 잘 안씀
-->
</beans:beans>
- 로그인 처리하는 컨트롤러 생성하기
> MemberController.java
package com.kh.mvc.member.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
// controller가 처리하게 될 요청에 대해 정의함(URL, Method 등)
// @RequestMapping(value = "/login", method = {RequestMethod.GET})
@GetMapping("/login")
// 요청을 처리할 메소드 작성
public String login() {
log.info("login() - 호출");
return "home";
}
}
mvc/login 붙였을 때 잘 호출 되는 것을 확인할 수 있었다.
- 데이터 받기 (서버에 데이터 보내고, 그 데이터를 컨트롤러에서 받기)
> home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
<form action="login" method="post"></form>
<label>아이디 : <input type="text" name="id" required /></label><br>
<label>패스워드 : <input type="password" name="password" required /></label><br><br>
<input type="submit" value="로그인">
</body>
</html>
Request method POST not supported (해당하는 URL을 처리할 수 있는 컨트롤러는 존재, 그러나 POST를 서포트하지 않는다는 에러 발생)
package com.kh.mvc.member.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
// controller가 처리하게 될 요청에 대해 정의함(URL, Method 등)
// @RequestMapping(value = "/login", method = {RequestMethod.GET})
@GetMapping("/login")
// 요청을 처리할 메소드 작성
public String login() {
log.info("login() - 호출");
return "home";
}
사용자의 파라미터를 전송받는 방법
1. HttpServletRequest를 통해서 전달(전송)받기(기존 JSP/Servlet 방식)
- 메소드의 매개 변수로 HttpServletRequest를 작성하면 메소드 실행 시 스프링 컨테이너가 자동으로 객체를 인자로 주입해준다.
@PostMapping("/login")
public String login(HttpServletRequest request) {
String id = request.getParameter("id");
String password = request.getParameter("password");
log.info("login() - 호출 : {} {}", id, password);
return "home";
}
2-1. @RequestParam 어노테이션을 통해서 전송받기
- 스프링에서 조금 더 간편하게 파라미터를 받아올 수 있는 방법 중 하나이다.
- 내부적으로는 Request 객체를 이용해서 데이터를 전송받는 방법이다.
- 단, 매개변수의 이름과 name 속성의 값이 동일하게 설정된 경우 자동으로 주입된다.
(어노테이션을 사용하는 것이 아니기 때문에 defaultValue 설정이 불가능하다.)
@RequestMapping(value = "login", method= {RequestMethod.POST})
// public String login(@RequestParam("id") String id, @RequestParam("password") String password) {
public String login(String userId, String password) {
// name 속성의 갑소가 매개변수의 명이 같으면 어노테이션 생략이 가능
public String login(String id, String password) {
log.info("login() - 호출 : {} {}", id, password);
return "home";
}
2-2. @RequestParam에 default 값 설정
- defaultValue 속성을 사용하면 파라미터 name 속성에 값이 없을 경우 기본값을 지정할 수 있다.
@PostMapping("/login")
public String login(@RequestParam("id") String id,
@RequestParam(value = "password", defaultValue = "0000") String password) {
log.info("login() - 호출 : {} {}", id, password);
return "home";
}
2-3. @RequestParam에 실제 존재하지 않는 파라미터를 받으려고 할 때
- 파라미터 name 속성에 없는 값이 넘어올 경우 에러가 발생한다.
- @RequestParam(required = false)로 지정하면 null 값을 넘겨준다.
- 단, defaultValue를 설정하면 defaultValue에 설정된 값으로 넘겨준다. (에러가 발생하지 않음)
@PostMapping("/login")
public String login(@RequestParam("id") String id,
@RequestParam(value = "password") String password,
// @RequestParam(value = "address", required = false)String address) {
@RequestParam(value = "address", defaultValue = "서울특별시") String address) {
log.info("login() - 호출 : {} {} {}", new Object[] {id, password, address});
return "home";
}
3. @PathVariable 어노테이션을 통해서 전송받기 (restAPI시 많이 사용)
- URL 패스상에 있는 특정 값을 가져오기 위해 사용하는 방법이다.
- REST API를 사용할 때, 요청 URL 상에서 필요한 값을 가져오는 경우 주로 사용한다.
- 매핑 URL에 {}로 묶는다면, {} 안의 값을 Path Variable로 사용하고 요청 시 실제 경로상의 값을 해당 Path Variable로 받겠다는 의미이다.
- 매핑 URL에 {} 안의 변수명과 매개변수의 변수명이 동일하다면 @PathVariable의 괄호는 생략이 가능하다.
(어노테이션 자체는 생략이 안된다. @RequestParam인지 @PathVariable인지 알 수 없음)
@GetMapping("/member/{id}")
// public String findMember(@PathVariable("id") String id) {
public String findMember(@PathVariable String id) {
log.info("Member ID : {}", id);
return "home";
}
4. @ModelAttribute 어노테이션을 통해서 전송받기 (파라미터가 많을 경우)
- 요청 파라미터가 많은 경우 객체 타입으로 파라미터를 넘겨받는 방법이다.
- 스프링 컨테이너가 기본 생성자를 통해서 객체를 생성하고
파라미터 NAME 속성의 값과 동일한 필드명을 가진 필드에 값을 주입해준다.
- 단, 기본 생성자와 Setter가 존재해야 한다.
- @ModelAttribute 어노테이션을 생략해도 객체로 매핑된다.
*/
@PostMapping("/login")
// public String login(@ModelAttribute Member member) {
public String login(Member member) {
log.info("{}, {}", member.getId(), member.getPassword());
return "home";
}
- MVC 패턴으로 코드 작성
private MemberService service;
/*
* 로그인 처리
*/
@PostMapping("/login")
public String login(@RequestParam("id")String id, @RequestParam String password) {
log.info("{}, {}", id, password);
Member member = service.login(id, password);
System.out.println(member);
return "home";
}
-> 인터페이스 생성
package com.kh.mvc.member.model.service;
import com.kh.mvc.member.model.vo.Member;
public interface MemberService {
Member login(String id, String password);
}
@Service
package com.kh.mvc.member.model.service;
import org.springframework.stereotype.Service;
import com.kh.mvc.member.model.dao.MemberDao;
import com.kh.mvc.member.model.vo.Member;
@Service
public class MemberServiceImpl implements MemberService {
private MemberDao dao;
@Override
public Member login(String id, String password) {
Member member = null;
member = dao.findMemberById(id);
return member();
}
}
MemberDao에 대한 인터페이스 생성
package com.kh.mvc.member.model.dao;
import com.kh.mvc.member.model.vo.Member;
public interface MemberDao {
Member findMemberById(String id);
}
MemberDaoImpl 생성
package com.kh.mvc.member.model.dao;
import org.springframework.stereotype.Repository;
import com.kh.mvc.member.model.vo.Member;
@Repository
public class MemberDaoImpl implements MemberDao {
@Override
public Member findMemberById(String id) {
return new Member();
}
}
Dao를 사용하는 서비스에서 @Autowired를 통해 주입받음
라이브러리 추가
01. Mybatis에서 작업했던 설정파일들 MVC프로젝트에도 복붙
Mybatis-context 생성
root-context.xml에서 mybatis-context를 참조할수있게 import해준다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<import resource="mybatis-context.xml" />
</beans>
sqlSessionTemplate를 빈으로 만들기
기존 mybatis-config.xml파일에서 작성했던 것들을 mybatis-context.xml에 p태그들을 활용해 bean으로 등록해줬다.
<?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:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close"
p:driverClassName="oracle.jdbc.driver.OracleDriver"
p:url="jdbc:oracle:thin:@localhost:1521:xe"
p:username="WEB"
p:password="WEB"
/>
<bean id="mybatisConfig" class="org.apache.ibatis.session.Configuration"
p:jdbcTypeForNull="NULL"
/>
<!--
p:configLocation="classpath:mybatis-config.xml"
p:configuration-ref=""
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:configuration-ref="mybatisConfig"
p:mapperLocations="classpath:mappers/**/*.xml"
p:typeAliasesPackage="com.kh.mvc.*.model.vo"
p:dataSource-ref="dataSource"
/>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"
c:sqlSessionFactory-ref="sqlSessionFactory"
/>
</beans>
전체 실습 코드
> MemberController.java
package com.kh.mvc.member.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.kh.mvc.member.model.service.MemberService;
import com.kh.mvc.member.model.service.MemberServiceImpl;
import com.kh.mvc.member.model.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
/*
// controller가 처리하게 될 요청에 대해 정의함(URL, Method 등)
// @RequestMapping(value = "/login", method = {RequestMethod.GET})
@GetMapping("/login")
// 요청을 처리할 메소드 작성
public String login() {
log.info("login() - 호출");
return "home";
}
사용자의 파라미터를 전송받는 방법
1. HttpServletRequest를 통해서 전달(전송)받기(기존 JSP/Servlet 방식)
- 메소드의 매개 변수로 HttpServletRequest를 작성하면 메소드 실행 시 스프링 컨테이너가 자동으로 객체를 인자로 주입해준다.
@PostMapping("/login")
public String login(HttpServletRequest request) {
String id = request.getParameter("id");
String password = request.getParameter("password");
log.info("login() - 호출 : {} {}", id, password);
return "home";
}
2-1. @RequestParam 어노테이션을 통해서 전송받기
- 스프링에서 조금 더 간편하게 파라미터를 받아올 수 있는 방법 중 하나이다.
- 내부적으로는 Request 객체를 이용해서 데이터를 전송받는 방법이다.
- 단, 매개변수의 이름과 name 속성의 값이 동일하게 설정된 경우 자동으로 주입된다.
(어노테이션을 사용하는 것이 아니기 때문에 defaultValue 설정이 불가능하다.)
@RequestMapping(value = "login", method= {RequestMethod.POST})
// public String login(@RequestParam("id") String id, @RequestParam("password") String password) {
public String login(String userId, String password) {
// name 속성의 갑소가 매개변수의 명이 같으면 어노테이션 생략이 가능
public String login(String id, String password) {
log.info("login() - 호출 : {} {}", id, password);
return "home";
}
2-2. @RequestParam에 default 값 설정
- defaultValue 속성을 사용하면 파라미터 name 속성에 값이 없을 경우 기본값을 지정할 수 있다.
@PostMapping("/login")
public String login(@RequestParam("id") String id,
@RequestParam(value = "password", defaultValue = "0000") String password) {
log.info("login() - 호출 : {} {}", id, password);
return "home";
}
2-3. @RequestParam에 실제 존재하지 않는 파라미터를 받으려고 할 때
- 파라미터 name 속성에 없는 값이 넘어올 경우 에러가 발생한다.
- @RequestParam(required = false)로 지정하면 null 값을 넘겨준다.
- 단, defaultValue를 설정하면 defaultValue에 설정된 값으로 넘겨준다. (에러가 발생하지 않음)
@PostMapping("/login")
public String login(@RequestParam("id") String id,
@RequestParam(value = "password") String password,
// @RequestParam(value = "address", required = false)String address) {
@RequestParam(value = "address", defaultValue = "서울특별시") String address) {
log.info("login() - 호출 : {} {} {}", new Object[] {id, password, address});
return "home";
}
3. @PathVariable 어노테이션을 통해서 전송받기 (restAPI시 많이 사용)
- URL 패스상에 있는 특정 값을 가져오기 위해 사용하는 방법이다.
- REST API를 사용할 때, 요청 URL 상에서 필요한 값을 가져오는 경우 주로 사용한다.
- 매핑 URL에 {}로 묶는다면, {} 안의 값을 Path Variable로 사용하고 요청 시 실제 경로상의 값을 해당 Path Variable로 받겠다는 의미이다.
- 매핑 URL에 {} 안의 변수명과 매개변수의 변수명이 동일하다면 @PathVariable의 괄호는 생략이 가능하다.
(어노테이션 자체는 생략이 안된다. @RequestParam인지 @PathVariable인지 알 수 없음)
@GetMapping("/member/{id}")
// public String findMember(@PathVariable("id") String id) {
public String findMember(@PathVariable String id) {
log.info("Member ID : {}", id);
return "home";
}
4. @ModelAttribute 어노테이션을 통해서 전송받기 (파라미터가 많을 경우)
- 요청 파라미터가 많은 경우 객체 타입으로 파라미터를 넘겨받는 방법이다.
- 스프링 컨테이너가 기본 생성자를 통해서 객체를 생성하고
파라미터 NAME 속성의 값과 동일한 필드명을 가진 필드에 값을 주입해준다.
- 단, 기본 생성자와 Setter가 존재해야 한다.
- @ModelAttribute 어노테이션을 생략해도 객체로 매핑된다.
@PostMapping("/login")
// public String login(@ModelAttribute Member member) {
public String login(Member member) {
log.info("{}, {}", member.getId(), member.getPassword());
return "home";
}
*/
@Autowired
private MemberService service;
/*
* 로그인 처리
*/
@PostMapping("/login")
public String login(@RequestParam("id")String id, @RequestParam String password) {
log.info("{}, {}", id, password);
Member member = service.login(id, password);
System.out.println(member);
return "home";
}
}
> MemberServiceImpl.java
package com.kh.mvc.member.model.service;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.kh.mvc.member.model.dao.MemberDao;
import com.kh.mvc.member.model.vo.Member;
//@Service("빈 ID")
@Service
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberDao dao;
@Autowired
private SqlSession session;
@Override
public Member login(String id, String password) {
Member member = null;
member = dao.findMemberById(session, id);
return member;
}
}
> MemberService.java
package com.kh.mvc.member.model.service;
import com.kh.mvc.member.model.vo.Member;
public interface MemberService {
Member login(String id, String password);
}
> 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<import resource="mybatis-context.xml" />
</beans>
> servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
<!-- @Component 클래스를 찾아서 Bean으로 등록 -->
<context:component-scan base-package="com.kh.mvc" />
<!--
<annotation-driven />, <context:component-scan base-package="com.kh.mvc" />을 사용하지 않을 경우
아래와 같이 HandlerMapping과 Controller를 명시적으로 bean으로 등록해야 한다.
각 요청을 수행할 Controller들의 클래스를 빈으로 등록하고
<beans:bean id="loginController" class="com.kh.spring.member.controller.LoginController"/>
<beans:bean id="logoutController" class="com.kh.spring.member.controller.LogoutController"/>
HandlerMapping에 각각의 Controller들을 매핑해야 한다.
<beans:bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<beans:property name="mappings">
<beans:props>
<beans:prop key="login.me">loginController</beans:prop>
<beans:prop key="logout.me">logoutController</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
* 잘 안씀
-->
</beans:beans>
> home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
<form action="login" method="post">
<label>아이디 : <input type="text" name="id" required /></label><br>
<label>패스워드 : <input type="password" name="password" required /></label><br><br>
<input type="submit" value="로그인">
</form>
</body>
</html>
> MemberDao.java
package com.kh.mvc.member.model.dao;
import org.apache.ibatis.session.SqlSession;
import com.kh.mvc.member.model.vo.Member;
public interface MemberDao {
Member findMemberById(SqlSession session, String id);
}
> MemberDaoImpl.java
package com.kh.mvc.member.model.dao;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.kh.mvc.member.model.vo.Member;
@Repository
public class MemberDaoImpl implements MemberDao {
@Override
public Member findMemberById(SqlSession session, String id) {
return session.selectOne("memberMapper.selectMemberById",id);
}
}
> mybatis-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:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close"
p:driverClassName="oracle.jdbc.driver.OracleDriver"
p:url="jdbc:oracle:thin:@localhost:1521:xe"
p:username="WEB"
p:password="WEB"
/>
<bean id="mybatisConfig" class="org.apache.ibatis.session.Configuration"
p:jdbcTypeForNull="NULL"
/>
<!--
p:configLocation="classpath:mybatis-config.xml"
p:configuration-ref=""
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:configuration-ref="mybatisConfig"
p:mapperLocations="classpath:mappers/**/*.xml"
p:typeAliasesPackage="com.kh.mvc.*.model.vo"
p:dataSource-ref="dataSource"
/>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"
c:sqlSessionFactory-ref="sqlSessionFactory"
/>
</beans>
'국비지원_Java > Java Programming_2' 카테고리의 다른 글
자바 프로그래밍_Day_109_회원정보 관련 (0) | 2022.02.18 |
---|---|
자바 프로그래밍_Day_108_로그인, 로그아웃, 회원가입 구현 (0) | 2022.02.18 |
자바 프로그래밍_Day_106_Spring AOP / Annotation (0) | 2022.02.07 |
자바 프로그래밍_Day_105_Spring AOP (0) | 2022.02.02 |
자바 프로그래밍_Day_104_Spring DI / AOP (0) | 2022.01.31 |