묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결처음 만난 리액트(React)
빨간줄이 왜 싱기는지 모르겠습니다.
빨간줄은 뜨는데 왜 빌드는 되는건가요..??
-
해결됨스프링 시큐리티 OAuth2
모바일앱의 인증을 위해 자체 인가서버와 소셜로그인을 함께 사용하는 경우
우선 좋은 강의 감사하다는 말씀드립니다. 올려주신 강의 2편 모두 잘 보고 있고 실무에서 많은 도움을 받고 있습니다.강사님께 배운 내용을 토대로 인증시스템을 구성해보려던 중 질문 사항이 있어 질문드립니다. 강의에서는 웹애플리케이션 기반 인증에 비중을 두고 설명을 잘 해주셨는데, 모바일 애플리케이션에 대상으로 인증을 구성을 해보려하니 조금 헷갈리는 부분이 있네요.요구사항은 아래와 같은데요,추후 내부 리소스를 외부서비스에 제공하기 위한 자체 OAuth2.0인가 서버 구성모바일 애플리케이션에서 JWT기반 인증을 할 수 있는 인증 및 회원 가입 API자체 OAuth2 인가서버와 연계하여 구성되는 리소스서버 구성소셜로그인 기능인증 시스템을 구성하기 위해 아래와 같은 방법을 생각하고 있습니다.자체 인증 시스템을 통한 로그인의 경우 자체 모바일앱에 별도의 web view를 생성하고 싶지 않으므로 API로 로그인 정보를 바로 받아서 내부적으로 Resource Owner Password Flow 처리하여 토큰 반환유저가 모바일앱 UI에 OAuth2 인가서버 계정정보(ID/PASSWORD)를 직접 입력로그인 버튼 클릭 시, 서버가 계정 정보를 API로 직접 전달받아 내부적으로 Resource Owner Password Flow를 통해 검증하고 토큰 및 인증 필요 정보를 클라이언트에 반환소셜로그인의 경우, 안전한 인증을 제공하기 위해 모바일 UI에 별도의 webView를 띄우고 Authorization Code Grant방식으로 인증진행webView를 통해 외부서비스에 대한 Authorization Code Grant 흐름이 진행.최종적으로 서버가 리다이렉트 주소를 통해 code를 전달받아 소셜 인증이 완료되는 경우(최초 회원인 경우 가입 처리하고), 서버는 자체 리소스서버에서 검증할 수 있는 Access Token을 따로 발급하여 응답하고 이를 모바일앱이 수신하여 인증처리. 질문은 아래와 같습니다.OAuth2.0 인가서버를 운용하는 경우 자사 모바일 앱의 자체로그인을 Resource Owner Password Flow로 직접 처리하는 것이 일반적인 방법인지? 더 좋은 방법은 없는지?외부 소셜 로그인의 경우 패스워드 없이 가입처리를 해야하는데 자체인가서버의 회원과 어떻게 일괄적으로 관리가 가능할지?외부 소셜 로그인의 경우라도 최종 발급되는 토큰은 자체 리소스서버에서 검증가능하도록 자체로그인과 일괄된 방법으로 JWT 발급이 되어야 할 것 같은데, Spring Authorization Server를 통해 효율적으로 구성이 가능할지?소셜로그인의 경우 서버가 리다이렉트 주소를 통해 code를 받아오더라도 OAuth2AuthorizedClient까지만 확인하고 세션에 인증정보를 저장하고 싶지 않은데 어떻게 효율적으로 custom 가능할지?oauth2Client API 및 OAuth2AuthorizedClientManager를 통해 토큰을 받아오는 것을 생각하고 있는데 더 합리적인 방법은 없을지?긴 질문 읽어주셔서 감사합니다. 질문가지수가 많아서 죄송하네요. 답변 주실 수 있는 부분까지만 주셔도 괜찮습니다.혹시 제가 구상하는 방법에서 개선되어야 하는 부분이나 혹시나 제가 잘못 생각하고 있는 부분은 없을 지 이런 부분도 조언해주시면 너무 감사하겠습니다.
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
새 일기 작성 시 새 일기가 작성되지 않음
새 일기 작성이 되지 않아서 강의 따라서 해보고다른분들이 같은 문제로 올린 곳에서 문제해결 하신분들 코드를 가져와서 해봤는데 안되서 올립니다.https://github.com/lhs0698/emotion_Diary
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
Failed to compile [./src/App.js 12:35-41 문제 원인 좀
어디 쪽에서 문제가 발생 하는지 모르겠습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[2-A] 2차원 동적배열(포인터) 전역선언 vs 지역선언
안녕하세요 큰돌님.2-A 문제 푸는중에 런타임 에러(Double free)가 발생하였습니다.우선 문제를 풀긴했는데, 오류 발생한 코드와 정답을 맞춘 코드의 차이가 아래의 2차원 포인트를 어디에 선언했냐에 따라 달라졌습니다.int** adj = new int* [N];int** visited = new int* [N]; 질문1) 2차원 동적배열(포인터) 지역선언 혹은 전역선언에 따라 해제(delete)의 영향을 받을 수 있는지 궁금합니다.틀린코드에서 디버깅할때 항상 2차원 포인터 해제에서 문제가 발생하였습니다.delete[] adj;delete[]visited; 질문2(기타질문) 비쥬얼 스튜디오에서 scanf()를 사용할 시, #define CRTSECURE_NO_WARNINGS 구문을 넣어줘야하는데, 실제 시험에서도 해당 구문을 넣어도 문제가 안되는지 궁금합니다. [틀린 코드]http://boj.kr/dcf6622717a34c72be6ec24d2b179a8c[정답 코드]http://boj.kr/55b2a222039740d1a83dec82eb13576e
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-I질문 답지도 무조건 x를 받거 아닌가요? ㅠㅠ
stark님이 올리신 질문 봐도 잘 이해가 안가네요
-
미해결스프링 배치
스프링 배치 스케일 아웃 관련 문의
안녕하세요. 선생님 강의 들으면서 실무에 Spring Batch를 잘 녹여보고자 노력하고 있는 직장인입니다. 다름이 아니라 부서에서 Spring Batch를 활용해 배치의 성능을 높여야 하는 상황이라, 스케일 아웃을 고려하고 있는데요. 문제는 스케일 아웃을 하되 워커(혹은 슬레이브) 서버에서는 DB에 접근을 하지 못하는 상황이라, read-process-write의 구조에서 read/write는 마스터 서버에서 처리 해야 하는 상황입니다. 그래서 처음에는 AsyncItemProcessor/AsyncItemWriter를 활용하여, 마스터 프로세스에서 워커 서버들에 HTTP API를 호출하고 결과를 리턴 받으면 write를 하는 방식을 고려 했는데요.그런데, chunk 단위로 순차적으로 read-process-write를 하다보니 기대보다는 성능이 안나오고 있습니다 😭 사실 기대했던 바는 process를 하고 있을 때 read/write도 동시에 진행되면 어떨까였습니다. (이 부분이 혹시 잘못됐다면 지적해주세요.) 그래서 든 생각이 read-process-write가 chunk 단위로 순차적으로 되는 진행되는 것이 아니라, reader와 processor와 writer가 서로 publisher-subscriber 구조로 개별적으로 동작하는게 어떨까라는 생각이 들었습니다.조금 더 말씀드리면 reader가 파일을 읽어 큐에 넣고 processor는 큐의 데이터를 읽어 처리하고 writer가 보고 있는 queue에 넣으면 writer가 해당 큐를 참조하여 파일 write를 하는 방식입니다. 혹시 이 아이디어에서 제가 잘못 생각하고 있는게 있을까요? 아니면 기존의 chunk oriented tasklet을 손보면 말씀드린 것과 같은 구조를 만들 수가 있나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링 폼태그 form:textarea에 디비에서 불러온 값을 표시하는 방법
안녕하세요.스프링 폼태그를 이용해서 디비에 저장된 값을 textarea에 출력하고 싶습니다.그런데 스프링 폼태그는 태그 사이에 값을 넣을 수 없고, form:textarea에는 value 속성이 없습니다. placeholder에 넣는 방법도 있긴 한데 그건 저 코드와 동일하진 않아서요.HTML로 작성한<textarea rows="5" cols="20" placeholder="내용" name="content">${board.content}</textarea>를 스프링 폼태그로 바꾸려면 어떻게 하는 게 좋을까요?
-
미해결홍정모의 따라하며 배우는 C언어
[3.11] 4바이트 정수 범위에서 왜 유효숫자가 9개인지 모르겠습니다.
-2,147,483,648에서 -2 자리는 모든 숫자 (-3, -4) 이런 건 안 되니까 정밀도로 보장할 수 없고 나머지는 정밀도로 보장이 된다고 하셨는데 -2 자리는 왜 정밀도로 보장할 수 없다는 건지 뭐가 안 된다는 건지 이해가 되지 않습니다. 그리고 정밀도로 보장한다 안 한다의 개념이 무엇인지 좀 더 명확하게 알고 싶습니다. exponent를 저장할 때 음의 지수가 필요- unsigned 형태로 저장을 하고 127을 빼기 8bit 정수는 0 ~ 255까지인데 -127을 하면 -127 ~ 128 범위의 숫자를 표현할 수 있기 때문+) unsigned int 타입으로 저장을 할 때 모든 bit가 0이거나 1인 경우에는 다른 용도로 사용을 한다고 함 일반적으로 -126에서 128의 범위를 가짐 위 설명에서 이해 안 되는 점 1. 컴퓨터가 지수를 저장할 때 왜 음의 지수가 필요한지2. 다른 용도라는 게 무엇을 말하는 건지3. 앞에 음의 지수를 나타내는 방법 설명하실 때는 0~255 범위에서 -127을 하니까 -127~128 범위를 가진다고 하셨는데 왜 추가적으로 설명한 부분(모든 bit가 0이거나 1인 경우)에서는 -127~128이 아닌 -126~128의 범위를 가지는지답변 해주시면 감사하겠습니다.
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
안드로이드 스튜디오 자바 코틀린 혼용
강의 외 내용입니다만..안드로이드 스튜디오에서 자바랑 코틀린 코드를 같이 사용 할 수 있는 방법이 없을까요?구글링해도 중간 과정 생략된 방법들이랑 저의 플러그인 속에서는 코틀린이 installed 되어있는거 같은데 버전 확인도 안됩니다..상대는 자바 전 코틀린으로 프로젝트 진행하려고 했는데같은 프로젝트에서 자바랑 코틀린 같이 사용 할 수 있는지 궁금하고 가능하면 방법도 궁금합니다.. 6시간 넘게 찾고 있는데 다 안되거나 과정 생략이네요..코틀린에 있는 var : 이런거랑 자바에서 쓰이는 ; 세미콜론 같은걸 하나의 액티브 클래스?파일에서 사용가능한지 궁금합니다윗줄 var : 어쩌구아랫줄 자바 어쩌구 ; 이 가능한지요
-
미해결실전! 웹사이트제작! Step by Step! (대방산업_InteractiveWeb)
Splitting / 텍스트가 빠르게 올라는게 아니라 천천히 느리게 올라오게 하려면 어떻게 수정하면 될까요?
Splitting / 텍스트가 빠르게 올라는게 아니라 천천히 느리게 올라오게 하려면 어떻게 수정하면 될까요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
For반복문 예제
안녕하세요, 선생님블로그에 선생님 강의 내용에서 예제를 따라치면서 정리하는 과정에 궁금증이 생겨서 여쭤봅니다. 증감연산자의 위치가 여러 예제문에서 헷갈리는데요. (sold++;)int max = 30; int noShow = 15; int sold = 0; for (int i = 1; i <=50 ; i++) { System.out.println(i+"번 손님 나왔습니다"); if(i==noShow){ System.out.println(i+"번 노쇼로 넘어갑니다"); continue; } sold++; if(sold==max){ System.out.println("금일 영업종료"); break; } 위의 코드에서 sold++위치를 아래와 같이 바꿀 경우에 for문 중괄호 안에는 들어가 있어서 가능할 거 같은데 결과는 32번 손님까지 이어지네요. 비슷한 예제로 while문에서는 증감연산자의 위치가 break뒤에 위치한 경우 결과값이 올바르게 나오는데 확실하게 증감연산자의 위치를 구별 할 수 있는 방법이 있을까요?int max = 30; int noShow = 15; int sold = 0; for (int i = 1; i <=50 ; i++) { System.out.println(i+"번 손님 나왔습니다"); if(i==noShow){ System.out.println(i+"번 노쇼로 넘어갑니다"); continue; } sold++; if(sold==max){ System.out.println("금일 영업종료"); break; } sold++; } ------------------------------------ //while문 -break int index = 1; //손님 대기번호 , for와 달리 변수가 필요함(중요) while(index <= 50){ System.out.println(index+"번 손님 주문하신 치킨 나왔습니다"); if(index == 20){ System.out.println("금일 재료가 모두 소진되었습니다"); break; } index++; }
-
해결됨카프카 완벽 가이드 - 커넥트(Connect) 편
질문있어요!
mySQL과 카프카 연결로 강의해주셨는데요아직 일부만 수강한 상태입니다.debezium이 차후에는 싱크 커넥터들을 데이터베이스 상관없이 지원할거같기도해서mySQL말고도 강의를 참고해서오라클 SQL, MSSQL에도 카프카를 연결하고 싶습니다.이때 접근방향이나 차이점등이 궁금한데 혹시 경험해보신적있다면 조언받고 싶습니다. 감사합니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-N 괄호라는 이름을 가진 문제가 많은데 몇번 문제인지 모르겠습니다.
2-N 몇번 문제인지 모르겠습니다.질문에도 없네요 ㅠㅠ
-
미해결WEB2 - Node.js
강의감사합니다.
강의감사합니다.
-
해결됨2.5D 일러스트를 통해 내가 상상하는 젭(ZEP) 메타버스 월드 만들어보기
맵 제작을 하면 출입이 되나요?
일러스트레이터로 아이소메트릭 공간을 만들어서 zep에 적용하면 출입이 자유자재로 되나요?
-
미해결블렌더 처음 시작부터 로우폴리 3D 애니메이션 까지
로우폴리 헬리콥터 3 강의에서 이해가 안되는 부분이 있습니다ㅠ
선생님, 바로 봐주실 지 모르겠지만 ㅠㅠ 로우폴리 헬리콥터 3 강의 33초 부근에서 i를 눌러 inset face를 해주실 때 왜 저는 아래와 같이 될까요?ㅠ 멀지를 해봐도 안되네여ㅠㅠㅠ첨부터 다시 해야하나요?
-
해결됨Do it! 알고리즘 코딩테스트 with Python
디버깅에 관한 질문
안녕하세요. 파이썬 및 코딩 테스트 공부를 시작한지 얼마 안 된 학생입니다.기존에는 주피터 노트북으로 코딩을 작성하며 백준 문제를 풀어보았는데, 강의에서 가르쳐주신 디버깅에 대해서는 배워본 적이 없습니다.이번 강의(숫자의 합 구하기 코딩)에서 디버깅을 하는 방법을 직접 해보시면서 설명해주셨는데, 해당 코딩을 어떤 프로그램으로 진행했는지, 그 프로그램을 사용하려면 어떻게 해야 하는지 궁금합니다.또한, 주피터 노트북에서 디버깅을 하기 위해선 어떤 방식으로 해야 하는지 아시는 분이 계신다면 알려주실 수 있을까요?자세한 강의 감사합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 여부 체크
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요!pdf7장에 1쪽에상품 관리 컨트롤러에서 로그인 여부를 체크하는 로직을 하나하나 작성하면 되겠지만, 등록, 수정, 삭제, 조회 등등 상품관리의 모든 컨트롤러 로직에 공통으로 로그인 여부를 확인해야 한다. 라고 하셨는데 로그인 여부 체크를 세션을 통해서 하면 되는걸까요?? 아니면 다른 방법이 있나요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
한 페이지에서 벗어나지지 않습니다 ㅠ
그대로 따라 했는데, 이 페이지에서 벗어나 지지 않습니다. 어떻게 해야 벗어나 질까요?;코드 하단에 있습니다.import 'package:flutter/material.dart';import 'package:geolocator/geolocator.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; class HomeScreen extends StatefulWidget { const HomeScreen({Key? key}) : super(key: key); @override State<HomeScreen> createState() => HomeScreenState(); } class HomeScreenState extends State<HomeScreen> {static final LatLng companyLatLng = LatLng( 37.4493182, 126.6601906, ); //위도 경도 지정하기 static final CameraPosition initialPosition = CameraPosition( target: companyLatLng, zoom: 15, ); static final Circle circle = Circle( circleId: CircleId('circle'), ); @override Widget build(BuildContext context) { return Scaffold( appBar: renderAppBar(), body: FutureBuilder( future: checkPermission(), builder: (BuildContext context, AsyncSnapshot snapshot){ if(snapshot.connectionState == ConnectionState.waiting){ return Center( child: CircularProgressIndicator(), ); } if(snapshot.data == '위치 권한이 허가되었습니다.'){ return Column( children: [ _CustomGoogleMap( initialPosition: initialPosition, ), _ChoolcheckButton(), ], ); } return Center( child: Text(snapshot.data), ); }, ),);} Future<String> checkPermission() async { final isLocationEnabled = await Geolocator.isLocationServiceEnabled(); if (!isLocationEnabled) { return '위치 서비스를 활성화 해주세요.';} LocationPermission checkPermission = await Geolocator.checkPermission();if (checkPermission == LocationPermission.denied) { checkPermission = await Geolocator.requestPermission(); if (checkPermission == LocationPermission.denied) { return '위치 권한을 허가해주세요.'; } } if (checkPermission == LocationPermission.deniedForever) { return '앱의 위치 권한을 세팅에서 허가해주세요.'; } return '앱의 위치 권한이 허가되었습니다.';} AppBar renderAppBar() { return AppBar(title: Center( child: Text( '오늘도 출근', style: TextStyle( color: Colors.blue,fontWeight: FontWeight.w700, ),),),backgroundColor: Colors.white, ); }} class _CustomGoogleMap extends StatelessWidget { final CameraPosition initialPosition; const _CustomGoogleMap({required this.initialPosition, Key? key }) : super(key: key); @override Widget build(BuildContext context) { return Expanded( flex: 2, child: GoogleMap( mapType: MapType.normal, initialCameraPosition: initialPosition, myLocationEnabled: true, myLocationButtonEnabled: false, ), ); } } class ChoolcheckButton extends StatelessWidget { const ChoolcheckButton({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Expanded( child: Text( '출근', ), );}}