Spring (main 파일 추가, Test 설정, SampleDAO 주입, 인터페이스 활용, 웹프로젝트를 위한 준비, 데이터 소스 구성, MariaDB, HikariCP, MyBatis, MyBatis 연동, 스프링 설정, Mapper 인터페이스, SqlSessionFactory)
1. 파일 추가
- 각 폴더에 해당 이름에 파일들 추가 sample에 자바 파일 두개
- root-context.xml 추가
- 파란 텍스트 클릭
- OK 클릭
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.example.spring_project_02.sample.SampleDAO"></bean>
<bean class="com.example.spring_project_02.sample.SampleService"></bean>
</beans>
- root-context.xml에 bean 2줄 추가
- (각자 프로젝트 마다 경로 차이 있음)
2. Test 설정
- SampleService > 우클릭 > go to > test > create test > OK
- 한 번에 원인 찾을 시 상당히 어려워서 중간 중간 테스트 하면서 진행 할 수 있도록 도와주는 테스트 기능
// SampleServiceTest
package com.example.spring_project_02.sample;
import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.*;
@Log4j2
@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/root-context.xml")
class SampleServiceTest {
@Autowired
private SampleService sampleService;
@Test
public void testService1() {
log.info(sampleService);
Assertions.assertNotNull(sampleService);
}
}
- 생성된 SampleServiceTest 파일에 위 코드 추가
- 테스트 코드는 메서드 단위로 실행 가능
- 옆에 플레이버튼 누르면 테스트 됨
- INFO ~ 줄이 Log INFO 관련.
- INFO [해당 파일 경로] ~줄이 테스트 결과
3. SampleDAO 주입하기
- SampleDAO에 아래 코드 작성
package com.example.spring_project_02.sample;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
@ToString
public class SampleService {
@Autowired
private SampleDAO sampleDAO;
}
- 다시 Test를 실행하면 sampleDAO 객체가 주입된 것을 확인
4. @Repository, @Service
- @Controller : MVC의 컨트롤러를 위한 어노테이션
- @Service : 서비스 계층의 객체를 위한 어노테이션
- @Repository : DAO와 같은 객체를 위한 어노테이션
- @Component : 일반 객체나 유틸리티 객체를 위한 어노테이션
- 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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.spring_project_02.sample"/>
<!-- <bean class="com.example.spring_project_02.sample.SampleDAO"></bean>-->
<!-- <bean class="com.example.spring_project_02.sample.SampleService"></bean>-->
</beans>
- SampleDAO에 @Repository 추가
package com.example.spring_project_02.sample;
import org.springframework.stereotype.Repository;
@Repository
public class SampleDAO {
}
- SampleService에 어노테이션 추가
package com.example.spring_project_02.sample;
import lombok.ToString;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ToString
@Log4j2
@Service
public class SampleService {
@Autowired
private SampleDAO sampleDAO;
}
- TEST 실행 > 정상 작동 확인
- 생성자 주입을 편리하게 하기 위해 SampleService 아래 코드로 변경
package com.example.spring_project_02.sample;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ToString
@Log4j2
@Service
@RequiredArgsConstructor
public class SampleService {
@Autowired
private final SampleDAO sampleDAO;
}
5. 인터페이스를 이용한 느슨한 결합
- 인터페이스를 이용하면 실제 객체를 모르고 타입만을 이용해서 코드를 작성하는 일이 가능해 짐
- 1) SampleDAO를 인터페이스로 변경하기
package com.example.spring_project_02.sample;
public interface SampleDAO {
}
- 2) SampleDAOImpl 파일 추가 하고, 코드 작성
package com.example.spring_project_02.sample;
import org.springframework.stereotype.Repository;
@Repository
public class SampleDAOImpl implements SampleDAO {
}
- 3) 다른 SampleDAO 객체로 변경해 보기
- 파일 생성 후 코드 추가
package com.example.spring_project_02.sample;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
@Repository
@Primary
public class EventSampleDAOImpl implements SampleDAO {
}
6. 웹프로젝트를 위한 스프링 준비
- 아래 코드를 build.gradle > 디펜덴시에 추가 후 코끼리 버튼 클릭
implementation 'org.springframework:spring-webmvc:5.3.30'
- main > java > webapp > WEB-INF > web.xml을 아래 코드로 변경
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
- 톰캣으로 실행 후 정상작동 확인
- 아래 2줄이 나온다면 정상
7. 데이터 소스 구성하기
- maven Repository > MariaDB
https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client/3.1.4
- 접속
- build.gradle에 추가
// https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client
implementation 'org.mariadb.jdbc:mariadb-java-client:3.1.4'
- HikariCP 추가
- https://mvnrepository.com/artifact/com.zaxxer/HikariCP/5.0.1
- 접속
- build.gradle에 추가
// https://mvnrepository.com/artifact/com.zaxxer/HikariCP
implementation 'com.zaxxer:HikariCP:5.0.1'
- root-context.xml 에 아래 코드 추가
- 각 PC DB 설정마다 설정 값 다름
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.spring_project_02.sample"/>
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="org.mariadb.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mariadb://localhost:3308/sample_spring_todo"/>
<property name="username" value="root"/>
<property name="password" value="5046"/>
<property name="dataSourceProperties">
<props>
<prop key="cachePreStmts">true</prop>
<prop key="prepStmtCacheSize">250</prop>
<prop key="prepStmtCacheSqlLimit">2040</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
<!-- <bean class="com.example.spring_project_02.sample.SampleDAO"></bean>-->
<!-- <bean class="com.example.spring_project_02.sample.SampleService"></bean>-->
</beans>
- Test 파일에 아래 코드 추가
@Autowired
private DataSource dataSource;
@Test
public void testConncetion() throws Exception {
Connection connection = dataSource.getConnection();
log.info(connection);
Assertions.assertNotNull(connection);
connection.close();
}
- Test 실행해서 정상 작동 확인
- 아래 줄이 나오면 정상 작동
8. MyBatis와 스프링 연동
JDBC > MyBatis > JPA
- MyBatis : 쿼리는 XML에 작업, 메서드 자동 완성
- JPA : 쿼리, 메서드 자동 완성
- MyBatis는 'Sql Mapping Framework'라고 표현
- SQL의 분리 : MyBatis를 이용하면 별도의 파일이나 어노테이션 등을 이용해서 SQL 가능
- 단독으로 실행 가능
- build.gradle에 아래 코드 추가 후 코끼리 클릭
implementation 'org.springframework:spring-jdbc:5.3.30'
implementation 'org.springframework:spring-tx:5.3.30'
- maven repository에 mybatis 검색
- https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.9
- 접속
- mybais-spring
https://mvnrepository.com/artifact/org.mybatis/mybatis-spring
- 접속
- build.gradle 아래 코드 추가
// https://mvnrepository.com/artifact/org.mybatis/mybatis
implementation 'org.mybatis:mybatis:3.5.9'
// https://mvnrepository.com/artifact/org.mybatis/mybatis-spring
implementation 'org.mybatis:mybatis-spring:2.0.7'
9. MyBatis를 위한 스프링 설정 - SqlSessionFactory
MyBatis를 이용하기 위해서는 스프링에 설정해둔 HikariDataSource를 이용해서
SqlSeesionFactory라는 빈을 설정
- root-context.xml에 아래 코드 추가
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
- 톰캣으로 변경 후 실행해서 정상 작동 확인
10. Mapper 인터페이스 활용하기
- mapper > TimeMapper 추가
- 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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd">
<context:component-scan base-package="com.example.spring_project_02.sample"/>
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="org.mariadb.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mariadb://localhost:3308/sample_spring_todo"/>
<property name="username" value="root"/>
<property name="password" value="5046"/>
<property name="dataSourceProperties">
<props>
<prop key="cachePreStmts">true</prop>
<prop key="prepStmtCacheSize">250</prop>
<prop key="prepStmtCacheSqlLimit">2040</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<mybatis:scan base-package="com.example.spring_project_02.mapper"/>
<!-- <bean class="com.example.spring_project_02.sample.SampleDAO"></bean>-->
<!-- <bean class="com.example.spring_project_02.sample.SampleService"></bean>-->
</beans>
- TimeMapper에서 go to > test 눌러서 test 파일 생성
- 생성된 TimeMapperTest 파일에 아래 코드 작성
package com.example.spring_project_02.mapper;
import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.*;
@Log4j2
@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/root-context.xml")
public class TimeMapperTest {
@Autowired(required = false)
private TimeMapper timeMapper;
@Test
public void testGetTimer() {
log.info(timeMapper.getTime());
}
}
- 테스트 실행하여 정상 작동 확인
공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.
부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.
읽어주셔서 감사합니다 :)