Middleware (MSA 개발-1) Oracle DB를 사용한 SpringBoot 마이크로서비스
페이지 정보
작성자 미들웨어 아이디로 검색 전체게시물 댓글 0건 조회 4,567회 좋아요 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 키를 누릅니다.
여기서 부터 위 화면처럼 구성 환경을 선택합니다.
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
프로젝트가 생성되었다면 아래처럼 나와야 합니다.
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 파일목록을 확인할 수 있습니다
그럼, 여기까지 잘 따라오셨으면, MSA 개발 소스는 모두 구성이 완료되었습니다.
다음 가이드에서는 해당 응용프로그램을 테스트 해보는 방법에 대해 정리해볼게요.
그럼... 열공하세요~
댓글목록
등록된 댓글이 없습니다.