스프링2

오가람·2023년 4월 24일

실무에서 Service는 두개로 나누어서 만든다
-> interface와 class로 나누어짐

Service Interface를 사용하는 이유

  1. 프로젝트에 규칙성을 부여하기 위해서
  2. Spring AOP를 위해서 필요
  3. 클래스간의 결합도를 약화 시키기 위해서 -> 유지보수성 향상

new 객체 대신에 스프링에서는 아래로 쓴다

@Service // 비즈니스로직(데이터 가공, DB 연결)을 처리하는 클래스임을 명시 + bean 등록
public class MemberServiceImpl implements MemberService{

}
 
@Autowired // bean 으로 등록된 객체 중 타입이 같거나, 상속관계인 bean을 주입해주는 역할(자동으로 해줌)
private MemberService service; // -> DI(의존성 주입)

오토와이어드를 쓸려면 선행으로 빈이 등록되어있어야 한다
	
dao는 어노테이션이 @Repository임

Connection을 Service에서 얻어왔던 이유

 - Service의 메서드 하나는 요청을 처리하는 업무 단위
  -> 해당 업무가 끝난 후 트랜잭션을 한번에 처리하기 위해서
  	 어쩔수 없이 Connection을 Service에서 얻어올 수 밖에 없었다.
  
 
 	 Connection을 얻어오거나/반환하거나
	 트랜잭션 처리를 하는 구문을 작성하지 않아도
	 Spring에서 제어를 하기 때문에 Service 구문이 간단해진다.
    
   

Spring Maven Mybatis

스프링에서 설정 해주어야 하는것

스프링에서 Window -> Preferences 선택후 검색창에 xml검색하고
xml Catalog선택 -> User Specified Entries 선택후 add 클릭후 아래 입력

한번더 add 후 아래 입력

config.xml파일 만들어 주기!

src/main/resources 에서 xml파일 생성후(ctrl + N -> Wizards에서 xml -> XML File 선택후)
File name: mybatis-config.xml 입력 후 next버튼 ->
DTD 클릭(두개중에 위에꺼 선택) 후 next 버튼->
xml 카탈로그 선택 후 next 버튼 ->
config 선택후 next 버튼 ->
피니시 버튼

mybatis-config.xml에서 해주어야 하는것들

  • 처음 생성하면 안에
<?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>

src/main/resources 안에 spring안에 root-context.xml

프로그램이 시작되었을때 작성되어야 하는 것들

<?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버튼 ->
피니시

member-mapper.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></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>
profile
개발자준비생

0개의 댓글