묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
my_topic_users 가 자동으로 생성되지 않을때
아.. 설정 뭔가 잘 안되어서 계속 빠꾸를 했었네요 ^^;;; 혹시라도 저처럼 db insert 시 자동으로 topic이 생성 되지 않으시는분들은{ "name": "my-source-connect", "config": { "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector", "connection.url": "jdbc:mysql://localhost:3306/mydb", "connection.user": "root", "connection.password": "passw0rd", "mode": "incrementing", "incrementing.column.name": "id", "table.whitelist": "users", "topic.prefix": "my_topic_", "tasks.max": "1", "poll.interval.ms" : 10000, "topic.creation.default.replication.factor":1, "topic.creation.default.partitions" : 1 } } 해당 두줄을 넣어 주시면 자동으로 생성이 됩니다 ^^;; "topic.creation.default.replication.factor":1, "topic.creation.default.partitions" : 1
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
encrypt.key-store.location 경로 에러 질문
Apple M1 Ventura 13.4.1 (컴퓨터)IntelliJ IDEA 2022.2.3 (개발환경)Spring Boot 2.7.13Spring Cloud 2021.0.7java 11 왜 인지는 모르겠는데 location 경로를 아래와 같이 적어야 성공이 됩니다.그리고 아래와 같이 'file:/' 로 적으면 실패하게 됩니다.IllegalStateException : Invalid keystore location 이라고 jks 파일 경로를 못찾는다는 에러가 뜹니다.아무리 구글링해도 이러한 설명은 찾지 못해서 스택오버플로우의 다양한 사례를 보다가 저렇게 경로를 적은 분이 있어서 저도 '/' 를 제거하여 'file:' 로 작성하니 바로 인식이 되어 성공했습니다. 어떻게 된 일인지 너무 궁금합니다. 여기 공식문서에서는 prefix로는 'file:' 을 적으라고 되어있고 윈도우 환경의 절대경로에서는 '/'를 추가하라고 적혀있습니다. 그 외의 글을 읽어도 이해를 못하겠습니다. 강사님께서도 맥북인데 "file:/"로 잘 사용하는 것으로 보아 스프링 버전업이 되면서 뭔가 달라진것인지 질문을 남깁니다.
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
새로운 마이크로서비스가 추가된 경우 클라이언트 배포 여부
1분경, 새로운 마이크로서비스가 배포된 경우에도 API 게이트웨이를 두면 클라이언트는 API게이트웨이만 상대하면 된다고 하셨는데,새로운 마이크로서비스가 생기면 클라이언트는 배포를 하지 않아도 된다는 뜻으로 이해를 했는데,새로운 마이크로서비스와 연결하기 위해서는 클라이언트에도 연결을 위한 코드가 추가될텐데 클라이언트도 배포를 해야 하는 것은 아닌지 문의 드립니다 !감사합니다.
-
미해결
백엔드 아키텍처 공부를 해보고 싶은데요 책이나 강의 추천해주실 수 있을까요..
백엔드 단에서 어떤 아키텍처 속에서 데이터가 흐르는지 궁금해져서 찾아보고 있습니다. 예를 들면 저는 이때까지클라이언트 - 서버 - 웹서버 - DB이 구조만 알고 있었거든요.. 근데 현업에선 좀 더 복잡하고 그 아키텍처를 이루기 위해 다루는 툴들도 다양하더라고요...전 그 부분이 많이 약한 것 같아서 아키텍처 위주로 책이나 강의 찾아보고 있는데아키텍처 책이나 강의 중 어떤걸 우선적으로 선택해서 공부를 시작해야 하나 고민이 되어서.. 이렇게 문의 글을 남깁니다.. ㅠㅠ전 이쪽으론 완전 초보 입니다! 유튜브를 통해서 짧게 나마 익힌 건.. 검색 엔진을 위해서는 elasticsearch를 사용하고 DB 과부화 막기 위해선 redis를 사용한다..뭐 이런 내용을 봤는데저는 좀 더 전체적인 그림을 보고 싶습니다.. ㅠㅠ
-
미해결마이크로서비스 아키텍처 와 MSA 패턴 이해
유연성, 탄력성
세션 10 -1 강의에서설계동향 리액티브 선언 설명해주시는 부분 중유연성과 탄력성을 평가할 수 있는 항목이나 지표를 예를 들어 설명해주시면 이해가 잘 될 거 같습니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Filter우선순위 질문
안녕하세요! MSA강의 섹션2 Logging Filter관련 부분 듣다가 필터 우선순위와 관련된 궁금증이 생겨서 질문 남깁니다! GatewayFilter filter = new OrderedGatewayFilter((exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); log.info("Logging Filter base message: {}",config.getBaseMessage()); if(config.isPreLogger()){ log.info("Logging Filter Start: request uri -> {}",request.getURI()); } //Custom Post Filter return chain.filter(exchange).then(Mono.fromRunnable(()->{ if(config.isPostLogger()){ log.info("Logging Filter End: response Code -> {}",response.getStatusCode()); } })); }, Ordered.HIGHEST_PRECEDENCE); return filter;위와 같은 방식으로 OrderedGatewayFilter를 사용해 filter를 생성했는데 이때 두번째 인자로 Ordered.HIGHEST_PRECEDENCE를 사용할 때와 Ordered.LOWEST_PRECEDENCE를 사용할 때 등장하는 filter 우선순위와 관련된 궁금증이 생겼습니다.HIGHEST를 사용할때는 우선순위가 높은 필터가 먼저 나와서 강의에서도 그렇고 코드 실행결과LoggingFIlter -> GlobalFilter -> CustomFilter의 순서로 Filter 가 등장했는데 그렇다면, 반대로 우선순위가 낮은 경우인 LOWEST를 사용할 때는 CustomFilter -> GlobalFilter -> LoggingFIlter의 순서로 filter가 등장해야한다고 생각하는데 결과가 그렇지 않아서 우선순위에 어떠한 개념이 있는지, 제가 어떤 개념을 놓치고 있는지 의문이 들어 질문글 남깁니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
JDBC Connector 위치가 변경 된거 같습니다.
https://docs.confluent.io/5.5.1/connect/kafka-connect-jdbc/index.html 는 현재 메인 페이지로 이동이 되어서 다음 페이지에서 다운로드 받을수 있었습니다. https://www.confluent.io/hub/confluentinc/kafka-connect-jdbc
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
loadUserByUsername(String username) 의 매개변수가 어디서 오는지 궁금합니다.
loadUserByUsername(String username) 에 매개변수로 들어오는 String username은 AuthenticationFilter의attemptAuthentication에서 만들어 주었던 UsernamePasswordAuthenticationToken 을 사용하는게 맞나요? 맞다면 email을 입력하였는데 어떻게 userName으로 바뀐건지 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
login 요청하면 404 에러가 발생합니다.
포스트맨으로 API_GW를 경유해서 http://127.0.0.1:8000/user-service/login 요청하면 404 에러가 발생합니다.근데 http://127.0.0.1:54656/login 로 바로 리퀘스트하면 200 상태가 반환됩니다.로그인만 저렇고 http://127.0.0.1:8000/user-service/users 요청하면 회원가입은 또 됩니다..어디 부분부터 잘못되었는지 찾아봐야할까요?필터부분도 오타없이 잘 되었는데.. - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/login - Method=POST filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment}/ - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/users - Method=POST filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment}/ - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** - Method=GET filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment}/
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
java.security.KeyStoreException: Uninitialized keystore 에러가 발생 하고 있습니다.
비대칭키를 통한 암호화 과정에서 keytool을 사용하여 올려주신 내용 그대로 keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=Kenneth Lee, OU=API Development, O=joneconsulting.co.kr, L=Seoul, C=KR" -keypass "1q2w3e4r" -keystore apiEncryptionKey.jks -storepass "1q2w3e4r" 키를 생성후 bootstrap.yml에 적용 하였습니다. 그런데 encrypt를 실행 하면 java.security.KeyStoreException: Uninitialized keystore at java.base/java.security.KeyStore.getKey(KeyStore.java:1076) ~[na:na] at org.springframework.security.rsa.crypto.KeyStoreKeyFactory.getKeyPair(KeyStoreKeyFactory.java:80) ~[spring-security-rsa-1.0.11.RELEASE.jar:na] at org.springframework.cloud.config.server.encryption.KeyStoreTextEncryptorLocator.rsaSecretEncryptor(KeyStoreTextEncryptorLocator.java:99) ~[spring-cloud-config-server-3.1.6.jar:3.1.6] 해당 에러가 발생을 하고 있습니다. keytool을 생성시 제 자바 home 버전은 java 18 이고 개발 환경운 java 11 이어서 이런 문제가 생기는 걸까요?
-
미해결Microservice 내부 아키텍처 와 EventStorming 설계
VO, Entity 궁금한 부분이 있습니다.
안녕하세요. 좋은 강의 감사합니다.섹션 8. 실습 - 마이크로서비스 별 도메인 모델 정의 장에서 궁금점이 생겼는데요.우선 제가 DDD 를 공부하며 이해한 VO 는 특별한 identity 가 존재하지 않는 immutable 한 값을 표현하는 객체로 이해했습니다. 실제로 강의에서도 동일한 내용을 이해할 수 있었어요.하지만 실습 장에서 설계된 RentalItem, LateFee 가 VO 즉, 불변 값 객체와는 거리가 있다고 느껴져서요.RentalItem 에서 "is_overdued: boolean", LateFee 에서 "point: Point" 는 각 addLateFee, removeLateFee, overdueItem operation 에 의해서 값이 변경될 것으로 모델이 확인됩니다.제가 그동안 DDD 를 공부하며 이해했더 내용 중 하나는 Aggregate Pattern 에서 Aggregate 가 되는 것은 Root Entity 로 명명되며 Root Entity 내부에 표현되는 것은 Entity 와 VO 로 학습을 했었는데요. 이러한 RentalItem, LateFee 는 Entity 가 되어야 하는 객체 아닌가 의문이 들어서 질문드려요!좋은 강의 감사합니다 :)
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
order-service orderId문제
"not-null property references a null or transient value : com.example.orderservice.jpa.OrderEntity.orderId; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : com.example.orderservice.jpa.OrderEntity.orderId"이 오류는 com.example.orderservice.jpa.OrderEntity 클래스의 orderId 속성이 null 또는 임시 값으로 설정되어 있을 때 발생합니다. 즉, orderId 속성에는 null이 허용되지 않는데, null이나 임시 값으로 설정되었기 때문에 오류가 발생합니다.application.ymlserver: port: 0 spring: application: name: order-service h2: console: enabled: true settings: web-allow-others: true path: /h2-console sql: init: mode: always jpa: database-platform: org.hibernate.dialect.H2Dialect hibernate: ddl-auto: update properties: hibernate: format_sql: true show_sql: true defer-datasource-initialization: true datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb main: allow-bean-definition-overriding: true eureka: instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://127.0.0.1:8761/eureka logging: level: com.example.orderservice: DEBUG OrderEntity@Data @Entity @Table(name = "orders") public class OrderEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, length = 120, unique = true) private String productId; @Column(nullable = false) private Integer qty; @Column(nullable = false) private Integer unitPrice; @Column(nullable = false) private Integer totalPrice; @Column(nullable = false) private String userId; @Column(nullable = false, unique = true) private String orderId; @Column(nullable = false, updatable = false, insertable = false) @ColumnDefault(value = "CURRENT_TIMESTAMP") private Date createAt; } OrderDto@Data public class OrderDto implements Serializable { private String productId; private Integer qty; private Integer unitPrice; private Integer totalPrice; private String orderId; private String userId; } ResponseOrder@Data @JsonInclude(JsonInclude.Include.NON_NULL) public class ResponseOrder { private String productId; private Integer qty; private Integer unitPrice; private Integer totalPrice; private Date createAt; private String orderId; } OrderServicepublic interface OrderService { OrderDto createOrder(OrderDto orderDetails); OrderDto getOrderByOrderId(String orderId); Iterable<OrderEntity> getOrdersByUserId(String userId); } OrderServiceImpl@Service public class OrderServiceImpl implements OrderService{ OrderRepository orderRepository; @Autowired public OrderServiceImpl(OrderRepository orderRepository){ this.orderRepository = orderRepository; } @Override public OrderDto createOrder(OrderDto orderDto){ orderDto.setUserId(UUID.randomUUID().toString()); orderDto.setTotalPrice(orderDto.getQty() * orderDto.getUnitPrice()); ModelMapper mapper = new ModelMapper(); mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); OrderEntity orderEntity = mapper.map(orderDto, OrderEntity.class); orderRepository.save(orderEntity); OrderDto returnValue = mapper.map(orderEntity, OrderDto.class); return returnValue; } @Override public OrderDto getOrderByOrderId(String orderId) { OrderEntity orderEntity = orderRepository.findByOrderId(orderId); OrderDto orderDto = new ModelMapper().map(orderEntity, OrderDto.class); return orderDto; } @Override public Iterable<OrderEntity> getOrdersByUserId(String userId) { return orderRepository.findByUserId(userId); } }OrderController@RestController @RequestMapping("/order-service") public class OrderController { Environment env; OrderService orderService; @Autowired public OrderController(Environment env, OrderService orderService) { this.env = env; this.orderService = orderService; } @GetMapping("/health_check") public String status(){ return String.format("It's Working in Order Service on PORT %s", env.getProperty("local.server.port")); } // http://127.0.0.1:0/order-service/{user_id}/orders/ @PostMapping("/{userId}/orders") public ResponseEntity<ResponseOrder> createOrder(@PathVariable("userId") String userId, @RequestBody RequestOrder orderDetails){ ModelMapper mapper = new ModelMapper(); mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); OrderDto orderDto = mapper.map(orderDetails, OrderDto.class); orderDto.setUserId(userId); OrderDto createOrder = orderService.createOrder(orderDto); ResponseOrder responseOrder = mapper.map(createOrder, ResponseOrder.class); return ResponseEntity.status(HttpStatus.CREATED).body(responseOrder); } @GetMapping("/{userId}/orders") public ResponseEntity<List<ResponseOrder>> getOrder(@PathVariable("userId") String userId){ Iterable<OrderEntity> orderList = orderService.getOrdersByUserId(userId); List<ResponseOrder> result = new ArrayList<>(); orderList.forEach(v -> { result.add(new ModelMapper().map(v, ResponseOrder.class)); }); return ResponseEntity.status(HttpStatus.OK).body(result); } } 다 똑같이 쳤는데 뭐가 문제일까요?
-
해결됨아키텍처 패턴 with iOS - GUI Architecture Patterns(이론)
MVVM 템플릿2 관련
강의를 여러번 다시 들으니 MVVM에 대해 조금 더 이해하게 된것 같습니다.다만 강의를 여러번 다시 들었는데도 응용하기가 조금 어려워서 질문드립니다.PostViewController와 PostViewModel 처럼 뷰컨트롤러나 하위뷰 들도 그저 내용만 표시하는것이라면 강의내용을 따라서 잘 응용하고있습니다.하지만 하위 뷰들에서 input과 output이 추가된다면 어떻게 응용해야할지 잘 모르겠습니다.예를 들어 예제의 PostTableViewCell 에서는 titleLabel과 detailsLabel 밖에 없지만 PostTableViewCell에 textFeild와 같은 input이 추가되고 셀에서 입력한것이 상위뷰인 PostViewController에 표시된다고 했을 때제가 생각했을 때는 PostTableViewCell에서 상위뷰로 데이터를 전달하려면 PostViewModel을 알아야할것 같은데 제가 생각하기엔 이렇게 하는 방법밖에 없는것 같은데final class PostsViewModel: ViewModelType { ... let postTableViewCellInput = PublishSubject<String>() ... } final class PostTableViewCell: UITableViewCell { ... @IBOutlet weak var textField: UITextField func bind(_ viewModel: PostsViewModel) { viewModel.postTableViewCellInput .bind(to: textField.rx.text) .disposed(by: disposeBag) } }이렇게 코드를 짜면 PostTableViewCell이 상위 뷰모델을 받고 PostsViewModel도 하위 뷰의 데이터를 직접 전달받기 때문에 올바른 방법이 아닌것 같아 PostItemViewModel에 Input Output을 받는것으로 수정해보려 했지만 PostItemViewModel의 Intput output을 어떻게 설정해야 PostViewModel에서 하위뷰에서 입력한 데이터를 상위뷰에서 사용할 수 있을지 감이 안잡혀서 질문드립니다
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
(필수정보) 레거시 bootstrap 을 사용하지 않는 방법
* bootstrap 라이브러리를 추가하고 아래와 같이 application.yml 파일만으로 설정하면 적용이 안됩니다.dependency에 bootstrap을 의존성 추가하지 않습니다.그 후 application.yml파일에 아래와 같이 설정합니다.spring: cloud: config: name: ecommerce # yml 파일명 앞부분 config: import: optional:configserver:http://localhost:8888 # 구성정보 설정강의에서 나오는 bootstrap.yml 설정 정보를 Spring Boot 2.4버전 이후부터는 application.yml 설정 정보에서 사용할 수 있습니다. (공식홈페이지)위 방법은 공식 홈페이지 목차에서 Spring Cloud Config Client - Spring Boot Config Data Import 부분에 나와있습니다.만약 bootstrap 라이브러리를 사용한 구성설정을 하고 싶다면 공식홈페이지 목차에서 Spring Cloud Config Client - Config First Bootstrap 부분을 살펴보시면 되겠습니다.
-
해결됨아키텍처 패턴 with iOS - GUI Architecture Patterns(이론)
강의자료같은게 따로 있나요 ??
ppt와 같은 파일 없는것 같아 질문드립니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
특정 도구에서 서버를 실행하면 에러가 발생합니다.
안녕하세요. 강의를 들으면서 코드를 실행하다가 막힌 부분이 있어 질문드립니다.특정 도구에서 사용하면 서버가 실행이 되지 않습니다.인텔리제이 터미널에서 실행한 경우 에러가 발생합니다.PS C:\workplace\user-service> mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003' -e[INFO] Error stacktraces are turned on.[INFO] Scanning for projects...[INFO] [INFO] ----------------------< com.example:user-service >----------------------[INFO] Building user-service 0.0.1-SNAPSHOT[INFO] from pom.xml[INFO] --------------------------------[ jar ]---------------------------------[INFO] ------------------------------------------------------------------------[INFO] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Total time: 0.326 s[INFO] Finished at: 2023-06-27T21:49:08+09:00[INFO] ------------------------------------------------------------------------[ERROR] Unknown lifecycle phase ".run.jvmArguments=-Dserver.port=9003". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: pre-clean, clean, post-clean, validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy. -> [Help 1]org.apache.maven.lifecycle.LifecyclePhaseNotFoundException: Unknown lifecycle phase ".run.jvmArguments=-Dserver.port=9003". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: pre-clean, clean, post-clean, validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy. at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateLifecycleMappings (DefaultLifecycleExecutionPlanCalculator.java:225) at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateMojoExecutions (DefaultLifecycleExecutionPlanCalculator.java:197) at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:119) at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:135) at org.apache.maven.lifecycle.internal.builder.BuilderCommon.resolveBuildPlan (BuilderCommon.java:93) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:100) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283) at org.apache.maven.cli.MavenCli.main (MavenCli.java:206) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:566) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348)[ERROR][ERROR] Re-run Maven using the -X switch to enable full debug logging.[ERROR][ERROR] For more information about the errors and possible solutions, please read the following articles:[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException PowerShell에서 실행한 경우 에러가 발생합니다.PS C:\workplace\user-service> java -jar -Dserver.port=9004 .\target\user-service-0.0.1-SNAPSHOT.jarError: Unable to access jarfile .port=9004※ PowerShell에서 실행한 명령어를 명령 프롬프트에서 실행하면 정상작동됩니다.감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
로그인 요청시 401 상태 반환
로그인 시도 시 401 오류를 반환하고 있습니다.user-service의 AuthenticationFilter 에서 인증이 실패가 된지 알아 디버깅을 해보니 인증이 성공해서 도대체 어디가 문제인지 알 수가 없습니다.그래서 유저 서비스에 직접 접근을 할 시 똑같은 401 오류를 반환하고 있습니다.그리고 유저 서비스에 직접 접근을 하거나 게이트웨이로 접근해도 성공에 관한 메소드는 작동하지 않습니다.< 스프링 부트, 시큐리티는 현재 최신 버전입니다. > AuthenticationFilter 클래스@RequiredArgsConstructor @Slf4j public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final UserService userService; @Value("${token.expiration_time}") private Long EXPIRATION_TIME; @Value("${token.secret}") private String secretKey; @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { log.info("attemptAuthentication"); try{ RequestLoginVo cred=new ObjectMapper().readValue(request.getInputStream(), RequestLoginVo.class); log.info(cred.getEmail()+" "+cred.getPassword()); return this.getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken( cred.getEmail(), cred.getPassword(), new ArrayList<>() )); } catch(IOException e){ throw new RuntimeException(e); } } @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { String userName = ((User)authResult.getPrincipal()).getUsername(); UserDto userDto = userService.getUserDetailByEmail(userName); String token = Jwts.builder() .setSubject(userDto.getUserId()) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, secretKey) .compact(); response.addHeader("token",token); response.addHeader("userId",userDto.getUserId()); } }loadUserByUsername 메소드@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.info("loadUserByUsername "+username); Optional<UserEntity> userEntity = userRepository.findByEmail(username); log.info(userEntity.get().getEmail()+" "+userEntity.get().getName()+" "+userEntity.get().getEncryptedPwd()); if(userEntity.isEmpty()){ throw new UsernameNotFoundException("해당 유저는 존재하지 않습니다."); } return new User(userEntity.get().getEmail(), userEntity.get().getEncryptedPwd(), true, true, true, true, new ArrayList<>()); }WebSecurity 클래스@Configuration @EnableWebSecurity @RequiredArgsConstructor public class WebSecurity{ private final BCryptPasswordEncoder bCryptPasswordEncoder; private final UserService userService; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) .headers(headers -> headers .frameOptions((frameOptions) -> frameOptions.disable())) .authorizeRequests(authorize -> authorize .requestMatchers(PathRequest.toH2Console()).permitAll() .requestMatchers("/**").hasIpAddress("127.0.0.1") ) .addFilter(getAuthenticationFilter()); return http.build(); } @Bean public AuthenticationManager authenticationManager() { DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setUserDetailsService(userService); provider.setPasswordEncoder(bCryptPasswordEncoder); return new ProviderManager(provider); } private AuthenticationFilter getAuthenticationFilter() { AuthenticationFilter authenticationFilter = new AuthenticationFilter(userService); authenticationFilter.setAuthenticationManager(authenticationManager()); return authenticationFilter; } }ApiGateWay - Application.yml 유저 서비스 부분 routes: - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/login - Method=POST filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment} - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/users - Method=POST filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment} - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** - Method=GET filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*) , /$\{segment} - AuthorizationHeaderFilter
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의를 다 듣고난 후 YAML 설정파일 관련 궁금한 부분이 있습니다.
각 마이크로서비스 내에서도 application.yml을 두고,config service으로 부터 읽어오는 설정파일을 지정할 수 있다는 부분을 강의를 통해 배웠습니다. 1) 제가 궁금한 부분은 애플리케이션 내부 설정파일과 config service가 읽어오는 설정파일에 적는 정보는 어떤 기준으로 나뉘나요? 즉, 어떠한 정보를 애플리케이션 내부 설정파일에 두며, 어떤한 정보는 애플리케이션 내부 보다는 config-service로 부터 읽어들이는 설정파일에 정보를 두게되는 기준이 있으실까요?2) 또 다른 궁금점은 꼭 필요한 설정을 제외하고는 대부분의 설정 정보를 config-service로부터 읽어오는 설정파일에 넣어놔도 괜찮나요?? 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
No suitable driver 나오시는 분들
https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar제 경우 mariadb 커넥터 대신 mysql 커넥터 사용해서 해결했습니다.(... confluentXXX/share/java/kafka 폴더에 위치)정말.. 하루종일 아래 예외로 애먹었네여..Error while starting connector ...No suitable driver found for jdbc:mysql://localhost:3307/mydb mariadb 버전별 커넥터를 5개정도 해봐도 안되어서자포자기한 채로 mysql 커넥터를 사용하니 되었습니다 ㅠㅠ자세한 버전 정보입니다. (윈도우)kafka : 2.13-3.4.0kafka-connect-jdbc : 10.7.2confluent : 7.4.0mariaDB : 10.11java : 17 설정 정보입니다.confluent/etc/kafka/connect-distributed.properties89번 행 근처 plugin.path=\C:\\Work\\confluentinc-kafka-connect-jdbc-10.7.2\\lib confluent/bin/windows/kafka-run-class.bat97번 행 근처 rem classpath addition for LSB style path if exist "%BASE_DIR%\share\java\kafka\*" ( call :concat "%BASE_DIR%\share\java\kafka\*" ) (...) 122번 행 근처 rem Log4j settings IF ["%KAFKA_LOG4J_OPTS%"] EQU [""] ( if exist %~dp0../../etc/kafka/tools-log4j.properties ( set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%~dp0../../etc/kafka/tools-log4j.properties ) else ( set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%BASE_DIR%/etc/kafka/tools-log4j.properties ) ) ELSE ( rem create logs directory IF not exist "%LOG_DIR%" ( mkdir "%LOG_DIR%" ) set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%~dp0../../etc/kafka/tools-log4j.properties ) confluent/bin/windows/connect-distributed.bat28번 행 근처 rem Log4j settings IF ["%KAFKA_LOG4J_OPTS%"] EQU [""] ( set KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:%BASE_DIR%/etc/kafka/connect-log4j.properties -Dlog4j.config.dir=%BASE_DIR%/etc/kafka )POST Request{ "name":"my-source-connect", "config":{ "connector.class" : "io.confluent.connect.jdbc.JdbcSourceConnector", "connection.url":"jdbc:mysql://localhost:3307/mydb", "connection.user":"root", "connection.password":"1234", "mode":"incrementing", "incrementing.column.name":"id", "table.whitelist":"users", "topic.prefix":"my_topic_", "tasks.max":"1" } }
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka connector mysql 연결 오류
kafka connector mysql 연결 부분에서 오류가 납니다mac m1 환경인데 구글링해도 이유를 모르겠어서 질문 남깁니다