티스토리 뷰
Docker 설치하기
https://docs.docker.com/engine/install/
SpringBoot에서 JDBC를 연결하기 위해서는 먼저 DB 환경이 구축되어 있어야 합니다.
Docker를 사용하여 간단하게 MariaDB를 구축해보도록 하겠습니다.
환경에 맞는 게 Docker Install 하고 설치가 잘 되었는지 확인합니다.
docker -v
DockerFile을 이용하여 Image 만들기
Docker가 설치되었으니 MariaDB 10.4.18 버전을 설치할 DockerFile을 만들고 Image를 만들어 보겠습니다.
mariadb.Dockerfile
## Base Image 지정
FROM mariadb:10.4.18
## TimeZone 환경 변수 지정
ENV TZ Asia/Seoul
## Mariadb root 비밀번호 설정
ENV MYSQL_ROOT_PASSWORD=root
## Mariadb Database 생성
ENV MYSQL_DATABASE=opendata
## TimeZone 설정
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
## 홈 디렉토리
WORKDIR /home/mariadb
## 서비스 배포
EXPOSE 3306
- Docker Image 만들기
mariadb.Dockerfile파일이 있는 경로로 이동한 뒤 build명령어로 Image를 만들어줍니다.
docker build -f mariadb.Dockerfile -t mariadb .
- Docker Image로 Container 만들기
docker run -it -p 3306:3306 mariadb
- Docker Container확인 및 MariaDB 접속하기
# Docker Container보기
docker ps
# MariaDB접속
# docker exec -it "Container ID" mysql -u root -p
docker exec -it 6d646b3764e1 mysql -u root -p
# DB Tool을 사용하여 localhost:3306으로도 접속 가능합니다.
Docker를 이용하여 MariaDB 구축이 되었다면 SpringBoot에서 가져올 테이블 및 데이터를 만들어 주어야 합니다.
# DataBase 이동
USE opendata;
# Table 생성
CREATE TABLE tbl_Movie(
id int not null AUTO_INCREMENT
, repGenreNm varchar(30)
, movieNm varchar(300)
, PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
# Data 입력
INSERT INTO tbl_Movie (repGenreNm, movieNm) VALUES ( '액션', '헌트' );
INSERT INTO tbl_Movie (repGenreNm, movieNm) VALUES ( '액션', '공조2: 인터내셔날' );
INSERT INTO tbl_Movie (repGenreNm, movieNm) VALUES ( '범죄', '리미트' );
INSERT INTO tbl_Movie (repGenreNm, movieNm) VALUES ( '애니메이션', '극장판 엄마 까투리: 도시로 간 까투리 가족' );
SpringBoot JDBC 설정 및 연결하기
JDBC 설정하여 DB와 연결하고 tbl_Movie에 있는 Data를 가져오도록 하겠습니다.
- Gradle에 MariaDB JDBC 추가
- application에 MariaDB 접속 정보 입력
- DAO 객체 생성
- Service 호출
DAO(Data Access Object) 란?
DB를 사용해 CRUD를 조작하는 기능을 전담하도록 만든 오브젝트
DTO(Data Transfer Object) 란?
로직을 가지고 있지 않은 순수한 데이터의 객체이며 객체의 속성과 그 속성의 접근을 위한 Getter 및 Setter 메소드만을 가지고 있다.
VO(Value Object) 란?
DTO와 의미는 같지만 read-Only만 가능합니다.
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client'
application.properties
# jdbc:mariadb://{호스트}:{포트}/{DBMS}?characterEncoding=UTF-8
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/opendata?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
BoxOfficeDao.java
package com.api.opendata.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import com.api.opendata.model.boxoffice.*;
import java.util.List;
@Repository
public class BoxOfficeDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<MovieListModel.Movie> SearchMovie() {
String query = "select * from tbl_Movie";
return jdbcTemplate.query(query, new BeanPropertyRowMapper<MovieListModel.Movie>(MovieListModel.Movie.class));
}
}
BoxOffice.java
package com.api.opendata.process;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.api.opendata.common.util.Utility;
import com.api.opendata.model.boxoffice.*;
import com.api.opendata.dao.BoxOfficeDao;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.List;
@Service
public class BoxOffice {
static String _url = "http://kobis.or.kr";
static final String _key = {발급키};
@Autowired
BoxOfficeDao boxOfficeDao;
public MovieListModel.MovieListResponse SearchMovieList(MovieListModel.MovieListRequest movieListRequest) throws JsonProcessingException
{
ObjectMapper objectMapper = new ObjectMapper();
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
String urlPath = "/kobisopenapi/webservice/rest/movie/searchMovieList.json";
String result = "";
MovieListModel.MovieListResponse response= null;
params.add("key", _key);
params.add("repNationCd", movieListRequest.getRepNationCd());
params.add("movieTypeCd", movieListRequest.getMovieTypeCd());
result = Utility.GetHttp(_url, urlPath, params);
response = objectMapper.readValue(result, MovieListModel.MovieListResponse.class);
return response;
}
public String SearchMovieListDB() throws JsonProcessingException
{
StringBuffer movieListCard = new StringBuffer();
List<MovieListModel.Movie> movieList = boxOfficeDao.SearchMovie();
for(MovieListModel.Movie movie: movieList){
movieListCard.append(movie.getRepGenreNm() + " | " + movie.getMovieNm());
movieListCard.append(System.lineSeparator());
}
return movieListCard.toString();
}
}
BoxOfficeService.java
package com.api.opendata.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.api.opendata.common.util.Utility;
import com.api.opendata.model.boxoffice.*;
import com.api.opendata.process.BoxOffice;
import java.util.HashMap;
@Service
public class BoxOfficeService {
@Autowired
private BoxOffice boxOffice;
public HashMap<String, String> RunSearch(String targetDt)
{
MovieListModel.MovieListRequest movieListRequest = new MovieListModel.MovieListRequest();
MovieListModel.MovieListResponse movieListResponse = null;
HashMap<String, String> result = new HashMap<String, String>();
try{
//MovieList
//movieListRequest.setRepNationCd("22041011"); //한국
movieListRequest.setMovieTypeCd("220101"); //장편
movieListResponse = boxOffice.SearchMovieList(movieListRequest);
result.put("MovieList", MovieListCard(movieListResponse));
//MovieList JDBC
String movieListDB = boxOffice.SearchMovieListDB();
result.put("MovieListDB", movieListDB);
}catch (Exception e){
}
return result;
}
public String MovieListCard(MovieListModel.MovieListResponse movieListResponse){
StringBuffer movieListCard = new StringBuffer();
for(MovieListModel.Movie movie : movieListResponse.getMovieListResult().getMovieList()){
// 대표장르 | 영화명
movieListCard.append(movie.getRepGenreNm() + " | " + movie.getMovieNm());
movieListCard.append(System.lineSeparator());
}
return movieListCard.toString();
}
}
코드 작성이 끝났다면 호출해 보도록 하겠습니다.
http://localhost:8080/api/boxoffice/search?targetDt=20220815
SpringBoot MyBatis 설정 및 연결하기
JDBC로 DB 연결까지는 하였지만 JAVA파일에 직접적으로 SQL문을 작성하고 파라미터를 하나씩 직접 매핑시켜주다 보니 편리와 유지 보수하기가 어렵습니다.
MyBatis는 이를 편하게 해 주기 위해 사용하는 라이브러리로 MyBatis를 설정하여 Data를 가져와 보겠습니다.
- Gradle에 MyBatis 추가
- application에 mapper 경로 설정
- VO 객체 생성
- SQL 작성
- Service 호출
build.gradle
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
application.properties
mybatis.mapper-locations=/mybatis/mapper/*_sql.xml
MovieVO.java
package com.api.opendata.model.boxoffice;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class MovieVO {
private int id;
private String movieNm;
private String repGenreNm;
}
movie_sql.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="BoxOfficeDao">
<select id="searchMovie" resultType="com.api.opendata.model.boxoffice.MovieVO">
SELECT * FROM tbl_Movie
</select>
</mapper>
BoxOfficeDao.java
@Autowired
private SqlSessionTemplate sqlSession;
public List<MovieVO> SearchMovieMyBatis() {
return sqlSession.selectList("BoxOfficeDao.searchMovie");
}
BoxOffice.java
public String SearchMovieListMyBatis()
{
StringBuffer movieListCard = new StringBuffer();
List<MovieVO> movieList = boxOfficeDao.SearchMovieMyBatis();
for(MovieVO movie: movieList){
movieListCard.append(movie.getId() + " | " + movie.getRepGenreNm() + " | " + movie.getMovieNm());
movieListCard.append(System.lineSeparator());
}
return movieListCard.toString();
}
BoxOfficeService.java
//MovieList MyBatis
String movieListMyBatis = boxOffice.SearchMovieListMyBatis();
result.put("MovieListMyBatis", movieListMyBatis);
코드 작성이 끝났다면 호출해 보도록 하겠습니다.
http://localhost:8080/api/boxoffice/search?targetDt=20220815
'IT > Spring' 카테고리의 다른 글
[Spring] SpringBoot + JUnit5 단위테스트 (0) | 2022.09.05 |
---|---|
[Spring] SpringBoot + MariaDB JPA (0) | 2022.08.26 |
[Spring] SpringBoot + 공공데이터 with lombok & jackson (0) | 2022.08.23 |
[Spring] Spring Boot + Java SE 17 설정 with IntelliJ (0) | 2022.08.10 |
[Spring] Java SE 17 설치 및 환경 설정 (1) | 2022.08.09 |