Users Microservice 개요
APIs
기능 | URI(API Gateway 사용 시) | URI(API Gateway 미사용 시) | HTTP Method |
사용자 정보 등록 | /user-service/users | /users | POST |
전체 사용자 조회 | /user-service/users | /users | GET |
사용자 정보, 주문 내역 조회 |
/user-service/users/{user_id} | /users/{user_id} | GET |
작동 상태 확인 | /user-service/users/health_check | /users/health_check | GET |
환영 메시지 | /user-service/users/welcome | /users/welcome | GET |
Users Microservice 프로젝트 생성
설정
프로젝트 생성
Dependencies
- Lombok
- Spring Boot DevTools
- Spring Web
- Eureka Discovery Client
- H2 Database
💡 Spring Boot DevTools
기본적으로 웹 어플리케이션을 빠르게 재배포하고 종료하고 다시 켜지 않은 상태에서 리로드를 할 수 있는 간단한 기능들이 포함되어 있다.
💡 .jar vs .war 차이
Jar
스프링 서버에 내장되어 있는
War
Sublet, JSB 같은 웹 어플맅케이션처럼 Web.inf, Web.xml 식으로 어플리케이션 구족 자체가 웹 형태로 바뀌게 된다.
내장 톰캣을 갖고 있지 않은 상태이기 때문에 외부에 있는 어플리케이션 서버, JBoss나 웹노직 등 만들었더 마이크로 서비스를 배포
application class
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
application.yml
server:
port: 0
spring:
application:
name: user-service
eureka:
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
# hostname : ip address
# instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
Controller 생성
@RestController
@RequestMapping("/")
public class UserController {
@GetMapping("/health_check")
public String status() {
return "It's Working in User Service";
}
}
터미널로 Eureka 서버 구동
인텔리제이를 여러 개 띄워놓고 사용하면 메모리를 많이 사용하게 되므로 터미널에서 유레카 서버를 구동한다.
# 방법 1) mvn 사용 방법
이걸 사용했다.
mvn spring-boot:run
# 방법 2) .jar 파일 터미널에서 실행
java -jar -Dserver.port=9093 .\target\second-service-0.0.1-SNAPSHOT.jar
# 방법 3) .grable 사용할 경우(프로젝트 폴더로 이동 후)
./gradlew bootrun
잘 구동이 되었는지 유레카 대시보드에 가서 확인해보자.
주소 창에 포트 뒤에 있는 주소는 다 날려버리고 /health-check를 입력해서 작성한 컨트롤러를 호출한다.
Welcom 메시지 설정(application.yml 값 가져오기)
Configuration 정보 추가
application.yml에 아래 코드를 추가한다. 참고로 아래 코드는 기존 스프링부트에 등록되어있는 설정들이 아니라 사용자가 임의로 작성하는 설정이다.
application.yml
greeting:
message: Welcome to the Simple E-commerce.
application.yml 값 가져오는 방법
방법 1) Environment 사용
UserController
컨트롤러에 아래 코드를 추가한다.
Environment 객체를 사용해 application.yml에 있는 설정을 가져온다. 의존성 주입은 생성자 주입을 사용한다. 필드 주입보다 생성자 주입 방법을 더 권장하는데, IoC 컨테이너는 생성자에 전달하기 전에 생성자에 제공된 모든 인스턴스가 사용한지 확인하기 때문에 NullPointException을 방지할 수 있어 모든 종속성이 로드 되었는지 확인하기 위한 코드를 작성할 필요가 없기 때문이다.
@RestController
@RequestMapping("/")
public class UserController {
private Environment env;
@Autowired
public UserController(Environment env){
this.env = env;
}
//... 생략
@GetMapping("/welcome")
public String welcome() {
return env.getProperty("greeting.message");
}
}
서버 재실행 후 크롬에서 확인한다.
방법 2) @Value 사용
Greeting.java 생성
@Component
@Data
public class Greeting {
@Value("${greeting.message}")
private String message;
}
@Value 어노테이션으로 application.yml에 있는 값을 가져올 수 있다.
Bean을 만들었으니 이제 컨트롤러에서 사용하면 된다.
UserController
컨트롤러에 아래 코드를 추가한다.
public class UserController {
private Environment env;
private Greeting greeting;
@Autowired
public UserController(Environment env, Greeting greeting){
this.env = env;
this.greeting = greeting;
}
//생략...
@GetMapping("/welcome")
public String welcome() {
//return env.getProperty("greeting.message");
return greeting.getMessage();
}
}
서버 재실행 후 크롬에서 확인한다.
H2 데이터베이스 연동
💡 H2 Database
- 자바로 작성된 오픈소스 RDBMS
- Embedded, Server-Client모드로도 가능
Embedded모드에서는 애플리케이션 내부에 데이터베이스를 포함시켜 사용할 수 있으며,
Server-Client모드에서는 다중 사용자 환경에서 동시에 여러 클라이언트가 데이터베이스에 접근할 수 있다.
- JPA 연동 가능
JDBC(Java Database Connectivity)를 통해 자바 애플리케이션과 상호 작용하며, 메모리 모드와 디스크 모드로 데이터를 저장
- H2는 테이블, 뷰, 인덱스 등을 지원하며, 트랜잭션 처리, 로깅, 복제 등 다양한 데이터베이스 관리 기능을 제공
빠른 성능, 간편한 설정, 다양한 모드로의 적용 가능성 등으로 인해 개발 및 테스트 목적으로 널리 사용
Dependency 추가
프로젝트 생성 시 선택
- build.maven
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
<scope>runtime</scope> # 결과 확인을 위해 test -> runtime으로 변경
</dependency>
- build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
application.yml
h2 설정 추가
spring:
application:
name: user-service
h2:
console:
enabled: true # console 사용하겠다
settings:
web-allow-others: true # 외부접속허용하겠다.
path: /h2-console # 접속하고자 하는 웹브라우저의 h2콘솔 주소
보안 문제로 자동으로 데이터베이스가 생성되지 않기 때문에 수작업으로 H2관련된 디비를 만들어야 한다.
버전을 낮춰서 사용해보도록
서버 재실행 후 크롬에서 확인
주소 창에 "172.0.0.1/h2-console" 입력
위 상태에서 Test Connection 버튼을 클릭하면 mem:testdb를 찾을 수 없다는 에러가 발생한다.
H2 데이터베이스에서 1.4.198 버전부터 보안상의 문제로 자동 데이터베이스 생성 기능을 막아두었다고 한다. 그렇기 때문에 DB 파일이 생성되지 않고 있어 에러가 발생하는 것이다.
버전을 낮춰서 사용하기로 했다..
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.176</version>
<scope>runtime</scope>
</dependency>
서버 재실행 후 h2 페이지로 접속
Test Connection을 누르면 성공했다는 메시지를 볼 수 있다.
Connect 버튼을 누르면 화면이 넘어간다.