forked from mindol1004/msa-kiz-app
commit
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -12,7 +12,7 @@ import lombok.RequiredArgsConstructor;
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/auth")
|
||||
@RequestMapping("/auth-service")
|
||||
public class LoginController {
|
||||
|
||||
private final LoginService loginService;
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
server:
|
||||
port: 8082
|
||||
port: 0
|
||||
# servlet:
|
||||
# contextPath: /auth
|
||||
|
||||
|
||||
@@ -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초)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
server:
|
||||
port: 8084
|
||||
port: 0
|
||||
# servlet:
|
||||
# contextPath: /order
|
||||
|
||||
|
||||
@@ -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초)
|
||||
|
||||
Reference in New Issue
Block a user