티스토리 뷰

Docker 설치하기

https://docs.docker.com/engine/install/

 

Install Docker Engine

 

docs.docker.com

SpringBoot에서 JDBC를 연결하기 위해서는 먼저 DB 환경이 구축되어 있어야 합니다.

Docker를 사용하여 간단하게 MariaDB를 구축해보도록 하겠습니다.

 

Docker Install

환경에 맞는 게 Docker Install 하고 설치가 잘 되었는지 확인합니다.

Docker Version

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 image만들기

docker build -f mariadb.Dockerfile -t mariadb .

 

  • Docker Image로 Container 만들기

Docker run

docker run -it -p 3306:3306 mariadb

 

  • Docker Container확인 및 MariaDB 접속하기

Docker 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를 가져오도록 하겠습니다.

  1. Gradle에 MariaDB JDBC 추가
  2. application에 MariaDB 접속 정보 입력
  3. DAO 객체 생성
  4. 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를 가져와 보겠습니다.

 

  1. Gradle에 MyBatis 추가
  2. application에 mapper 경로 설정
  3. VO 객체 생성
  4. SQL 작성
  5. 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

응답 결과

 

댓글
최근에 올라온 글
TAG
more
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30