우당탕탕 개발일지

64일차_MyBatis & Spring MVC 본문

비트캠프/이론 및 정리

64일차_MyBatis & Spring MVC

ujin302 2024. 10. 7. 19:19
반응형

[ 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()

  1. xml 파일에서 <property/> 사용 
  2. setter 주입 사용
  3. 따라서 setter 함수 호출하여 필요한 값 초기화 
  4. interface SqlSessionFactory이기 때문에 class SqlSessionFactoryBean 객체 반환

sqlSession

  1. xml 파일에서 <constructor-arg/> 사용
  2. 생성자 주입 사용
  3. 따라서 객체 생성 시, 필요한 값 초기화 

transactionManager

  1. xml 파일에서 <constructor-arg/> 사용
  2. 생성자 주입 사용
  3. 따라서 객체 생성 시, 필요한 값 초기화 
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에서 설정한 이름

web.xml: 위치 변경
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