묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
jwt 인증401 뜹니다.
@Component @Slf4j public class AuthorizationHeaderFilter extends AbstractGatewayFilterFactory<AuthorizationHeaderFilter.Config> { Environment env; public AuthorizationHeaderFilter(Environment env) { super(Config.class); this.env = env; } public static class Config { // } @Override public GatewayFilter apply(Config config) { // ServerWebExchange 파라미터는 필터가 동작하는 동안 현재 요청 및 응답에 대한 정보를 제공한다. // 비동기 서버 Netty 에서는 동기 서버(ex:tomcat)와 다르게 request/response 객체를 선언할 때 Server~ 를 사용한다. GatewayFilter filter = (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); // 요청 헤더에 "Authorization" 헤더가 포함되어 있는지 확인한다. if (!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) { // "Authorization" 헤더가 없는 경우, UNAUTHORIZED(401) 상태로 에러 응답을 반환. return onError(exchange, "No Authorization header", HttpStatus.UNAUTHORIZED); } // "Authorization" 헤더에서 JWT 토큰을 추출. String authorizationHeader = request.getHeaders().get(HttpHeaders.AUTHORIZATION).get(0); // "Bearer " 문자열을 삭제하고 토큰만 추출 String jwt = authorizationHeader.replace("Bearer ", ""); log.info("authorizationHeader : " + authorizationHeader); log.info("jwt : " + jwt ); // 추출한 JWT 토큰의 유효성을 확인. if (!isJwtValid(jwt)) { return onError(exchange, "JWT Token is not valid", HttpStatus.UNAUTHORIZED); } // JWT 토큰이 유효한 경우, 다음 필터로 요청을 전달. return chain.filter(exchange); }; return filter; } private boolean isJwtValid(String jwt) { // 반환값으로 사용할 boolean 변수를 초기값 true로 설정 boolean returnValue = true; // JWT의 'subject'를 저장할 변수 초기화 String subject = null; try { // 환경 변수에서 토큰의 비밀 키 가져오기 String secretKey = env.getProperty("token.secret"); log.info("secretkey : " + secretKey); // JWT 파서를 생성하고 토큰의 비밀 키 설정 JwtParser jwtParser = (JwtParser) Jwts.parser().setSigningKey(secretKey); // JWT 파서를 사용하여 토큰을 파싱하고 Claims 객체를 반환 Claims claims = jwtParser.parseClaimsJws(jwt).getBody(); // 토큰에서 'subject' 정보 추출 subject = claims.getSubject(); log.info("subject:" + subject); } catch (Exception e) { // 예외가 발생하면 JWT가 유효하지 않다고 판단하고 반환값을 false로 변경 returnValue = false; } // 'subject' 값이 비어있으면 JWT가 유효하지 않다고 판단하고 반환값을 false로 변경 if (subject == null || subject.isEmpty()) { returnValue = false; } // 최종적으로 JWT의 유효성 여부를 나타내는 반환값을 반환 return returnValue; } // Mono, Flux -> Spring WebFlux (기존의 SpringMVC 방식이 아니기때문에 Servlet 을 사용하지 않음) private Mono<Void> onError(ServerWebExchange exchange, String err, HttpStatus httpStatus) { ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(httpStatus); log.error(err); return response.setComplete(); } }authorizationHeader : Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6Iltjb20uZXhhbXBsZS5qd3Rqd3QuZmlsdGVyLkN1c3RvbVVzZXJEZXRhaWxzJDFANjIxMDI1MGNdIiwiaWF0IjoxNzEyNjUxODYzLCJleHAiOjE3MTI2NTE4OTl9.oH-cw5zNVM43LIEj173W0zof5PcbhIa6CiTq1lEHRWs jwt : eyJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6Iltjb20uZXhhbXBsZS5qd3Rqd3QuZmlsdGVyLkN1c3RvbVVzZXJEZXRhaWxzJDFANjIxMDI1MGNdIiwiaWF0IjoxNzEyNjUxODYzLCJleHAiOjE3MTI2NTE4OTl9.oH-cw5zNVM43LIEj173W0zof5PcbhIa6CiTq1lEHRWs secretkey : user_token JWT Token is not valid이렇게 뜨는데 뭐가 문제일까요??
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
강의자료
안녕하세요. 강의 자료 부탁드립니다(dbsdk5395@naver.com)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http 메시지 컨버터 호출에 대해 질문드립니다.
안녕하세요.다른 학생분들의 질문 중https://www.inflearn.com/questions/858726/%EC%A0%9C%EA%B0%80-%EC%83%9D%EA%B0%81%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94-%EB%8F%99%EC%9E%91%EA%B3%BC%EC%A0%95-%ED%94%BC%EB%93%9C%EB%B0%B1%EC%9D%84-%EB%B6%80%ED%83%81%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4이 글을 보았습니다. 6-2. 위의 경우가 아니면, ReturnValueHandler는 반환 값의 타입에 따라 적절한 HttpMessengerConverter를 통해 응답 메세지를 생성 후, ... 라고 되어있는데,@ResponseBody가 붙어있지않거나 HttpEntity 객체를 반환하는게 아니라면, ReturnValueHandler가 굳이 HttpMessgeConverter 를 호출하지않아도 되지않나요?
-
미해결스프링 시큐리티 OAuth2
어세스토큰 발급과 관련해서 질문합니다
안녕하세여, 관련하여 수업을 듣고있던중 저희쪽 소스에서는 인증토큰을 발행해Tokenstore 에 저장해서 사용하고있습니다 . 다만 토큰 만료시간이 되지않으면 로그아웃 처리를 하여도(프런트에서 로컬스토리지 제거만 해주고있음) 다시 그 토큰을 재사용 할수있게됩니다 . 이를 위해토큰 재사용을 막기위해 고민하고있는데요. 혹시 어떤식으로 구현하면 좋을지 조언 부탁드립니다. (토큰스토어에 저장된 토큰을 어떻게 꺼내오고 블랙리스트 목록으로 저장을 해야될지 .. 너무 막막합니다)
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
(랜덤숫자)ElevateButton.styleFrom 의 primary : RED_COLOR 가 오류가 발생합니다.
SizedBox(width: double.infinity,child: ElevatedButton(style: ElevatedButton.styleFrom(primary : RED_COLOR,),onPressed: () {},child: Text('생성하기!')),),이부분에서 lib/screen/home_screen.dart:52:25: Error: No named parameter with the name 'primary'.primary : RED_COLOR,이런 오류가 나와요- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
미해결Atlassian Jira Cloud 입문자를 위한 필수 강의 구성부터 관리까지
이메일 알림 문의
안녕하세요혹시 이메일 알람 관련 강의는 없을까요?현재 Free버전을 사용중인데, 구글링 하면서 확인을 해봐도 잘못된 부분이 없는것 같은데 Jira에서 메일이 오지 않아 문의 드립니다.
-
미해결Do it! Node.js 프로그래밍 입문
에러 도와주세요
6:26 기준 똑같이 따라했는데 TypeError: Cannot use 'in' operator to search for 'pluralization' in undefined at Mongoose._model (/Users/leooh/Desktop/doit-node-main/myContacts/node_modules/mongoose/lib/mongoose.js:612:43) at Mongoose.model (/Users/leooh/Desktop/doit-node-main/myContacts/node_modules/mongoose/lib/mongoose.js:581:27) at Object.<anonymous> (/Users/leooh/Desktop/doit-node-main/myContacts/models/contactModel.js:20:26) at Module._compile (node:internal/modules/cjs/loader:1376:14) at Module._extensions..js (node:internal/modules/cjs/loader:1435:10) at Module.load (node:internal/modules/cjs/loader:1207:32) at Module._load (node:internal/modules/cjs/loader:1023:12) at Module.require (node:internal/modules/cjs/loader:1235:19) at require (node:internal/modules/helpers:176:18) at Object.<anonymous> (/Users/leooh/Desktop/doit-node-main/myContacts/controllers/contactController.js:2:17) 오류가 나옵니다 무엇이 문제일까요??
-
미해결김영한의 실전 자바 - 기본편
생성자의 역할에 대해 질문드립니다.
안녕하세요,자바 생성자에 대해서 궁금한게 있어서 질문드립니다.보통 생성자는 변수의 초기화를 해주기 위해서 많이 사용하는데요. 강의에서 배운것을 기준으로 하면public class A { private String a; private String b; public A(String a, String b) { this.a = a; this.b = b; } }이런식으로 초기화를 위해 생성자를 사용하는데, 혹시 이런 방식으로public class A { private String a; private String b; public A(String c, String d) { this.a = "new" + c; this.b = "apple" + d; } }매개변수로 a,b를 받아서 초기화하는게 아니라c,d와 같은 다른 변수를 받아서 새로운 것을 만들어줄때도 생성자를 사용하는지 궁금합니다!
-
미해결따라하며 배우는 MySQL on Docker
docker orchestrator 설치후 웹접속
안녕하세요 virtualbox 에 centos7로 공부중입니다. cli 모드로 진행중이라Orchestrator Container 실행후 웹접속은 로컬을 통해 접속해서 진행하려고 하는데요. 로컬에서 docker 컨테이너 ip넣고 해봐도 웹으로 접속이 안되는데 혹시 방법을 알수있을까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Intl을 사용하여 한국어로 변경을 하였는데.. 숫자만 나와야하는데 1일,2일 이런식으로 나옵니다..
(사진)
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
V5 회원등록 404 오류
/front-controller/v5/v3로 바꾸어도 안되어서요.도움 주시면 감사하겠습니다. https://drive.google.com/file/d/1JVYX7_d3zUXJIrh2xICiBdLCFaufUCBR/view?usp=sharing
-
미해결
test tag enter key
enter key
-
해결됨인프라공방 - 그럴듯한 서비스 만들기
sql 2번 쿼리 정답이 궁금합니다
정답 예시에서는 91개가 조회되는데 제가 생각한 쿼리는 89개만 조회가 됩니다. 쿼리가 잘못된걸 까요?SELECT c.customerId `고객아이디`, c.customername as `고객이름`, sum(Quantity) as `주문량` FROM OrderDetails od join Orders o on o.OrderId = od.OrderId join Customers c on c.customerId = o.customerId group by o.customerId order by sum(Quantity) desc ;
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
질문 있습니다.
제네릭은 c++ 템플릿이랑 같다고 생각하면 될까요?
-
미해결스프링 핵심 원리 - 기본편
@Component 와 @Primary에 관하여
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. DiscountPolicy 인터페이스 에는fix,rate 하위 클래스가 있는데어차피 fix 클래스에 @Component 사용하면 fix 클래스 부분만 의존성이 주입되서 rate는 사용못하니까 굳이 @primary를 사용할 필요가 없지않나요? fix와rate동시에 @Component 의존성 주입을 못하는걸로 알고있습니다.
-
미해결스프링 핵심 원리 - 기본편
싱글톤 컨테이너 - @Configuration과 싱글톤 강의 관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.싱글톤 컨테이너 - @Configuration과 싱글톤 강의에서 System.out.println("memberService -> memberRepository = " + memberRepository1); System.out.println("orderservice -> memberRepository = " + memberRepository2); System.out.println("memberRepository = " + memberRepository)이렇게 출력하면 전부 같은 memberRepository가 출력되야되는데 저는 전부 다른 memberRepository가 출력 됩니다. 이유를 모르겠습니다.
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL
수강 기간 연장 문의
안녕하세요 강사님!강의를 방학 기간에 신청해두고 다른 것들을 먼저 하느라 여력이 없었는데, 뒤늦게 돌아보니 수강 기한이 얼마 안 남았네요..혹시 가능하다면 일주일 정도라도 수강기한 연장 부탁드려도 될까요..?확인하시면 답신 부탁드립니다 ㅠㅜ('전체 질문' 설정창이 따로 안 보여서 부득이 '수업 질문'으로 올리게 되었습니다,,!)
-
미해결Practical Testing: 실용적인 테스트 가이드
환경별 DB 분리 질문있습니다.
안녕하세요.application.yml에서 local, test로 환경을 나누어서 h2 db를 통해 테스트 코드를 만들어보고있습니다.나중에 운영 서버나 릴리즈 서버같은곳에 빌드, 배포할때도 테스트를 진행해야 할텐데 DB 주소를 어떻게 설정하는게 좋을까요? 각각 실제로 사용할 DB의 주소를 적어놓을텐데 빌드하면서 테스트를 진행하면 해당 DB의 테이블과 데이터를 건드리게 될거란 생각이 들어서요..테스트용 resources로 yml을 따로 작성해서 해야할까요?
-
미해결
aaa
ccc
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
N + 1 쿼리 횟수
안녕하세요 강의 너무 잘 듣고 있습니다."간단한 주문 조회 V2: 엔티티를 DTO로 변환" 강의를 듣던 중 궁금한 점이 생겨 질문 드립니다.Order 엔티티를 SimpleOrderDto로 변환하는 과정에서 아래 조건으로 인해 샘플 데이터 2개 기준 총 5(1 + 2 + 2)번의 쿼리가 날아간다고 이해했습니다.order -> member 지연 로딩 조회 N번order -> delivery 지연 로딩 조회 N번근데 저는 order -> delivery 쿼리 이후에 order를 찾는 쿼리가 한번 더 날아가는 것처럼 보입니다. 총 7번의 쿼리가 발생하는 것 같은데 무엇 때문인지 설명해주실 수 있을까요?코드와 콘솔 로그는 아래 첨부했습니다. 감사합니다.// Order 엔티티 @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; // 주문상태 // Delivery 엔티티 @Id @GeneratedValue @Column(name = "delivery_id") private Long id; @JsonIgnore @OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY) private Order order; @Embedded private Address address; @Enumerated(EnumType.STRING) private DeliveryStatus status; // READY, COMP // OrderSimpleApiController @GetMapping("/api/v2/simple-orders") public List<SimpleOrderDTO> ordersV2() { List<Order> orders = orderRepository.findAll(new OrderSearch()); return orders.stream() .map(SimpleOrderDTO::new) .toList(); } @Data static class SimpleOrderDTO { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; public SimpleOrderDTO(Order order) { this.orderId = order.getId(); this.name = order.getMember().getName(); // Lazy 초기화 this.orderDate = order.getOrderDate(); this.orderStatus = order.getStatus(); this.address = order.getDelivery().getAddress(); // Lazy 초기화 } }2024-04-09T13:27:53.982+09:00 DEBUG 12424 --- [nio-8080-exec-2] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id 2024-04-09T13:27:53.984+09:00 INFO 12424 --- [nio-8080-exec-2] p6spy : 1712636873984|0|statement|connection 7|url jdbc:h2:tcp://localhost/~/jpashop_v2|select o1_0.order_id,o1_0.delivery_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id|select o1_0.order_id,o1_0.delivery_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id 2024-04-09T13:27:54.005+09:00 DEBUG 12424 --- [nio-8080-exec-2] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.member_id=? 2024-04-09T13:27:54.007+09:00 INFO 12424 --- [nio-8080-exec-2] p6spy : 1712636874007|0|statement|connection 7|url jdbc:h2:tcp://localhost/~/jpashop_v2|select m1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name from member m1_0 where m1_0.member_id=?|select m1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name from member m1_0 where m1_0.member_id=1 2024-04-09T13:27:54.012+09:00 DEBUG 12424 --- [nio-8080-exec-2] org.hibernate.SQL : select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2024-04-09T13:27:54.013+09:00 INFO 12424 --- [nio-8080-exec-2] p6spy : 1712636874013|0|statement|connection 7|url jdbc:h2:tcp://localhost/~/jpashop_v2|select d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status from delivery d1_0 where d1_0.delivery_id=?|select d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status from delivery d1_0 where d1_0.delivery_id=1 2024-04-09T13:27:54.016+09:00 DEBUG 12424 --- [nio-8080-exec-2] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=? 2024-04-09T13:27:54.016+09:00 INFO 12424 --- [nio-8080-exec-2] p6spy : 1712636874016|0|statement|connection 7|url jdbc:h2:tcp://localhost/~/jpashop_v2|select o1_0.order_id,o1_0.delivery_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.delivery_id=?|select o1_0.order_id,o1_0.delivery_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.delivery_id=1 2024-04-09T13:27:54.018+09:00 DEBUG 12424 --- [nio-8080-exec-2] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.member_id=? 2024-04-09T13:27:54.019+09:00 INFO 12424 --- [nio-8080-exec-2] p6spy : 1712636874019|0|statement|connection 7|url jdbc:h2:tcp://localhost/~/jpashop_v2|select m1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name from member m1_0 where m1_0.member_id=?|select m1_0.member_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name from member m1_0 where m1_0.member_id=2 2024-04-09T13:27:54.020+09:00 DEBUG 12424 --- [nio-8080-exec-2] org.hibernate.SQL : select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2024-04-09T13:27:54.020+09:00 INFO 12424 --- [nio-8080-exec-2] p6spy : 1712636874020|0|statement|connection 7|url jdbc:h2:tcp://localhost/~/jpashop_v2|select d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status from delivery d1_0 where d1_0.delivery_id=?|select d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status from delivery d1_0 where d1_0.delivery_id=2 2024-04-09T13:27:54.021+09:00 DEBUG 12424 --- [nio-8080-exec-2] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=? 2024-04-09T13:27:54.021+09:00 INFO 12424 --- [nio-8080-exec-2] p6spy : 1712636874021|0|statement|connection 7|url jdbc:h2:tcp://localhost/~/jpashop_v2|select o1_0.order_id,o1_0.delivery_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.delivery_id=?|select o1_0.order_id,o1_0.delivery_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.delivery_id=2