공유할 서비스 선택

TECH


TECH

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

페이지 정보

작성자 미들웨어 아이디로 검색 전체게시물 댓글 0건 조회 727회 좋아요 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 목록
번호 제목 작성자 작성일 조회수
96 Middleware 미들웨어 아이디로 검색 전체게시물 11-23 909
(Tmax) JEUS 21 다운로드 및 Master 설치 및 기동해보기

카테고리 : Middleware

909 0
작성자 : 미들웨어 23/11/23
95 Middleware 미들웨어 아이디로 검색 전체게시물 11-08 913
(오픈소스 활용-23) (부하테스트 Tool) Jmeter 설치 및 구성 가이드

카테고리 : Middleware

913 0
작성자 : 미들웨어 23/11/08
94 Middleware 미들웨어 아이디로 검색 전체게시물 10-23 788
(오픈소스 활용-22) 리눅스에 Jenkins-2.4 설치 가이드

카테고리 : Middleware

788 0
작성자 : 미들웨어 23/10/23
93 Middleware 미들웨어 아이디로 검색 전체게시물 10-11 392
(MSA 개발-3) MSA 파일(JAVA)분석

카테고리 : Middleware

392 0
작성자 : 미들웨어 23/10/11
92 Middleware 미들웨어 아이디로 검색 전체게시물 09-22 406
(MSA 개발-2) Oracle DB & SpringBoot MSA 응용 프로그램 테스트

카테고리 : Middleware

406 0
작성자 : 미들웨어 23/09/22
열람중 Middleware 미들웨어 아이디로 검색 전체게시물 09-11 728
열람중
(MSA 개발-1) Oracle DB를 사용한 SpringBoot 마이크로서비스

카테고리 : Middleware

728 0
작성자 : 미들웨어 23/09/11
90 Middleware 미들웨어 아이디로 검색 전체게시물 08-21 559
(MSA 개발 환경 구성-2) Oracle DB (Docker)& SQLcl 구성

카테고리 : Middleware

559 0
작성자 : 미들웨어 23/08/21
89 Middleware 미들웨어 아이디로 검색 전체게시물 08-09 2647
(MSA 개발 환경 구성-1) Maven & VScode & RancherDesktop설치

카테고리 : Middleware

2,647 0
작성자 : 미들웨어 23/08/09
88 Middleware 미들웨어 아이디로 검색 전체게시물 07-24 828
(Oracle Cloud) OCI 자격증 기출문제 "OCI Architect Associate"

카테고리 : Middleware

828 2
작성자 : 미들웨어 23/07/24
87 Middleware 미들웨어 아이디로 검색 전체게시물 07-07 662
클라우드 네이티브란 무엇인가?

카테고리 : Middleware

662 0
작성자 : 미들웨어 23/07/07
Total 106건
게시물 검색

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