본문 바로가기
공부/java & Spring

[전자정부 프레임워크] 전자정부 프레임워크 스프링 부트 프로젝트 MariaDB 연동 후 데이터 출력까지

by 고기 2023. 5. 6.

1. pom.xml에 의존성 추가

2. application.properties 또는 application.yml에 db정보 작성

3. sql mapper작성

4. 작성한 mapper에 대한 bean 설정


 

이번 글에서는 전자정부 프레임워크 스트링 부트 프로젝트에서 MariaDB 연동하는 과정에 대해 작성한다.

연동하는데 필요한 내용은 크게 4가지다. 목차를 참고합시다!

 

전자정부 프레임워크 4.1의 설치와 MariaDB 설치에 대한 과정에 대해서는 다음 링크를 참고하자.

https://1545154.tistory.com/114

 

[전자정부 프레임워크] eGovFrameDev-4.1.0 설치부터 스프링 부트 프로젝트 세팅까지

1. 전자정부 프레임워크 4.1 설치 2. eGovFrame Boot Web Project 프로젝트 생성 3. eGovFrame Web Project / eGovFrame Boot Web Project 차이점 4. 예제 프로젝트 실행 5. MariaDB connect 오늘부터 신나는 재택근무를 하게 되

1545154.tistory.com

 

작성하기 전에 먼저 프로젝트 구조를 확인해보자.

예제 코드를 포함한 egovFrame Boot Web Project를 생성했을 때 구조는 다음과 같다.

 

1.  pom.xml 의존성 추가

추가해야 할 것은 spring과 maria db를 connect 하기 위한 jdbc와 mybatis 의존성이다.

dependencies 스코프 안에 집어넣어주면 된다.

 

이렇게 의존성을 추가해주자.

<!-- maria db Connection -->
<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.2.2</version>
</dependency>

 

저장 후 maven update 후 의존성 추가 되었는지 확인 후 pom.xml 더 이상 볼 일 없으니 꺼버리자.

 

2.  application.yml에 db정보 작성

pom.xml에 추가해줬던 의존성... jdbc driver정보와 maria db 정보를 application.yml에 입력해주자.

 

여기까지는 어려울 게 없다.

spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://127.0.0.1:3306/[database name] 
    username: db user name
    password: db user password

 

3. sql mapper작성 

작업할 디렉터리를 먼저 만듭시다.

사진처럼 java/egovframework 아래에 dbTest라는 패키지를 하나 만들어서 그 아래 controller와 service를 만들고 resources/egovframework/sqlmap 아래에도 dbTestMapper 디렉터리를 만들자.

 

resources/egovframework/sqlmap/dbTestMapper 아래 xml파일을 만들고 다음과 같이 sql문을 작성하면 된다.

namespace, id, resultType에 대한 설명은 아래 service단에서 같이 설명한다.

<?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">

<!-- namespace는 java/egovframework/dbTest/service 경로 -->
<mapper namespace="egovframework.dbTest.service.[mapperfile]">
	
	<!-- id는 service에 interface class에 작성되는 메서드 -->
    <select id="selectTableData" resultType="HashMap">
        select * from qrcol
    </select>
</mapper>​

 

service 아래 dbTestMapper.java 파일을 만들고 mapper interface를 작성하자.

 

1) namespace는 mapper interface가 있는 경로를 적어주면 된다.

2) sql의 id는 mapper interface에 작성된 메서드명을 적어주면 된다.

3) sql의 resultType는 데이터 형식을 적어주면 된다.  

참고로 resultType를 HashMap으로 설정하면 데이터를 {'column1' = 'data', 'column2' = 'data', 'column3' = 'data', ...} 형식으로 받아올 수 있다.

 

일단은 화살표로 표시해봤는데... 말하고 싶은 내용이 잘 전달되었을지 모르겠네.

 

service 아래 dbTestService.java 파일을 만들고 db를 조회하기 위한 service 메서드를 작성하자.

주의할점은 mapper를 사용하기 위해 Service단에 의존성을 주입할 때, 필드 주입을 사용하게 되면 에러가 날 수 있다.

그리고 애초에 생성자 주입을 권장하고 있으니 @Autowired를 사용하지 말고 사진과 같이 생성자 주입 방식을 사용하자.

package egovframework.dbTest.service;

import java.util.HashMap;
import java.util.List;

import org.springframework.stereotype.Service;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class dbTestService {
	
	private final dbTestMapper dbTestMapper;
	
	// @Autowired로 필드 주입하면 에러나니까 생성자 주입을 해줍시다.
	// 애초에 생성자 주입을 권장하기도 하고...
	// 생성자 주입방법
	public dbTestService(dbTestMapper dbTestMapper) {
		this.dbTestMapper = dbTestMapper;
	}
	
	public void selectTableData() {
		List<HashMap<String, Object>> printData = dbTestMapper.selectTableData();
		log.info("printData:"+ printData);
	}
}

 

마지막으로 controller 아래 dbTestController.java 파일을 만들자.

어차피 db data를 정상적으로 받아오는지 확인만 하면 되니까 @RestController를 사용해서 간단하게 확인해보자.

웹 페이지에 찍는것까지 할까 했는데 그러려면 jsp관련 내용까지 작성해야해서 너무 길어질 것 같아 생략했다.

package egovframework.dbTest.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import egovframework.dbTest.service.dbTestService;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class dbTestController {
	
	private dbTestService dbTestService;
	
	public dbTestController(dbTestService dbTestService) {
		this.dbTestService = dbTestService;
	}
	
	@RequestMapping(value="api/dbCall")
	public void dbTestPage() {
		log.info("---");
		// db data를 정상적으로 받아왔으면 service단에서 log가 찍히겠지??
		dbTestService.selectTableData();
	}
}

 

일단 여기까지 코드를 작성하고 프로젝트 빌드 후 실행시켜보자.

(혹시나 실행할 줄 모르는 사람을 위한 친절한 실행방법...)

 

그리고 이렇게 열심히 코드를 작성했는데 bean을 찾을 수 없다는 에러 메세지를 보고 화를 내면 된다.

 

4. mapper bean 설정

아직 설정할 게 남았으니 화를 좀 가라앉히고...

 

에러를 읽어보면 알겠지만 뭐 대충 bean을 못찾는다는 내용이다.

예제 프로젝트에서는 hsqldb를 사용해서 코드를 작성하고 있기 때문에 mariadb 관련 설정과 우리가 작성한 파일의 경로를 추가로 작성해줘야 한다.

 

전자정부 프레임워크 스프링부트 예제코드의 환경설정은 example/config 에서 관리한다.

예제는 hsqldb로 작성되어 있는데, mariadb를 추가로 연결하면 에러가 발생하기 때문에 관련 코드를 주석처리 하면 된다. 

물론 실제로 프로젝트를 진행할 때는 다 지워버리면 되는데 일단 db 연결 후 데이터 출력이 목표이므로 최소한의 설정만 진행한다.

 

EgovConfig에서 환경설정 파일들을 관리하고 있는데, 그 중에서 수정할 환경설정 파일은 EgovConfigDatasource.java와 EgovConfigMapper.java 2개다.

 

먼저 EgovConfigDatasource.java의 Bean을 주석처리하자.

근데 정작 왜 이 부분이 왜 문제가 되는지 hsqldb로 작성된 sql session과 mariadb sql session이 2개 생성되는 것 때문에  bean을 못찾아서 그러는걸까 싶기도 한데... 내가 지식이 부족해서 어떻게 찾아야할지 모르겠어...

package egovframework.example.config;

import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;

@Configuration
public class EgovConfigDatasource {

//	@Bean(name="dataSource")
//	public DataSource dataSource() {
//	    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
//	    return builder.setType(EmbeddedDatabaseType.HSQL).addScript("classpath:/db/sampledb.sql").build();
//	}

}

 

그리고 EgovConfigMapper.java 파일에서 MapperScan 경로와 mapper file의 경로를 추가해주면 된다.

package egovframework.example.config;

import java.io.IOException;
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.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = "egovframework.example.sample.service.impl")

// MapperScan 경로 추가
@MapperScan(basePackages = "egovframework.dbTest.service")
public class EgovConfigMapper {

	@Bean
	public SqlSessionFactoryBean sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws IOException {
		PathMatchingResourcePatternResolver pmrpr = new PathMatchingResourcePatternResolver();
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		sqlSessionFactoryBean.setConfigLocation(pmrpr.getResource("classpath:/egovframework/sqlmap/example/sql-mapper-config.xml"));
		sqlSessionFactoryBean.setMapperLocations(pmrpr.getResources("classpath:/egovframework/sqlmap/example/mappers/*.xml"));		
		
		// mapper file 경로 추가
		sqlSessionFactoryBean.setMapperLocations(pmrpr.getResources("classpath:/egovframework/sqlmap/dbTestMapper/*.xml"));
		return sqlSessionFactoryBean;
	}

	@Bean
	public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}

}

 

이제 프로젝트 빌드 후 실행시켜보면 정상적으로 서버가 올라온다.

 

컨트롤러에 작성했었던 api/dbCall 경로에 접속해보면 정상적으로 db값을 log로 출력하는걸 확인할 수 있다.

 

참고로 일단 여기까지 db 연결이 되는지는 확인했지만 실제로 개발에서 이렇게 가라로 처리하면 안 된다.

어디까지나 개인 공부... 이렇게 하면 된다는 식으로 보여줄 용도로 작성해놓은거고, 예제 샘플 소스를 지우고 사용하거나 아예 새로 작성하는 등 고쳐야 할 부분이 많으니 그 부분은 본인이 선택해서 개발합시다.

 

끝!

댓글