This commit is contained in:
2022-12-21 17:24:27 +09:00
parent 698859ba08
commit fb51282737
33 changed files with 495 additions and 147 deletions

View File

@@ -2,10 +2,10 @@ package kiz.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class AuthServiceApplication {

View File

@@ -12,7 +12,7 @@ import lombok.RequiredArgsConstructor;
@RestController
@RequiredArgsConstructor
@RequestMapping("/auth")
@RequestMapping("/auth-service")
public class LoginController {
private final LoginService loginService;

View File

@@ -11,7 +11,7 @@ import kiz.app.entity.Member;
@FeignClient("MEMBER-SERVICE")
public interface MemberClient {
@GetMapping("/api/member/{memberId}")
@GetMapping("/member-service/{memberId}")
Optional<Member> findByMemberId(@PathVariable("memberId") String memberId);
}

View File

@@ -1,5 +1,5 @@
server:
port: 8082
port: 0
# servlet:
# contextPath: /auth

View File

@@ -12,6 +12,7 @@ spring:
eureka:
instance:
hostname: mindol.synology.me
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
lease-renewal-interval-in-seconds: 30 # 유레카 서버로 설정된 시간(second)마다 하트비트 전송 (디폴트 30초)
# 디스커버리는 서비스 등록 해제 하기 전에 마지막 하트비트에서부터 설정된 시간(second) 동안 하트비트가 수신되지 않으면
# 서비스 등록 해제 (디폴트 90초)

View File

@@ -0,0 +1,42 @@
package kiz.app.config;
import java.util.Arrays;
import java.util.HashMap;
import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.reactive.config.CorsRegistry;
import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.reactive.config.WebFluxConfigurer;
@Configuration
@EnableWebFlux
public class CorsGlobalConfig implements WebFluxConfigurer {
@Override
public void addCorsMappings(CorsRegistry corsRegistry) {
corsRegistry.addMapping("/**")
.allowedOrigins("http://mindol.synology.me:8081")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
@Bean
public CorsConfiguration corsConfiguration(RoutePredicateHandlerMapping routePredicateHandlerMapping) {
CorsConfiguration corsConfig = new CorsConfiguration().applyPermitDefaultValues();
Arrays.asList(HttpMethod.OPTIONS, HttpMethod.PUT, HttpMethod.GET, HttpMethod.DELETE, HttpMethod.POST)
.forEach(m -> corsConfig.addAllowedMethod(m));
corsConfig.addAllowedOrigin("*");
routePredicateHandlerMapping.setCorsConfigurations(new HashMap<String, CorsConfiguration>() {{ put("/**", corsConfig); }});
return corsConfig;
}
}

View File

@@ -5,25 +5,32 @@ import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import kiz.app.filter.AuthenticationFilter;
import kiz.app.filter.AuthGatewayFilter;
import kiz.app.filter.GlobalFilter;
import lombok.RequiredArgsConstructor;
// @Configuration
@Configuration
// @EnableHystrix
@RequiredArgsConstructor
public class GatewayConfig {
private final AuthenticationFilter filter;
private final GlobalFilter globalFilter;
private final AuthGatewayFilter authFilter;
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("user-service", r -> r.path("/users/**")
.filters(f -> f.filter(filter))
.uri("lb://user-service"))
.route("auth-service", r -> r.path("/auth/**")
.filters(f -> f.filter(filter))
.uri("lb://auth-service"))
.route("auth-service", r -> r.path("/auth-service/**")
.filters(f -> f
.filter(globalFilter.apply(new GlobalFilter.Config("auth", true, false)))
.rewritePath("/auth-service/(?<segment>.*)", "/$\\{segment}"))
.uri("lb://AUTH-SERVICE"))
.route("member-service", r -> r.path("/member-service/**")
.filters(f -> f
.filter(globalFilter.apply(new GlobalFilter.Config("member", true, false)))
.filter(authFilter)
.rewritePath("/member-service/(?<segment>.*)", "/$\\{segment}"))
.uri("lb://MEMBER-SERVICE"))
.build();
}

View File

@@ -18,7 +18,7 @@ import reactor.core.publisher.Mono;
@RefreshScope
@Component
@RequiredArgsConstructor
public class AuthenticationFilter implements GatewayFilter {
public class AuthGatewayFilter implements GatewayFilter {
private final RouterValidator routerValidator;//custom route validator
private final JwtTokenUtil jwtTokenUtil;

View File

@@ -7,6 +7,7 @@ import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;
@@ -19,10 +20,17 @@ public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Conf
}
@Getter
@Setter
public static class Config {
private String baseMessage;
private boolean preLogger;
private boolean postLogger;
public Config(String baseMessage, boolean preLogger, boolean postLogger) {
this.baseMessage = baseMessage;
this.preLogger = preLogger;
this.postLogger = postLogger;
}
}
@Override

View File

@@ -0,0 +1,17 @@
package kiz.app.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
//@Component
public class GlobalGatewayFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return null;
}
}

View File

@@ -7,88 +7,93 @@ spring:
config:
activate:
on-profile: local
cloud:
config:
name: bootstrap
gateway:
default-filters:
- name: GlobalFilter
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "http://mindol.synology.me:8081"
allowedMethods:
- GET
- POST
- DELETE
- PUT
- OPTIONS
- DELETE
- PATCH
allowedHeaders: '*'
allow-credentials: true
routes:
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/order-service/**
filters:
- AuthenticationFilter
- RewritePath=/order-service/(?<segment>.*),/$\{segment}
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 3
redis-rate-limiter.burstCapacity: 3
key-resolver: "#{@tokenKeyResolver}"
# cloud:
# gateway:
# default-filters:
# - name: GlobalFilter
# args:
# baseMessage: Spring Cloud Gateway Global Filter
# preLogger: true
# postLogger: true
# globalcors:
# cors-configurations:
# '[/**]':
# allowedOrigins: "http://mindol.synology.me:8081"
# allowedMethods:
# - GET
# - POST
# - DELETE
# - PUT
# - OPTIONS
# - DELETE
# - PATCH
# allowedHeaders: '*'
# allow-credentials: true
# routes:
# - id: member-service
# predicates:
# - Path=/member-service/**
# uri: lb://MEMBER-SERVICE
# # 특정 필터 적용
# filters:
# - AuthGatewayFilterFactory
# routes:
# - id: order-service
# uri: lb://ORDER-SERVICE
# predicates:
# - Path=/order-service/**
# filters:
# - name: AuthenticationFilter
# - RewritePath=/order-service/(?<segment>.*),/$\{segment}
# - name: RequestRateLimiter
# args:
# redis-rate-limiter.replenishRate: 3
# redis-rate-limiter.burstCapacity: 3
# key-resolver: "#{@tokenKeyResolver}"
- id: store-service
uri: lb://STORE-SERVICE
predicates:
- Path=/store-service/**
filters:
- AuthenticationFilter
- RewritePath=/store-service/(?<segment>.*),/$\{segment}
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 3
redis-rate-limiter.burstCapacity: 3
key-resolver: "#{@tokenKeyResolver}"
# - id: store-service
# uri: lb://STORE-SERVICE
# predicates:
# - Path=/store-service/**
# filters:
# - name: AuthenticationFilter
# - RewritePath=/store-service/(?<segment>.*),/$\{segment}
# - name: RequestRateLimiter
# args:
# redis-rate-limiter.replenishRate: 3
# redis-rate-limiter.burstCapacity: 3
# key-resolver: "#{@tokenKeyResolver}"
- id: notice-service
uri: lb://NOTICE-SERVICE
predicates:
- Path=/notice/**
filters:
- AuthenticationFilter
- RewritePath=/notice/(?<segment>.*),/$\{segment}
# - id: notice-service
# uri: lb://NOTICE-SERVICE
# predicates:
# - Path=/notice/**
# filters:
# - name: AuthenticationFilter
# - RewritePath=/notice/(?<segment>.*),/$\{segment}
- id: auth-service
uri: lb://AUTH-SERVICE
predicates:
- Path=/auth/login
- Method=POST
filters:
- RewritePath=/auth/(?<segment>.*),/$\{segment}
- id: auth-service
uri: lb://AUTH-SERVICE
predicates:
- Path=/auth/logout
- Method=POST
filters:
- RewritePath=/auth/(?<segment>.*),/$\{segment}
# - id: auth-service
# uri: lb://AUTH-SERVICE
# predicates:
# - Path=/auth/login
# - Method=POST
# filters:
# - RewritePath=/auth/(?<segment>.*),/$\{segment}
# - id: auth-service
# uri: lb://AUTH-SERVICE
# predicates:
# - Path=/auth/logout
# - Method=POST
# filters:
# - RewritePath=/auth/(?<segment>.*),/$\{segment}
- id: member-service
uri: lb://MEMBER-SERVICE
predicates:
- Path=/member/**
filters:
- AuthenticationFilter
- RewritePath=/member/(?<segment>.*),/$\{segment}
# - id: member-service
# uri: lb://MEMBER-SERVICE
# predicates:
# - Path=/member-service/**
# filters:
# - name: AuthenticationFilter
# - RewritePath=/member-service/(?<segment>.*),/$\{segment}
management:
endpoints:

View File

@@ -12,11 +12,12 @@ spring:
eureka:
instance:
hostname: mindol.synology.me
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
lease-renewal-interval-in-seconds: 30 # 유레카 서버로 설정된 시간(second)마다 하트비트 전송 (디폴트 30초)
# 디스커버리는 서비스 등록 해제 하기 전에 마지막 하트비트에서부터 설정된 시간(second) 동안 하트비트가 수신되지 않으면
# 서비스 등록 해제 (디폴트 90초)
lease-expiration-duration-in-seconds: 90
prefer-ip-address: false # 서비스의 호스트 이름이 아닌 IP 주소를 유레카 서버에 등록하도록 지정 (디폴트 false)
prefer-ip-address: true # 서비스의 호스트 이름이 아닌 IP 주소를 유레카 서버에 등록하도록 지정 (디폴트 false)
client:
register-with-eureka: true # 레지스트리에 자신을 등록할지에 대한 여부 (디폴트 true)
fetch-registry: true # 레지스트리에 있는 정보를 가져올지에 대한 여부 (디폴트 true)

View File

@@ -1,10 +1,10 @@
package kiz.app.member;
package kiz.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class MemberApplication {

View File

@@ -21,6 +21,7 @@ public abstract class SelfValidating<T> {
* Evaluates all Bean Validations on the attributes of this
* instance.
*/
@SuppressWarnings("unchecked")
protected void validateSelf() {
Set<ConstraintViolation<T>> violations = validator.validate((T) this);
if (!violations.isEmpty()) {

View File

@@ -2,6 +2,7 @@ package kiz.app.member.adapter.in.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import kiz.app.common.WebAdapter;
@@ -10,6 +11,7 @@ import kiz.app.member.adapter.in.web.mapper.MemberWebMapper;
import kiz.app.member.application.port.in.FindMemberUseCase;
import lombok.RequiredArgsConstructor;
@RequestMapping("/member-service")
@WebAdapter
@RestController
@RequiredArgsConstructor
@@ -18,7 +20,12 @@ public class FindMemberController {
private final FindMemberUseCase findMemberUseCase;
private final MemberWebMapper memberWebMapper;
@GetMapping("/api/member/{memberId}")
@GetMapping("/welcome")
public String welcome(){
return "welcome to the first service";
}
@GetMapping("/{memberId}")
public MemberResponse getMember(@PathVariable("memberId") String memberId) {
return memberWebMapper.toDto(findMemberUseCase.getMember(memberId));
}

View File

@@ -1,5 +1,26 @@
package kiz.app.member.adapter.in.web;
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.RestController;
import kiz.app.common.WebAdapter;
import kiz.app.member.application.port.in.SignUpUseCase;
import kiz.app.member.application.port.in.command.SignUpCommand;
import lombok.RequiredArgsConstructor;
@RequestMapping("/member-service")
@WebAdapter
@RestController
@RequiredArgsConstructor
public class SignUpController {
private final SignUpUseCase signUpUseCase;
@PostMapping("/signup")
public Long signUp(@RequestBody SignUpCommand command) {
return signUpUseCase.signUp(command).getValue();
}
}

View File

@@ -11,10 +11,10 @@ public class MemberWebMapper {
public MemberResponse toDto(Member member) {
return MemberResponse.builder()
.memberId(member.getMemberId())
.name(member.getName())
.email(member.getEmail())
.phone(member.getPhone())
.address(member.getAddress())
.name(member.getMemberName())
.email(member.getEmail().getValue())
.phone(member.getPhone().getValue())
.address(member.getAddress().getZipCode() + member.getAddress().getAddress1() + member.getAddress().getAddress2())
.birthday(member.getBirthday())
.build();
}

View File

@@ -1,14 +1,17 @@
package kiz.app.member.adapter.out.persistence;
import java.time.LocalDate;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@@ -19,7 +22,7 @@ import lombok.NoArgsConstructor;
public class MemberEntity {
@Id
@GeneratedValue
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "member_id", length = 20, nullable = false, unique = true)
@@ -29,7 +32,7 @@ public class MemberEntity {
private String password;
@Column(name = "name", length = 20, nullable = false)
private String name;
private String memberName;
@Column(name = "email", length = 50, nullable = false)
private String email;
@@ -37,10 +40,42 @@ public class MemberEntity {
@Column(name = "phone", length = 20)
private String phone;
@Column(name = "address", length = 100)
private String address;
@Column(name = "zipCode", length = 6)
private String zipCode;
@Column(name = "address1", length = 100)
private String address1;
@Column(name = "address2", length = 100)
private String address2;
@Column(name = "birthday")
private LocalDate birthday;
@Column(name = "regId", length = 20)
private String regId;
@Column(name = "regDate")
private LocalDateTime regDate;
@Column(name = "modId", length = 20)
private String modId;
@Column(name = "modDate")
private LocalDateTime modDate;
@Builder
public MemberEntity(String memberId, String password, String memberName, String email, String phone, String zipCode,
String address1, String address2, LocalDate birthday) {
this.memberId = memberId;
this.password = password;
this.memberName = memberName;
this.email = email;
this.phone = phone;
this.zipCode = zipCode;
this.address1 = address1;
this.address2 = address2;
this.birthday = birthday;
}
}

View File

@@ -6,12 +6,14 @@ import kiz.app.common.PersistenceAdapter;
import kiz.app.member.adapter.out.persistence.mapper.MemberMapper;
import kiz.app.member.adapter.out.persistence.repository.MemberJpaRepository;
import kiz.app.member.application.port.out.FindMemberPort;
import kiz.app.member.application.port.out.SignUpPort;
import kiz.app.member.domain.Member;
import kiz.app.member.domain.Member.MemberId;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@PersistenceAdapter
public class MemberPersistenceAdapter implements FindMemberPort {
public class MemberPersistenceAdapter implements FindMemberPort, SignUpPort {
private final MemberJpaRepository memberJpaRepository;
private final MemberMapper memberMapper;
@@ -23,5 +25,11 @@ public class MemberPersistenceAdapter implements FindMemberPort {
.orElseThrow(EntityNotFoundException::new)
);
}
@Override
public MemberId signUp(Member member) {
return new MemberId(memberJpaRepository.save(memberMapper.toEntity(member)).getId());
}
}

View File

@@ -3,7 +3,10 @@ package kiz.app.member.adapter.out.persistence.mapper;
import org.springframework.stereotype.Component;
import kiz.app.member.adapter.out.persistence.MemberEntity;
import kiz.app.member.domain.Address;
import kiz.app.member.domain.Email;
import kiz.app.member.domain.Member;
import kiz.app.member.domain.Phone;
@Component
public class MemberMapper {
@@ -12,12 +15,26 @@ public class MemberMapper {
return Member.builder()
.memberId(member.getMemberId())
.password(member.getPassword())
.name(member.getName())
.email(member.getEmail())
.phone(member.getPhone())
.address(member.getAddress())
.memberName(member.getMemberName())
.email(Email.of(member.getEmail()))
.phone(Phone.of(member.getPhone()))
.address(Address.of(member.getZipCode(), member.getAddress1(), member.getAddress2()))
.birthday(member.getBirthday())
.build();
}
public MemberEntity toEntity(Member member) {
return MemberEntity.builder()
.memberId(member.getMemberId())
.password(member.getPassword())
.memberName(member.getMemberName())
.email(member.getEmail().getValue())
.phone(member.getPhone().getValue())
.zipCode(member.getAddress().getZipCode())
.address1(member.getAddress().getAddress1())
.address2(member.getAddress().getAddress2())
.birthday(member.getBirthday())
.build();
}
}

View File

@@ -0,0 +1,10 @@
package kiz.app.member.application.port.in;
import kiz.app.member.application.port.in.command.SignUpCommand;
import kiz.app.member.domain.Member.MemberId;
public interface SignUpUseCase {
MemberId signUp(SignUpCommand command);
}

View File

@@ -0,0 +1,53 @@
package kiz.app.member.application.port.in.command;
import java.time.LocalDate;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import kiz.app.common.SelfValidating;
import lombok.EqualsAndHashCode;
import lombok.Value;
@Value
@EqualsAndHashCode(callSuper = false)
public class SignUpCommand extends SelfValidating<SignUpCommand> {
@NotBlank
private final String memberId;
@NotBlank
private final String password;
@NotBlank
private final String memberName;
@Email
private final String email;
private final String phone;
private final String zipCode;
private final String address1;
private final String address2;
private final LocalDate birthday;
public SignUpCommand(
String memberId,
String password,
String memberName,
String email,
String phone,
String zipCode,
String address1,
String address2,
LocalDate birthday
) {
this.memberId = memberId;
this.password = password;
this.memberName = memberName;
this.email = email;
this.phone = phone;
this.zipCode = zipCode;
this.address1 = address1;
this.address2 = address2;
this.birthday = birthday;
this.validateSelf();
}
}

View File

@@ -0,0 +1,10 @@
package kiz.app.member.application.port.out;
import kiz.app.member.domain.Member;
import kiz.app.member.domain.Member.MemberId;
public interface SignUpPort {
MemberId signUp(Member member);
}

View File

@@ -0,0 +1,32 @@
package kiz.app.member.application.service;
import kiz.app.common.UseCase;
import kiz.app.member.application.port.in.SignUpUseCase;
import kiz.app.member.application.port.in.command.SignUpCommand;
import kiz.app.member.application.port.out.SignUpPort;
import kiz.app.member.domain.Member;
import kiz.app.member.domain.Member.MemberId;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@UseCase
public class SignUpService implements SignUpUseCase {
private final SignUpPort signUpPort;
@Override
public MemberId signUp(SignUpCommand command) {
return signUpPort.signUp(
Member.createMember(
command.getMemberId(),
command.getPassword(),
command.getMemberName(),
command.getEmail(),
command.getPhone(),
command.getZipCode(),
command.getAddress1(),
command.getAddress2(),
command.getBirthday()));
}
}

View File

@@ -0,0 +1,20 @@
package kiz.app.member.domain;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Address {
@Getter private final String zipCode;
@Getter private final String address1;
@Getter private final String address2;
public static Address of(String zipCode, String address1, String address2) {
return new Address(zipCode, address1, address2);
}
}

View File

@@ -0,0 +1,17 @@
package kiz.app.member.domain;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Email {
@Getter private final String value;
public static Email of(String value) {
return new Email(value);
}
}

View File

@@ -13,36 +13,45 @@ import lombok.Value;
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Member {
private final MemberId id;
@Getter
private final String memberId;
@Getter
private final String password;
@Getter
private final String name;
@Getter
private final String email;
@Getter
private final String phone;
@Getter
private final String address;
@Getter
private final LocalDate birthday;
public Optional<MemberId> getId(){
return Optional.ofNullable(this.id);
}
@Value
public static class MemberId {
private Long value;
}
private final MemberId id;
public Optional<MemberId> getId(){
return Optional.ofNullable(this.id);
}
@Getter private final String memberId;
@Getter private final String password;
@Getter private final String memberName;
@Getter private final Email email;
@Getter private final Phone phone;
@Getter private final Address address;
@Getter private final LocalDate birthday;
public static Member createMember(
final String memberId,
final String password,
final String memberName,
final String email,
final String phone,
final String zipCode,
final String address1,
final String address2,
final LocalDate birthday
) {
return Member.builder()
.memberId(memberId)
.password(password)
.memberName(memberName)
.email(Email.of(email))
.phone(Phone.of(phone))
.address(Address.of(zipCode, address1, address2))
.birthday(birthday)
.build();
}
}

View File

@@ -0,0 +1,18 @@
package kiz.app.member.domain;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Phone {
@Getter private final String value;
public static Phone of(String value) {
return new Phone(value);
}
}

View File

@@ -1,5 +1,5 @@
server:
port: 8083
port: 0
# servlet:
# contextPath: /member
@@ -14,15 +14,22 @@ spring:
settings:
web-allow-others: true
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:userdb;DB_CLOSE_DELAY=-1
username: sa
password:
url: jdbc:mariadb://mindol.synology.me:3307/kiz_space
driver-class-name: org.mariadb.jdbc.Driver
username: mindolangel
password: $awlswn1318a
# driver-class-name: org.h2.Driver
# url: jdbc:h2:mem:userdb;DB_CLOSE_DELAY=-1
# username: sa
# password:
jpa:
open-in-view: false
generate-ddl: true
show-sql: true
hibernate: # hibernate 사용 설정
# 애플리케이션 실행 시점에 테이블을 다 지우고, 내가 가진 entity 정보를 보고 다시 테이블 자동 생성
# if exists drop table 해주고 다시 만들어준다고 보면 된다.
ddl-auto: create
ddl-auto: update
properties: # property 사용 설정
hibernate: # hibernate property 설정
format_sql: true

View File

@@ -12,11 +12,12 @@ spring:
eureka:
instance:
hostname: mindol.synology.me
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
lease-renewal-interval-in-seconds: 30 # 유레카 서버로 설정된 시간(second)마다 하트비트 전송 (디폴트 30초)
# 디스커버리는 서비스 등록 해제 하기 전에 마지막 하트비트에서부터 설정된 시간(second) 동안 하트비트가 수신되지 않으면
# 서비스 등록 해제 (디폴트 90초)
lease-expiration-duration-in-seconds: 90
prefer-ip-address: false # 서비스의 호스트 이름이 아닌 IP 주소를 유레카 서버에 등록하도록 지정 (디폴트 false)
prefer-ip-address: true # 서비스의 호스트 이름이 아닌 IP 주소를 유레카 서버에 등록하도록 지정 (디폴트 false)
client:
register-with-eureka: true # 레지스트리에 자신을 등록할지에 대한 여부 (디폴트 true)
fetch-registry: true # 레지스트리에 있는 정보를 가져올지에 대한 여부 (디폴트 true)

View File

@@ -1,5 +1,5 @@
server:
port: 8084
port: 0
# servlet:
# contextPath: /order

View File

@@ -12,6 +12,7 @@ spring:
eureka:
instance:
hostname: mindol.synology.me
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
lease-renewal-interval-in-seconds: 30 # 유레카 서버로 설정된 시간(second)마다 하트비트 전송 (디폴트 30초)
# 디스커버리는 서비스 등록 해제 하기 전에 마지막 하트비트에서부터 설정된 시간(second) 동안 하트비트가 수신되지 않으면
# 서비스 등록 해제 (디폴트 90초)

View File

@@ -1 +1 @@
http://mindol.synology.me:8083/api/member/mindol
http://mindol.synology.me:8081/member/mindol