본문 바로가기
Back/Spring Boot

[Spring Boot] 프로젝트 생성 및 DB 연동

by 은z 2021. 12. 10.

셋팅 완료된 Explorer 화면

 

 

지난번에 포스팅 했던 Spring Boot 설정 당시에 아래와 같은 WARN이 콘솔에 찍혔다.

No MyBatis mapper was found in~

 

mybaits mappe가 패키지를 찾을 수 없다는 경고이다.

저렇게 찍힌 상태에서도 mybatis 연동도 잘됐고, 데이터를 가져오는 것에는 문제가 전혀 없었다.

그런데 추후에 문제가 발생할 수도 있기에 다시 차근차근 설정 방법을 변경해서 해보았다.

 

 

 

아래 포스팅에서 1번까지는 동일하게 설정하면 된다.

물론 Spring Boot Version은 각자 알아서...다르게!

 

2021.10.09 - [SKILLS/Spring Boot] - [Spring Boot]프로젝트 생성, DB 연동

 

 

 

 

이 포스팅에서는 지난 포스팅 1번에 이어서 pom.xml 설정방법부터 작성하겠다.

 

 

2-0. pom.xml 작성하기 (maven 사용)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.5</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo-6</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>demo-6</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies> 
		<!-- This is a web application -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- Tomcat embedded container -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!-- Need this to compile JSP -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
		</dependency>

		<!-- DB 연동시 연관 디펜던시 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

		<!-- MariaDB -->
		<dependency>
			<groupId>org.mariadb.jdbc</groupId>
			<artifactId>mariadb-java-client</artifactId>
		</dependency>



		<!-- Mybatis -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.1</version>
		</dependency>


		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.25</version>
		</dependency>

		<!-- reload -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		
		<!-- json data -->
		<dependency>
		   <groupId>org.json</groupId>
		   <artifactId>json</artifactId>
		   <version>20180813</version>
		</dependency>
		



	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

- 주석을 참고하여 상황에 맞게 사용하면 된다.

- 기존 포스팅의 mybaits 관련 dependency들은 이클립스 빌드 무한반복 문제를 일으켰고 @Mapper 어노테이션도 사용불가였는데, 위의 dependency는 문제 없고 잘 된다!

 

 

 

2-1. application.properties 작성

application.properties에 DB관련 정보, jsp설정 정보를 적어줌(이부분도 상황에 맞게 조절)

 

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

#mariaDB
spring.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/데이터베이스명
spring.datasource.username=사용자명
spring.datasource.password=



#reload (정적 리소스 재실행시 자동 reload)
spring.devtools.remote.restart.enabled=true



#log (@Slf4j 관련 설정)
logging.level.root=info
logging.level.kr.co.gocamping=debug

 

2-2 . application.properties에 설정한 경로대로 WEB-INF 폴더 생성

[src/main/webapp/WEB-INF/jsp]

 

 

2-3. DatabaseConfig 작성

DB와 관련된 부분이다. 이 부분도 이전 포스팅과 변한 부분이 있으니 참고하기.

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.transaction.annotation.EnableTransactionManagement;
 
@Configuration
@MapperScan(basePackages="kr.co.gocamping.mapper")
@EnableTransactionManagement
public class DatabaseConfig { 
	
  
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setConfigLocation(resolver.getResource("classpath:mybatis-config.xml"));
        sessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
        sessionFactory.setTypeAliasesPackage("kr.co.gocamping.vo");
        return sessionFactory.getObject();
    }
    
    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
      final SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
      return sqlSessionTemplate;
    }
    
    
}

- setTypeAliasesPackage() : 이 메소드는 @Alias("별칭")어노테이션으로 설정된 패키지 경로를 적어준다.

이렇게 설정해두면 Mybatis에서 별칭으로 적힌 것만 적어주면된다. 기존처럼 전체 경로를 적어주지 않아도 된다.

 

아래는 예시~

<?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="kr.co.gocamping.mapper.QnaMapper">

<select id="selectQnaData" resultType="Qna">
	/* QnaMapper.selectQnaData */
	SELECT *
	FROM CAMPING_QUESTION Q INNER JOIN CAMPING_ANSWER A 
	ON Q.QUE_NO = A.QUE_NO 
	WHERE Q.QUE_NO = #{queNo}
</select> 

<select id="selectAnswerData" resultType="Qna">
	/* QnaMapper.selectAnswerData */
	SELECT NO, ANSWER
	FROM CAMPING_ANSWER
	WHERE QUE_NO = #{queNo}
	AND ANS_NO = #{ansNo} 
</select>

</mapper>

 

 

 

 

2-4. mybatis-config.xml작성

2-3에서 작성한 DatabaseConfig.java에서 setConfigLocation() 메소드에 지정해준 파일이다.

보통 DB에서는 스네이크 표기법 (user_name)으로 표기하지만,

코드를 작성할 때는 카멜 표기법(userName)으로 표기하는 것이 관례라고 한다.

(실무와서 처음 듣고.. 처음 배움)

 

아무튼 그래서 DB에서 연동된 mybatis를 이용하여 VO에 리턴값을 받을때 카멜케이스를 적용하고 싶다면

마이바티스 설정파일에서 아래와 같이 작성해주면 된다.

 

<settings>

   <setting name="mapUnderscoreToCamelCase" value="true"/>

</settings>

 

 

데이터베이스 컬럼명 형태가 user_name일 경우 CamelCase형태를 적용시키면 userName로 자동 매핑된다.

VO사용시 해당 변수명에 맞게 매핑이 된다

<?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>
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
		<setting name="callSettersOnNulls" value="true"/>
		<setting name="jdbcTypeForNull" value="NULL"/>
	</settings>
</configuration>

 

 

나머지 부분은 이전 포스팅을 참고하여 마무리하면 된다.

댓글