Ryan's Log

SpringBoot + MyBatis + HANA Cloud DB 구성 + BTP 배포 (maven project) 본문

SAP BTP

SpringBoot + MyBatis + HANA Cloud DB 구성 + BTP 배포 (maven project)

Ryan c 2022. 8. 29. 14:53
728x90

 

SpringBoot과 MyBatis로 HANA Cloud DB 쿼리

 

이 글은 아래 사항들을 설명합니다.
1. SpringBoot에 MyBatis Mapper를 통한 DB 쿼리
2. pom.xml(maven)에 HANA DB Driver dependency 추가
3. SAP BTP trial의 HANA DB 구동 및 테이블 생성 (BTP trial에 HANA DB생성은 앞글 참고)
4. BTP trial HANA DB에 연결 설정
5. BTP Cloud Foundry (CF)에 SpringBoot Application 배포
6. CF CLI를 이용한 SpringBoot Application 배포
7. Blue-Green Deployment

 

 

 

https://start.spring.io 새로운 spring-boot demo 를 생성한다.

HANA DB 드라이버는 depencencies에 검색되지 않는다. 생략 하고 pom.xml에 직접 추가하기로 한다.

 

Generate된 zip 파일을 VSCode에 얹는다.

HANA DB dependency를 MVN repository에서 검색하여 pom.xml에 추가한다.

<!-- https://mvnrepository.com/artifact/com.sap.cloud.db.jdbc/ngdbc -->
<dependency>
    <groupId>com.sap.cloud.db.jdbc</groupId>
    <artifactId>ngdbc</artifactId>
    <version>2.13.9</version>
</dependency>

앞글의 BTP Trial에서 HANA Cloud DB를 생성 후 아래와 같이 User 테이블 및 데이터를 생성 하였고, 이를 이용하여 Spring-Boot의 MyBatis에서 Query한다.

drop table User;

create table User (
   UID NVARCHAR(36),
   USERNAME NVARCHAR(100) NOT NULL,
   PASSWORD NVARCHAR(100),
   FIRSTNAME NVARCHAR(100) NOT NULL,
   LASTNAME NVARCHAR(100) NOT NULL,
   DAYOFBIRTH NVARCHAR(8),
   USE BOOLEAN DEFAULT true,
   PRIMARY KEY (UID)
);

insert into User (UID, USERNAME, FIRSTNAME, LASTNAME, DAYOFBIRTH)
values (sysuuid, 'ryan@abc.com', 'Ryan', 'Happy', '20220823');

 

다음 Java 코드 User.java, UserMapper.java, UserService.java, UserController.java를 model, mapper, service, controller 폴더(패키지)를 생성하여 각각 추가한다.

User.java

package org.starj.boot.demo.model;

import lombok.Getter;

@Getter
public class User {

    private String uid;
    private String userName;
    private String password;
    private String firstName;
    private String lastName;
    private String dayOfBIrth;
    private Boolean use;

}

UserMapper.java

package org.starj.boot.demo.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.starj.boot.demo.model.User;

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM User")
    List<User> findAll();

    @Select("SELECT * FROM User WHERE userName = #{userName}")
    User findByUserName(@Param("userName") String userName);

}

UserService.java

package org.starj.boot.demo.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.starj.boot.demo.mapper.UserMapper;
import org.starj.boot.demo.model.User;

@Service
public class UserService {

    @Autowired
    private UserMapper mapper;

    public UserService(UserMapper mapper) {
        this.mapper = mapper;
    }

    public List<User> getAllUsers() {
        return mapper.findAll();
    }

    public User getUser(String userName) {
        return mapper.findByUserName(userName);
    }

}

UserController.java

package org.starj.boot.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import org.starj.boot.demo.model.User;
import org.starj.boot.demo.service.UserService;

@RestController
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("/test/{path}")
    public @ResponseBody String test(@PathVariable("path") String path) {
        return path;
    }

    @GetMapping("/user/all")
    public @ResponseBody Object getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/user/{userName}")
    public @ResponseBody Object getUser(@PathVariable("userName") String userName) {
        User user = userService.getUser(userName);
        if (user == null)
            throw new ResponseStatusException(HttpStatus.NOT_FOUND, "NO user");
        return user;
    }

}

 

HANA DB 연결 설정을 위해 BTP Cockpit의 "SAP HANA Cloud"에 생성된 DB Instance를 확인 후 "Manage SAP HANA Cloud"를 열고, 혹 DB가 중지 중 이라면 이를 구동한다.

RUNNING중인 HANA DB Instance (hana-trial)의 우측 끝 Action 버튼을 클릭한 메뉴 중 "Copy SQL Endpoint" 한다.

 

복사한 SQL Endpoint를 이용하여 application.yml을 구성한다. application.properties 파일 이라면 이름을 application.yml로 변경 하고 아래 jdbc설정을 채워도 좋고, application.properties 파일을 유지하고 property형태인 key=value로 채워도 좋다.

spring:
  datasource:
    driverClassName: com.sap.db.jdbc.Driver
    url: jdbc:sap://7d81a93f-b9f1-4ddd-8a3e-1e69d412ca35.hana.trial-us10.hanacloud.ondemand.com:443
    username: DBADMIN
    password: password

 

Terminal을 열어 mvn spring-boot:run 구동 및 브라우저 테스트

 

구동 후 로그에서 8080포트 확인 후 아래 URL을 통해 정상 동작함을 확인한다.
http://127.0.0.1:8080/user/all

 

다음 Terminal 명령을 이용 빌드된 jar 파일을 이용하여 구동 가능하다.
java -jar target/starj-boot-demo-0.0.1-SNAPSHOT.jar

 

 

SAP BTP에 배포한다.

이 jar 파일을 BTP에 배포한다. 

Deploy Application을 클릭, jar파일을 선택 한 후 manifest에 해당하는 그림의 항목 중 필수 항목들 입력한다. 
특히 Memory Quota, Disk Quota등을 너무 적게 넣을 경우 App이 구동되지 않을 수 있다. 

배포를 성공하면 자동으로 구동된다.

배포 시 입력한 "starj-boot-demo" 이름으로 생성 된 App의 상세 정보 창에서 Routing된 주소 및 Quota 변경이 가능하다.
그림의 하단에선 이 App에 발생된 이벤트(시작, 중지 등) 확인도 가능.

위 라우팅에 /user/all을 더해 다음 화면을 확인한다.

 

 

CF (Cloud Foundry) CLI를 이용하여 배포 가능하다.

CF CLI 설치 (MacOS, Linux가 아닌 윈도우 사용자는 알아서~~)
https://docs.cloudfoundry.org/cf-cli/install-go-cli.html

 

CF에 로그인 해야한다. 로그인 할 대상 BTP의 API Endpoint를 확인한다.
아래 그림의 Cloud Foundry Environment의  API Endpoint 취득

Terminal에서 cf api, cf login을 각각 실행하여 cf에 로그인한다.

> cf api https://api.cf.us10.hana.ondemand.com/

email과 비밀번호는 SAP 계정으로 BTP 혹은 BTP trial을 생성한 계정이다.

CF에 로그인 한 이후 빌드 된 jar 파일을 배포한다.

> cf push starj-boot-demo -p ./target/starj-boot-demo-0.0.1-SNAPSHOT.jar -m 1024M -k 512M

자세한 사항은 cf push help 참조

> cf push --help 

이미 배포된 것과 이름을 동일하게 지정하면 기존의 배포를 대체한다.  

 

배포 시 Blue-Green Deployment도 가능하다.

아래 문서 확인
https://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html

 

 

이 글의 소스
https://github.com/devidiot/demo-springboot-mybatis-hana_cloud_db_trial

728x90