(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 위에서 아래로 순서 지켜야함
tx:annotation-driven -> namespaces -> tx(check)[OK]
<tx:annotation-driven transaction-manager="transactionManager"/>
// 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>
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 이라고 한다.
@Component
해당 클래스를 bean으로 등록하라고 프로그램에게 알려주는 주석(Annotation)
@RequestMapping("/member")
localhost:8080/comm/member 이하의 요청을 처리하는 컨트롤러
// private MemberService service = new MemberServiceImpl();
IOC (제어의 역전) : new 연산자를 통해서 개발자가 직접 객체 생성하지 않는다.
@Autowired // bean으로 등록된 객체 중 타입이 같거나, 상속관계인 bean을 주입해주는 역할
private MemberService service; // -> DI(의존성 주입) / @Service가 선행되어야 함
모든 메서드가 추상 메서드 이다(묵시적으로 public abstract)
모든 필드는 상수 이다 (묵시적으로 public static final)
private MemberService service = new MemberServiceImpl(); IOC (제어의 역전) : new 연산자를 통해서 개발자가 직접 객체 생성하지 않는다.
@Autowired // bean으로 등록된 객체 중 타입이 같거나, 상속관계인 bean을 주입해주는 역할
private MemberService service; // -> DI(의존성 주입) / @Service가 선행되어야 함
비즈니스로직(데이터 가공, DB 연결)을 처리하는 클래스임을 명시 + bean 등록
@Autowired
private MemberDAO dao;
영속성을 가지는 DB/파일과 연결되는 클래스임을 명시 + bean 등록
DAO는 DB랑 연결하기 위한 Connection이 공통적으로 필요하다!
-> 필드에 선언
@Autowired // root-context.xml에서 생성된 SqlSessionTemplate bean을 의존성 주입(DI)
private SqlSessionTemplate sqlSession;