공유할 서비스 선택

TECH


TECH

Middleware (MSA 개발-1) Oracle DB를 사용한 SpringBoot 마이크로서비스

페이지 정보

작성자 미들웨어 아이디로 검색 전체게시물 댓글 0건 조회 729회 좋아요 0회 작성일 23-09-11 09:41

본문

안녕하세요. "미들웨어" 입니다.

지난 가이드에서는 MSA 개발화경 구성으로 1,2 진행을 했습니다.

개발 환경구성은 못한 분들은 필히 1,2 가이드를 완료하시고 따라와주셔야 합니다.

 

그럼 개발환경 구성은 완료된 것로 알고 Oracle DB를 사용한 SpringBoot 마이크로서비스 구성에 대해 가이드를 진행하겠습니다.

간단한 SpringBoot 마이크로 서비스를 만들어 볼 계획이며, 고객을 생성/등록 하고 고객 세부 정보를 가져오는데 사용할 수 있는 MSA 개발 프로그램 입니다.

Oracle DB는 앞장에서 Docker Image로 구성이 끝나 있어야 합니다.

  

1. DB 입력할 고객 데이터

고객 데이터에는 다음 속성값이 들어갑니다

  • Customer ID

  • First name

  • Surname

  • Email address

고객내 서비스에는 아래처럼 endpoint가 있습니다.

  • Create a customer

  • List all customers

  • Get a customer by ID

2. 프로젝트 생성

Visual Studio Code 및 Spring Extension Pack으로 설정한 경우 Ctrl+Shift+P를 입력하여 작업을 불러오고 "Spring Init"를 입력하여 "Spring Initializr: Maven 만들기"를 찾을 수 있습니다.

프로젝트” 작업을 입력한 다음 Enter 키를 누릅니다.

934d415d29240711887d1fa2b6f177e8_1694392076_5429.png


여기서 부터 위 화면처럼 구성 환경을 선택합니다.  

  • Spring Boot Version = 3.1.2

  • Language = Java

  • Group ID = com.redstack

  • Artifact ID = customer

  • Packaging = JAR

  • Java version = 17

  • Dependencies:

  • Spring Web

  • Spring Data JPA

  • Oracle Driver

프로젝트가 생성되었다면 아래처럼 나와야 합니다.

934d415d29240711887d1fa2b6f177e8_1694392108_7709.png
 

  

3. JAVA 코드 작성

생성된 Maven POM( pom.xml )에 dependency를 추가하겠습니다.


​- pom.xml

 <?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>3.0.0</version>

<relativePath/> <!-- lookup parent from repository -->

</parent>

<groupId>com.redstack</groupId>

<artifactId>customer</artifactId>

<version>0.0.1-SNAPSHOT</version>

<name>customer</name>

<description>Demo project for Spring Boot</description>

<properties>

<java.version>17</java.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

 

<dependency>

<groupId>com.oracle.database.jdbc</groupId>

<artifactId>ojdbc8</artifactId>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.26</version>

</dependency>

</dependencies>

 

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

 

</project>


 

아래 경로에 java 소스코드를 만들어 보겠습니다.

경로 : /src/main/java/com/redstack/customer

- CustomerApplication.java

 package com.redstack.customer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class CustomerApplication { public static void main(String[] args) { SpringApplication.run(CustomerApplication.class, args); } }


 

- Customer.java 

 package com.redstack.customer;

 

import lombok.AllArgsConstructor;

import lombok.Builder;

import lombok.Data;

import lombok.NoArgsConstructor;

 

import jakarta.persistence.Entity;

import jakarta.persistence.GeneratedValue;

import jakarta.persistence.GenerationType;

import jakarta.persistence.Id;

import jakarta.persistence.SequenceGenerator;

 

@Data

@Builder

@AllArgsConstructor

@NoArgsConstructor

@Entity

public class Customer {

 

    @Id

    @SequenceGenerator(

            name = "customer_id_sequence",

            sequenceName = "customer_id_sequence"

    )

    @GeneratedValue(

            strategy = GenerationType.SEQUENCE,

            generator = "customer_id_sequence"

    )

    private Integer id;

    private String firstName;

    private String lastName;

    private String email;

}


 

 

 

- CustomerRegistrationRequest.java

새로운 고객을 등록하는 서비스를 시작하기 위해 필요합니다 

예상되는 입력 데이터를 정의하는 단계이고, ID는 데이터베이스 시퀀스에서 가져오므로 포함하지 않습니다 

여기서 필요한건 클라이언트/호출자가 나머지 세 필드를 제공하면 됩니다

 

 package com.redstack.customer;

 

public record  CustomerRegistrationRequest (

    String firstName,

    String lastName,

    String email) {

}

 

 

CustomerController.java

@RestController는 이 레코드에 대한 REST API를 노출하도록 스프링에 지시합니다 

@RequestMapping은 이 컨트롤러의 URL 경로를 설정하도록 합니다 

 

 package com.redstack.customer;

 

import org.springframework.http.ResponseEntity;

import org.springframework.http.HttpStatus;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

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

import org.springframework.web.bind.annotation.ResponseBody;

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

 

// add these imports

import java.util.List;

import org.springframework.http.MediaType;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.ResponseStatus;

 

// add these imports

import java.util.Optional;

import org.springframework.http.HttpStatus;

import org.springframework.http.MediaType;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

 

@RestController

@RequestMapping("api/v1/customers")

public record CustomerController(CustomerService service) {

 

    @PostMapping

    @ResponseBody

    public ResponseEntity<String> registerCustomer(@RequestBody CustomerRegistrationRequest req) {

        service.registerCustomer(req);

        return ResponseEntity.status(HttpStatus.CREATED).body("Customer registered successfully.\n");

    }

 

    @GetMapping(produces = {MediaType.APPLICATION_JSON_VALUE})

    @ResponseBody

    @ResponseStatus(HttpStatus.OK)

    public List<Customer> getAllCustomers() {

        return service.getAllCustomers();

    }

 

    @GetMapping(path="/{id}", produces = {MediaType.APPLICATION_JSON_VALUE})

    @ResponseBody

    public ResponseEntity<Customer> getCustomer(@PathVariable Integer id) {

        Optional<Customer> c = service.getCustomer(id);

        if (c.isPresent()) {

            return ResponseEntity.status(HttpStatus.OK).body(c.get());

        } else {

            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);

        }

    }

}

 

 

CustomerService.java

 package com.redstack.customer;

 

import org.springframework.stereotype.Service;

import java.util.List;

import java.util.Optional;

 

@Service

public record CustomerService(CustomerRepository repository) {

 

    public void registerCustomer(CustomerRegistrationRequest req) {

        Customer customer = Customer.builder()

                .firstName(req.firstName())

                .lastName(req.lastName())

                .email(req.email())

                .build();

        repository.saveAndFlush(customer);

    }

 

    public List<Customer> getAllCustomers() {

        return repository.findAll();

    }

 

    public Optional<Customer> getCustomer(Integer id) {

        return repository.findById(id);

    }

}

 

 

CustomerRepository.java

DB에서 엔티티를 저장, 검색 및 삭제하는데 사용할 수 있는 JPA 저장소 클래스 생성을 해보겠습니다 

 package com.redstack.customer;

 

import org.springframework.data.jpa.repository.JpaRepository;

 

public interface CustomerRepository extends JpaRepository<Customer, Integer> {

}

 

  

 

4. Application.properties 정의 

최초 생성하면 Application.properties으로 정의되있는데, 저희는 YAML파일을 사용하겠습니다 

기존 application.properties 을 application.yaml 로 변경했으며, 내용은 아래와 같습니다. 

 

  • 기존 파일명 : application.properties
  • 변경 파일명 : application.yaml

 

 server:

  port: 8080

 

spring:

  application:

    name: customer

  datasource:

    username: 'customer'

    url: jdbc:oracle:thin:@//사용자 OracleDB IP:1521/pdb1

    password: 'Welcome123'

    driver-class-name: oracle.jdbc.driver.OracleDriver

  jpa:

    properties:

      hibernate:

        dialect: org.hibernate.dialect.OracleDialect

        format-sql: 'true'

    hibernate:

      ddl-auto: update

    show-sql: 'true'

 

여기에 있는 내용을 살펴보겠습니다 

먼저 port는 8080 으로 설정하고, 애플리케이션 이름을 "customer"로 설정합니다 

 

데이터 소스 설정을 하겠습니다. 

데이터 소스 설정시 사용자 DB정보 IP 부분은 구성하신 IP를 등록해주셔야 합니다. 

 url: jdbc:oracle:thin:@//사용자 OracleDB IP:1521/pdb1

 

OracleDB에 customer 정보를 입력해야 하는데,  

해당 부분은 내용이 너무 많아지니 다음 가이드로 진행하겠습니다 

 

 

5. 파일시스템 java 확인

위에 나열된 java 파일을 구성했다면, 아래와 같이 파일시스템에 java 파일목록을 확인할 수 있습니다

934d415d29240711887d1fa2b6f177e8_1694392732_4624.png
 

그럼, 여기까지 잘 따라오셨으면, MSA 개발 소스는 모두 구성이 완료되었습니다. 

다음 가이드에서는 해당 응용프로그램을 테스트 해보는 방법에 대해 정리해볼게요.

 

그럼... 열공하세요~

 

 

 

댓글목록

등록된 댓글이 없습니다.

TECH 목록
번호 제목 작성자 작성일 조회수
204 Middleware 미들웨어 아이디로 검색 전체게시물 04-22 22
(오픈소스 활용-28) was에서 T4CConnection (Locked) 발생시 해결방법

카테고리 : Middleware

22 0
작성자 : 미들웨어 24/04/22
203 OS OSworker 아이디로 검색 전체게시물 04-20 34
Diagram, Architect 등 서버의 구성에 대해 그림그리실때 무엇을 사용하시나요?

카테고리 : OS

34 0
작성자 : OSworker 24/04/20
202 OS OSworker 아이디로 검색 전체게시물 04-14 67
[교육] RH174 : Managing CentOS Migrations and RHEL Upgrades

카테고리 : OS

67 0
작성자 : OSworker 24/04/14
201 Middleware 미들웨어 아이디로 검색 전체게시물 04-08 53
(오픈소스 활용-28) Java Flight Recorder 이란? Java 모니터링을 구현가능

카테고리 : Middleware

53 0
작성자 : 미들웨어 24/04/08
200 OS OSworker 아이디로 검색 전체게시물 04-03 792
[보안취약점] XZ유틸즈에서 발견된 백도어 `CVE-2024-3094`

카테고리 : OS

792 0
작성자 : OSworker 24/04/03
199 OS OSworker 아이디로 검색 전체게시물 03-30 110
레드햇 자격증 시험을 집에서~ 원하는 곳에서 볼수있는거 알고계셨나요?

카테고리 : OS

110 0
작성자 : OSworker 24/03/30
198 OS OSworker 아이디로 검색 전체게시물 03-24 186
RHEL7 to RHEL8 leapp으로 마이그레이션 하는 방법에 대해~

카테고리 : OS

186 0
작성자 : OSworker 24/03/24
197 Middleware 미들웨어 아이디로 검색 전체게시물 03-21 116
(오픈소스 활용-27) Redis Cache 란? 활용방법과 다운로드

카테고리 : Middleware

116 0
작성자 : 미들웨어 24/03/21
196 OS OSworker 아이디로 검색 전체게시물 03-17 155
Convert2RHEL를 사용하여 CentOS 7.9 에서 RHEL7.9로 전환해보겠습니다.

카테고리 : OS

155 0
작성자 : OSworker 24/03/17
195 Middleware 미들웨어 아이디로 검색 전체게시물 03-07 161
(weblogic 활용) WebLogic Kubernetes Toolkit-UI (무료) 설치 및 구성가이드

카테고리 : Middleware

161 0
작성자 : 미들웨어 24/03/07
Total 204건
게시물 검색

주식회사 클럭스| 대표 : 이찬호| 사업자등록번호 : 107-87-27655
주소 : 서울특별시 영등포구 국회대로 800, 여의도파라곤
E-mail : sales@chlux.co.kr
Copyright © 클럭스 www.chlux.co.kr All rights reserved.
상단으로Top