우당탕탕 개발일지
64일차_MyBatis & Spring MVC 본문
[ MyBatis ]
환경설정: pom.xml
applicationContext.xml
[ MyBatis 예제 ]
예제1. XML
프로젝트명 : Chapter05_XML
* 이전 시간의 프로젝트와 동일
Spring 환경 설정 파일
applicationContext.xml
sqlSessionFactory
- MyBatis의 SQL 실행과 매핑 기능을 사용할 수 있도록 환경 설정
- configLocation: MyBatis 설정 파일 경로를 지정
- mapperLocations: Mapper.xml 파일 위치 지정
sqlSession
- 다중 스레드 환경에서도 안전하게 사용
- mapper.xml 파일의 sql문과 매핑
- SQL 작업을 간단하게 수행
- selectOne()
- insert()
- update()
- delete()
transactionManager
- JDBC 트랜잭션 관리를 위한 Spring의 트랜잭션 관리자
- 트랜잭션 시작, 커밋, 롤백 등을 담당
- @Transactional 사용 가능
<!-- DB 관련 설정 -->
<!-- Connection Pool & Data Source -->
<context:property-placeholder location="classpath:spring/db.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:spring/mybatis-config.xml"></property> <!-- 환경설정 파일 -->
<property name="mapperLocations" value="classpath:mapper/userMapper.xml"></property> <!-- mapper 파일 위치 -->
</bean>
<!-- SqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"></constructor-arg>
</bean>
<!-- Transaction -->
<!-- @Transactional 사용하기 위해 트랜잭션 관리자 설정 필요 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>
<bean id="userMybatisDAO" class="user.dao.impl.UserMybatisDAO">
<property name="sqlSession" ref="sqlSession"></property>
</bean>
DAO
UserMybatisDAO.java
@Transactional 사용
SqlSession 객체는 xml 파일에서 수정자 주입을 통해 초기화
기존에 mybatis 사용법과 동일
package user.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.transaction.TransactionManager;
import org.springframework.transaction.annotation.Transactional;
import lombok.Setter;
import user.bean.UserDTO;
import user.dao.UserDAO;
@Transactional // 해당 클래스의 모든 메소드에 적용
public class UserMybatisDAO implements UserDAO {
@Setter
private SqlSession sqlSession;
private String userSQL = "userSQL";
@Override
public void write(UserDTO userDTO) {
sqlSession.insert(userSQL + ".write", userDTO);
}
@Override
public List<UserDTO> getUserList() {
List<UserDTO> list = null;
list = sqlSession.selectList(userSQL + ".getUserList");
return list;
}
@Override
public boolean isFindId(String id) {
boolean isFind = false;
int result = sqlSession.selectOne(userSQL + "isFindId", id);
if(result == 1) isFind = true;
return isFind;
}
@Override
public void isUpdate(UserDTO userDTO) {
sqlSession.update(userSQL + "isUpdate", userDTO);
}
@Override
public void isDelete(String id) {
sqlSession.delete(userSQL + ".isDelete", id);
}
}
예제2. ANNO
프로젝트명: Chapter05_ANNO
* 이전 시간의 프로젝트와 동일
Spring 환경 설정 파일
applicationContext.xml
spring과 mybatis 연결하는 정보 모두 제거
java 환경설정 파일의 패키지 등록
주석 처리한 부분은 트랜잭션 매니저 등록을 한 것이다.
이 부분은 @Configuration 파일에서 어노테이션을 사용하여 등록할 수 있다.
@Configuration
SpringConfiguration.java
@EnableTransactionManagement
- Spring 프레임워크에서 트랜잭션 관리를 활성화하는 데 사용
- 자동 커밋, 롤백 등 작업 가능
예제1에서 xml 환경설정 파일에서 정의한 것을 java 환경 설정파일에서 정의함.
각 함수 밑에 주석처리한 부분이 xml 파일에서의 정의했던 내용이다.
sqlSessionFactory()
- xml 파일에서 <property/> 사용
- setter 주입 사용
- 따라서 setter 함수 호출하여 필요한 값 초기화
- interface SqlSessionFactory이기 때문에 class SqlSessionFactoryBean 객체 반환
sqlSession
- xml 파일에서 <constructor-arg/> 사용
- 생성자 주입 사용
- 따라서 객체 생성 시, 필요한 값 초기화
transactionManager
- xml 파일에서 <constructor-arg/> 사용
- 생성자 주입 사용
- 따라서 객체 생성 시, 필요한 값 초기화
package spring.conf;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
//<tx:annotation-driven transaction-manager="transactionManager"/>
@PropertySource("classpath:spring/db.properties")
public class SpringConfiguration {
private @Value("${jdbc.driver}") String driver;
private @Value("${jdbc.url}") String url;
private @Value("${jdbc.username}") String username;
private @Value("${jdbc.password}") String password;
@Bean
public BasicDataSource dataSource() {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(driver);
basicDataSource.setUrl(url);
basicDataSource.setUsername(username);
basicDataSource.setPassword(password);
return basicDataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
// interface SqlSessionFactory & class SqlSessionFactoryBean
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("spring/mybatis-config.xml"));
sqlSessionFactoryBean.setMapperLocations(new ClassPathResource("mapper/userMapper.xml"));
return sqlSessionFactoryBean.getObject(); // getObject(): SqlSessionFactory 변환
}
// <!-- SqlSessionFactory -->
// <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
// <property name="dataSource" ref="dataSource"></property>
// <property name="configLocation" value="classpath:spring/mybatis-config.xml"></property> <!-- 환경설정 파일 -->
// <property name="mapperLocations" value="classpath:mapper/userMapper.xml"></property> <!-- mapper 파일 위치 -->
// </bean>
@Bean
public SqlSessionTemplate sqlSession() throws Exception {
SqlSessionTemplate sqlSsessionTemplate = new SqlSessionTemplate(sqlSessionFactory());
return sqlSsessionTemplate;
}
// <!-- SqlSession -->
// <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
// <constructor-arg ref="sqlSessionFactory"></constructor-arg>
// </bean>
@Bean
public DataSourceTransactionManager transactionManager() {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource());
return dataSourceTransactionManager;
}
// <!-- Transaction -->
// <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
// <constructor-arg ref="dataSource"></constructor-arg>
// </bean>
}
[ Spring MVC ]
1. 흐름도
2. 주요 구성 요소
DispatcherServlet
역할: 제어 (Controller)
클라이언트의 요청을 전달 받는다 컨트롤러에게 클라이언트의 요청을 전달하고 Controller가 리턴한 결과값을 View에 전달하여 응답을 생성하도록 한다
DispatcherServlet이 ViewResolver의 정의 내용을 참고하여 해당하는 파일을 view에게 전송
* Spring Framework 자체에서 제공
HandlerMapping
역할: 요청 URL에 따라 DispatcherServlet이 @Controller 클래스만 찾아갈 수 있도록
* 지금까지 command.properties 파일에서 담당한 작업
[ 작업순서 ]
1. 요청 URL: http://~~~/회.do
2. DispatcherServlet에서 요청 URL를 HandlerMapping 에게 던짐
3. HandlerMapping는 요청 URL과 그에 대응하는 @Controller 클래스의 @RequestMapping(value=" 회.do ") 찾음
예시) 아래와 같이 클래스 3개 있을 경우, AA 클래스 찾아감
@Controller
class AA {
@RequestMapping(value=" 회.do ")
}
class BB {
}
@Controller
class CC {
@RequestMapping(value=" 로.do ")
}
ModelAndView
역할: 컨트롤러가 처리한 결과 정보 담음 (Model)
클라이언트에게 전송할 데이터
클라이언트에게 보여줄 화면 파일 정보
ViewResolver
역할: 화면에 나타날 화면에 대한 파일의 정보 정의
jsp, html 파일 등 화면에 뿌릴 수 있다.
이를 정의 web.xml 파일에 정의한다.
View
역할: 사용자에게 화면 파일 뿌리기 (View)
전송받은 화면 파일을 forward 방식으로 화면에 뿌리기
3. Spring 설정 파일 (WAC)
WAC: Web Application Context
1. web과 관련 O
DispatcherServlet이 생성하는 WAC
- DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록
- 디폴트 설정 파일: /WEB-INF/서블릿이름-servlet.xml으로 설정된다
- 만약에 사용할 이름이 다르거나 설정파일이 여러 개인 경우 contextConfigLocation 파라미터를 추가하여 설정
- 서블릿이름: web.xml에서 설정한 이름
2. web과 관련 X
ContextLoaderListener가 생성하는 Root WAC
- 웹 환경과 독립적인 빈 등록
- 디폴트 설정 파일: /WEB-INF/applicationContext.xml
- 서비스계층과 데이터 액세스 계층을 포함해서 웹 환경과 직접 관련이 없는 모든 빈들을 여기에 등록 한다
- 만약에 사용할 이름이 다르거나 설정파일이 여러 개인 경우 contextConfigLocation 파라미터를 추가하여 설정
[ Spring: Web 예제 ]
프로젝트명: Chapter06
/WEB-INF/web.xml
: DispatcherServlet 서블릿을 정의하고 URL 매핑
/WEB-INF/dispatcherServlet-servlet.xml
: Spring 설정 파일
[ 설정 항목 ]
- 컨트롤러
- 뷰 리졸버
- 핸들러 매핑
- Bean
1. 환경설정 파일
web.xml
- 서블릿 정의
- URL 매핑
dispatcherServlet-servlet.xml
- ViewResolver 등록: viewResolver
- 화면에 보여지는 파일 위치
- Controller 등록 : helloController
- 컨트롤러 등록
2. @Controller
HelloController.java
@Controller
- 컨트롤러 등록
@RequestMapping(value = "hello.do", method = RequestMethod.GET)
- 요청 URL: http://프로젝트명/hello.do
- http Method: GET
ModelAndView
- addObject
- 클라에게 전송하는 Data
- (key, value) 형태
- setView
- 사용자에게 보여지는 화면의 파일명
- 확장자 생략
- dispatcherServlet-servlet.xml에서 등록한 화면 파일에 경로의 hello.jsp 파일 찾음
3. View
hello.jsp
서버에게 받은 result 값 화면에 뿌리기
4. 결과 화면
'비트캠프 > 이론 및 정리' 카테고리의 다른 글
66일차_Spring Project(2) User (0) | 2024.10.10 |
---|---|
65일차_Spring MVC(2) & Spring Project(1) (0) | 2024.10.10 |
63일차_AOP & JDBC (방법 3가지) (1) | 2024.10.04 |
61일차_DI (Dependency Injection) (1) | 2024.10.01 |
60일_Spring Framwork (0) | 2024.09.30 |