스프링부트 아님 !!
개발도구 : IntelliJ IDEA 2021.1.3 (Ultimate Edition)
JDK : corretto 11.0.16
DB : MariaDB
스프링부트는 프로젝트를 새로 만들 때, 라이브러리를 편하게 추가해서 사용할 수 있다.
하지만 스프링은
시작이 절반이다... 라는 말이 있듯이 스프링 프로젝트의 세팅이 완료되면 절반을 시작한 것이나 마찬가지이다.
최근 동향으로 새로 시작하는 프로젝트는 Spring Boot로 시작하는 경우가 대부분이고.
Spring 으로 근무를 한다면 유지보수 업무인 경우가 많다고 한다.
// https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client
implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.7'
// https://mvnrepository.com/artifact/org.springframework/spring-core
implementation 'org.springframework:spring-core:5.3.22'
implementation 'org.springframework:spring-test:5.3.22'
implementation 'org.springframework:spring-context:5.3.22'
implementation 'org.springframework:spring-webmvc:5.3.22'
implementation 'org.springframework:spring-jdbc:5.3.22'
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
testCompileOnly 'org.projectlombok:lombok:1.18.24'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
// https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core
implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
implementation 'org.apache.logging.log4j:log4j-api:2.17.1'
implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1'
// https://mvnrepository.com/artifact/com.zaxxer/HikariCP
implementation 'com.zaxxer:HikariCP:5.0.1'
// https://mvnrepository.com/artifact/org.mybatis/mybatis
implementation 'org.mybatis:mybatis:3.5.6'
// https://mvnrepository.com/artifact/org.mybatis/mybatis-spring
implementation 'org.mybatis:mybatis-spring:2.0.7'
위에서부터 순서대로
마리아DB , Spring 기본, lombok, log4j2 , hikariCP, MyBatis, MyBatis-Spring
log4j2.xml ( resources 하위에 추가 )
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd hh:mm:ss} %5p [%c] %m%n"/>
</Console>
</Appenders>
<loggers>
<root level="debug" additivity="true">
<AppenderRef ref="console"/>
</root>
</loggers>
</configuration>
환경설정의 방법에는 xml파일, properties 파일, 자바 파일로 설정하는 방법이 있습니다.
기업들 마다 설정환경이 정해진것이 없어서 모두 해보는걸 목표로 해보겠습니다. 2022-10-07
일단은 자바파일로 설정하는법만 기록 하겠습니다.
https://mybatis.org/spring/ko/getting-started.html
기본 패키지 경로 아래에 config 패키지를 만들고 RootConfig 클래스를 만듭니다.
mybatis-spring 공식문서를 참고해서 sqlsessionfactory 코드를 가져옵니다.
@Configuration
@ComponentScan(basePackages = {"org.zerock.spring1.service" , "org.zerock.spring1.dao"})
@MapperScan( basePackages = {"org.zerock.spring1.mapper"}) // MyBatis-Spring
public class RootConfig {
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();
}
}
datasource() 는 본인의 db환경에 맞게 직접 작성해야합니다.
그러기 위해서 HikariCP 세팅을 해줍니다.
@Bean
public DataSource dataSource(){
HikariConfig config = new HikariConfig();
config.setDriverClassName("org.mariadb.jdbc.Driver");
config.setJdbcUrl("jdbc:mariadb://localhost:3306/ldydb");
config.setUsername("ldyuser");
config.setPassword("ldyuser");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
return new HikariDataSource(config);
}
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {org.zerock.spring1.config.RootConfig.class})
@Log4j2
public class DataSourceTests {
@Autowired
DataSource dataSource;
@Autowired
SqlSessionFactory factory;
@Test
public void testMyBatis(){
log.info(factory);
}
@Test
public void testConnection() throws Exception{
Connection connection = dataSource.getConnection();
log.info(connection);
connection.close();
}
}
sessionfactory 가 만들어졌는지 테스트, mariaDB 연결이 되는지 테스트.
그래도 형식적인 패키지 구조를 잡아줍니다 .
dao 패키지 - TodoDAO 인터페이스 생성
public interface TodoDAO {
}
dao 패키지 - TodoImpli 클래스 생성
@Repository
public class TodoDAOImpli implements TodoDAO{
}
service 패키지 - TodoService 클래스 생성
@Service
@ToString
@RequiredArgsConstructor // 모든 인자를 받는 생성자
public class TodoService {
// DAO 없이는 작동 못하는 녀석이다.
// DAO 인터페이스는 있지만 구현된게 없다.
private final TodoDAO dao;
// Bean = 스프링이 관리하는 객체
}
mapper 패키지 - TodoMapper 인터페이스 생성
public interface TimeMapper {
@Select("select * from ldy_table where no = 1")
@ResultType(LdyDTO.class)
LdyDTO getLdyName();
String getTime2();
}
어노테이션에 쿼리문을 작성하면 TimeMapper.xml 에 쿼리문을 등록 할 필요가 없다.(getLdyName() )
내 생각: 근데 동적쿼리를 만드려면 xml을 더 자주 쓸거같긴 하다.
getTime2() 는 TimeMapper.xml 에 등록 할 예정이다.
resources 하위에 기본 패키지 경로와 같은 이름으로 디렉토리를 만든다.

resources/기본패키지명 하위에 TimeMapper.xml 생성
TimeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zerock.spring1.mapper.TimeMapper">
<select id="getTime2" resultType="string">
select now()
</select>
</mapper>
기왕이면 패키지경로와 똑같은 곳에서 테스트 클래스파일을 만듦
org.zerock.spring1.mapper TimeMapperTest.java
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {org.zerock.spring1.config.RootConfig.class})
@Log4j2
public class TimeMapperTest {
// 인터페이스 타입의 구현체를 만들지 않아도 된다 고 허락해주는 어노테이션
@Autowired(required = false)
TimeMapper timeMapper;
@Test
public void testTime(){
log.info(timeMapper.getClass().getName());
log.info(timeMapper.getLdyName());
}
@Test
public void testTime2(){
log.info(timeMapper.getClass().getName());
log.info(timeMapper.getTime2());
}
}
스프링의 동작원리 에 대해서... 정리를 하고싶지만, 아직 저는 그정도의 레벨이 되지 못했기 때문에 ㅠㅠ
다른 좋은분들의 블로그 주소를 남기고 물러나겠습니다.
Bean = Spring에서 관리하는 객체
@Bean 이 붙은 클래스들은 스프링이 관리하게되고 싱글턴 객체 생성, 의존성 주입등의 서비스를 자동으로 해준다.
@ComponentScan(basePackages = {} ) 의 스캔 대상
@Component: 컴포넌트 스캔에서 사용
@Controlller: 스프링 MVC 컨트롤러에서 사용
@Service: 스프링 비즈니스로직에서 사용 (가시성, 명시성)
@Repository: 스프링 데이터 접근 계층에서 사용
@Configuration: 스프링 설정 정보에서 사용
@ComponentScan의 동작원리와 옵션
https://devraphy.tistory.com/482