Spring-Mybatis(Setting)

김덕근·2023년 4월 24일
0

Spring

목록 보기
3/19

(porm.xml -> JDBC, Mybatis, DBCP 관련 라이브러리 적용)
Window -> Preferences xml 검색 -> XML>XML Catalog -> User Specified Entries (Add..)
-> Location, Key(config, mapper) 추가

src/main/resources 안에 XML File -> mybatis-config.xml이름으로(무조건) ->
Create file using a DTD or XML Schema file 선택[next>] -> Select XML Catalog entry (User Specified Entries -> config 3.0 선택)[next>] -> 완료

- Config

Location : http://mybatis.org/dtd/mybatis-3-config.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Config 3.0//EN

- Mapper

Location : http://mybatis.org/dtd/mybatis-3-mapper.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Mapper 3.0//EN

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>

	<!-- SqlSessionTemplate 관련 설정 -->
	<settings>
		<!-- insert / update 진행 시 null 이 포함되어있는 경우
			Mybatis는 기본적으로 error를 발생시키지만
			해당 구문이 작성되면 지정된 value 값을 insert/update 시킨다.
			** 소문자 null은 오류 발생!! 무조건 대문자 NULL **
		 -->
		<setting name="jdbcTypeForNull" value="NULL"/>
	</settings>

	<!-- 별칭 작성 부분 -->
	<!-- VO 클래스의 패키지명 + 클래스명 모두 작성하는것이 불편하기 때문에 짧은 별칭 부여 -->
	<typeAliases></typeAliases>

	<!-- SQL이 작성되는 mapper 파일 위치를 등록 -->
	<mappers>
		<!-- 
			<mapper resource="mapper 파일 경로"
				경로를 작성하는 기준(시작지점)은 src/main/resources 폴더
		 -->
		 <mapper resource="/mappers/member-mapper.xml"/>
	</mappers>


</configuration>

settings -> typeAliases -> mappers 위에서 아래로 순서 지켜야함


servlet-context.xml

tx:annotation-driven -> namespaces -> tx(check)[OK]

<tx:annotation-driven transaction-manager="transactionManager"/>

root-context.xml

// private SqlSessionTemplate sqlSession; 객체를 생성하기위한 설정

<?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:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	<!-- 
		root-context.xml 파일
		- web.xml에서 가장 먼저 읽어들이는 설정 파일.
		- 프로젝트 전반적으로 사용되는 자원을 생성(bean 등록)하고 설정하는 파일
		- DB 연결 관련 정보, 트랜잭션 처리, 파일 업로드 등을 작성
	 -->
		
	<!-- 1. DBCP 사용을 위한 DataSource를 bean 등록 -->
	
	<!-- DataSource : java에서 Connection Pool을 지원하기 위한 인터페이스(Connection 상위호환) -->
	<!-- destroy-method="close" : 주어진 세션을 자동으로 반환(close)하는 설정 -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
		<property name="username" value="community"/>
		<property name="password" value="1234"/>
		
		<!-- SQL이 수행된 후 자동으로 Commit 되는것을 지정 -->
		<property name="defaultAutoCommit" value="false"/>
		
		<!-- 커넥션 풀 설정 -->
		<property name="initialSize" value="10" /> <!-- 초기 커넥션 수, 기본 0 -->
		<property name="maxTotal" value="50" /> <!-- 최대 커넥션 수, 기본 8 -->
		<property name="maxIdle" value="20" /> <!-- 유휴 상태로 존재할 수 있는 커넥션 최대 수, 기본 8 -->
		<property name="minIdle" value="10" /> <!-- 유휴 상태로 존재할 수 있는 커넥션 최소 수, 기본 0 -->
		<property name="maxWaitMillis" value="-1" /> <!-- 예외 발생 전 커넥션이 반환 될 떄 까지 대기하는 최대 시간(ms), 기본 -1(무기한) -->
	</bean>
	
	
	
	<!-- SqlSession : sql구문을 DB에 전달, 실행하는 객체 
		SqlSessionFactory : SqlSession을 만드는 객체 
		sqlSessionFactoryBean : mybatis 설정 파일(mybatis-config.xml)과 Connection Pool 정보를 이용하여 SqlSessionFactory를 만드는 객체 
		sqlSessionTemplate : SqlSession 객체에 트랜잭션 처리 역할이 가능하도록 하는 객체 -->

	<!-- 마이바티스 SqlSession 등록하기 (xml 방식으로 bean 등록) -->
	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- mybatis-config.xml 설정 불러오기 -->
		<property name="configLocation" value="classpath:mybatis-config.xml" />
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- SqlSessionTemplate : 기본 SQL 실행 + 트랜잭션 관리 역할을 하는 SqlSession을 생성할 수 있게 하는 객체(Spring bean으로 등록해야함.) -->
	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactoryBean" />
	</bean>

	<!-- 스프링에서 사용하는 proxy를 이용한 트랜잭션 제어가 안될 경우 추가적인 트랜잭션 매니저를 추가해서 문제 해결 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	
	<!-- 
	파일 업로드를 위한 MutipartResolver 구현체 CommonsMultipartResolver  bean 등록 
	-> CommonsMultipartResolver를 bean으로 등록하면
		multipart/form-data 형식으로 요청 시  input type="file" 태그를 자동적으로 인식하여 MultipartFile 객체로 반환하고
		파일 외의 데이터(정수, 문자열 등의 텍스트 데이터)는 기존처럼 사용 가능(MultipartRequest 필요 없음)
	-->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		 <property name="maxUploadSize" value="104857600"/>
		 <property name="maxUploadSizePerFile" value="104857600"/>
		 <property name="maxInMemorySize" value="104857600"/>
	</bean>
	<!-- 
		104857600 byte == 100MB
		20971520 byte == 20MB
		
		maxUploadSize 
			: 한 요청당 업로드가 허용되는 최대 용량을 바이트 단위로 설정.
			-1 은 제한이 없다는 뜻으로 이 프로퍼티를 지정하지 않을때 기본값.
		
		maxUploadSizePerFile
		 : 한 파일당 업로드가 허용되는 최대 용량을 바이트 단위로 설정.
			-1 은 제한이 없다는 뜻으로 이 프로퍼티를 지정하지 않을때 기본값.
			
		maxInMemorySize 
			: 디스크에 저장하지 않고 메모리에 유지하도록 
			허용하는 바이트 단위의 최대 용량을 설정.
			
	 		사이즈가 이보다 클 경우 이 사이즈 이상의 데이터는 파일에 저장됩니다. 
			 기본값은 10240 바이트.
	 -->	
	
		
</beans>

member-mapper.xml

src/main/resources -> mappers folder 생성

mappers folder 안에 -> member-mapper.xml ->
Create file using a DTD or XML Schema file 선택[next>] -> Select XML Catalog entry (User Specified Entries -> mapper 3.0 선택)[next>] -> 완료

xml파일 생성 후

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="memberMapper">
	<!-- mapper 파일 생성 시 반드시 해야되는 것!
		1. cache-ref 태그 삭제
		2. mapper 태그에 namespace 속성 추가
			-> namespace : 해당 파일을 쉽게 부르는 이름(DAO에서 사용)
	
	 -->
	 
	 <!-- 수행하려는 SQL에 따라서 태그가 구분됨(사용 가능한 속성도 다름) 
		 <select id=""></select>
		 <insert id=""></insert>
		 <update id=""></update>
		 <delete id=""></delete>
	 -->
	 
	 <!-- 1. select 태그 속성
	 	1) resultType : 조회 결과가 1행 1열인 경우에만 작성
	 					조회된 데이터의 Java 자료형을 Mybatis 별칭 행태로 작성
	 
	 	[Mybatis 별칭]
		java		:		_int
		Integer		:		int
		String		:		string(java.lang.String)
		
		
			 
	  -->
	 
	 <!-- 조회되는 행의 개수 : 1행 / 조회되는 데이터의 타입 : int 형 -->
	<select id="test1" resultType="_int">
		SELECT COUNT(*) FROM MEMBER
	</select>
	
	<!-- (중요)
		마이바티스에서 #{}, ${} 차이점
		
		#{변수명} : SQL에 값이 포함될 때 양쪽에 '' 추가됨 (pstmt)
					-> 리터럴 사용(값 자체로 사용)
					
		${변수명} : SQL에 값이 포함될 때 양쪽에 '' 추가되지 않음(stmt)
					-> SQL 구문 조합시 사용(condition)			
	 -->
	
	<!-- 조회되는 행의 개수 : 1행 / 파리미터 타입 : String / 조회되는 타입 : String -->
	<select id="test2" parameterType="string" resultType="string" >
		SELECT MEMBER_NICK FROM MEMBER
		WHERE MEMBER_EMAIL = #{memberEmail}
		AND SECESSION_FL = 'N'
	</select>
	 
	 
</mapper>


POJO 기반 프레임워크 : 외부 라이브러리 상속 X

IOC(제어의 역전, 객체 생명주기를 스프링이 관리)를 이용하여 객체 생성
이 때, 스프링이 생성한 객체를 bean 이라고 한다.


Controller

@Component
해당 클래스를 bean으로 등록하라고 프로그램에게 알려주는 주석(Annotation)
@RequestMapping("/member")
localhost:8080/comm/member 이하의 요청을 처리하는 컨트롤러

// private MemberService service = new MemberServiceImpl();
IOC (제어의 역전) : new 연산자를 통해서 개발자가 직접 객체 생성하지 않는다.

@Autowired // bean으로 등록된 객체 중 타입이 같거나, 상속관계인 bean을 주입해주는 역할
private MemberService service; // -> DI(의존성 주입) / @Service가 선행되어야 함


Service Interface를 사용하는 이유

  1. 프로젝트에 규칙성을 부여하기 위해서
  2. Spring AOP를 위해서 필요
    흩어진 관심사 : 소스코드상에서 계속 반복해서 사용되는 부분들
    -> 유지보수를 어렵게 만든다(AspectX)
  3. 클래스 간의 결합도를 약화 시키기 위해서 -> 유지보수성 향상

Interface(implements) 특징

모든 메서드가 추상 메서드 이다(묵시적으로 public abstract)
모든 필드는 상수 이다 (묵시적으로 public static final)

private MemberService service = new MemberServiceImpl(); IOC (제어의 역전) : new 연산자를 통해서 개발자가 직접 객체 생성하지 않는다.
@Autowired // bean으로 등록된 객체 중 타입이 같거나, 상속관계인 bean을 주입해주는 역할
private MemberService service; // -> DI(의존성 주입) / @Service가 선행되어야 함

@Service

비즈니스로직(데이터 가공, DB 연결)을 처리하는 클래스임을 명시 + bean 등록

@Autowired
private MemberDAO dao;

@Repository(DAO)

영속성을 가지는 DB/파일과 연결되는 클래스임을 명시 + bean 등록

DAO는 DB랑 연결하기 위한 Connection이 공통적으로 필요하다!
-> 필드에 선언

  • Mybatis 영속성 프레임워크를 이용하려면 Connection을 이용해 만들어진 객체
    SqlSessionTemplate을 사용

@Autowired // root-context.xml에서 생성된 SqlSessionTemplate bean을 의존성 주입(DI)
private SqlSessionTemplate sqlSession;

profile
안녕하세요!

0개의 댓글