실무에서 Service는 두개로 나누어서 만든다
-> interface와 class로 나누어짐
@Service // 비즈니스로직(데이터 가공, DB 연결)을 처리하는 클래스임을 명시 + bean 등록
public class MemberServiceImpl implements MemberService{
}
@Autowired // bean 으로 등록된 객체 중 타입이 같거나, 상속관계인 bean을 주입해주는 역할(자동으로 해줌)
private MemberService service; // -> DI(의존성 주입)
오토와이어드를 쓸려면 선행으로 빈이 등록되어있어야 한다
dao는 어노테이션이 @Repository임
- Service의 메서드 하나는 요청을 처리하는 업무 단위
-> 해당 업무가 끝난 후 트랜잭션을 한번에 처리하기 위해서
어쩔수 없이 Connection을 Service에서 얻어올 수 밖에 없었다.
Connection을 얻어오거나/반환하거나
트랜잭션 처리를 하는 구문을 작성하지 않아도
Spring에서 제어를 하기 때문에 Service 구문이 간단해진다.
Spring Maven Mybatis
스프링에서 Window -> Preferences 선택후 검색창에 xml검색하고
xml Catalog선택 -> User Specified Entries 선택후 add 클릭후 아래 입력
한번더 add 후 아래 입력
src/main/resources 에서 xml파일 생성후(ctrl + N -> Wizards에서 xml -> XML File 선택후)
File name: mybatis-config.xml 입력 후 next버튼 ->
DTD 클릭(두개중에 위에꺼 선택) 후 next 버튼->
xml 카탈로그 선택 후 next 버튼 ->
config 선택후 next 버튼 ->
피니시 버튼
<?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></configuration>
만 있으므로 configuration 안에 작성을 해주어야 한다.
<configuration>
<!-- SqlSessionTemplate 관련 설정 -->
<settings>
<!-- insert / update 진행 시 null 이 포함되어있는 경우
Mybatis는 기본적으로 error를 발생시키지만
해당 구문이 작성되면 지정된 value로 값을 insert/update 시킨다.
** setting의 value값을 소문자 null은 오류 발생 !! 무조건 대문자 NULL **
-->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<!-- 별칭 작성 부분 -->
<!-- VO클래스의 패키지명 + 클래스명 모두 작성하는것이 불편하기 때문에 짧은 별칭 부여 -->
<typeAliases></typeAliases>
<!-- SQL이 작성되는 mapper 파일 위치를 등록 -->
<mappers>
<!--
<mapper resource="mepper 파일 경로"/>
경로를 작성하는 기준(시작지점)은 src/main/resources 폴더
-->
<mapper resource="/mappers/member-mapper.xml"/>
</mappers>
</configuration>
프로그램이 시작되었을때 작성되어야 하는 것들
<?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 -->
<!--
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>
<!-- <tx:annotation-driven proxy-target-class="true"/> -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--
파일 업로드를 위한 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>
tx 오류 나지 않으려면 해당 파일에서 아래쪽에 Source옆에 namespaces에서 tx를 체크 해준다
리소스 파일아래에 폴더 생성 ->
mappers라고 이름 지정 ->
완료
mappers아래에 xml파일 생성 ->
member-mapper.xml 이름 지정 next 버튼 ->
DTD선택후 next 버튼 ->
xml 선택후 이번엔 mapper선택후 next버튼 ->
피니시
<?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></select>
<insert></insert>
<update></update>
<delete></delete>
-->
<!-- 1. select 태그 속성
1) resultType : 조회 결과가 1행 1열인 경우에만 작성
조회된 데이터의 Java 자료형을 Mybatis 별칭 형태로 작성
[mybatis 별칭]
java : mybatis
int : _int
Integer : int
String : string (java.lang.String)
-->
<!-- 조회되는 행의 개수 : 1행 / 조회되는 데이터의 타입 : int형 -->
<select id="test1" resultType="_int">
SELECT COUNT(*) FROM MEMBER
</select>
<!-- (중요)
마이바티스에서 #{}, ${} 차이점
#{변수명} : SQL에 값이 포함될 때 양쪽에 '' 추가됨
-> 리터럴 사용 (값 자체로 사용)
${변수명} : 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>