묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
request 빈 주입 시점질문입니다.
이미 logDemo() 메소드가 실행되는 시점에 request 스코프가 주입되는 것이 아닌 것인지 궁금합니다.request : 웹 요청이 들어오고 나갈 때 까지 유지되는 스코프프록시 모드를 테스트할 때 위와 같이 myLogger를 조회합니다.허나 이 때는 이미 request를 통해 http요청을 받았을 때입니다.제 생각에는 http 요청을 받았으니 이미 프록시 객체가 request 빈 스코프로 대체가 되어야한다고 생각이 드는데 출력에서 프록시 객체가 출력이 됩니다.이미 logDemo() 메소드가 실행되는 시점에 request 스코프가 주입되는 것이 아닌 것인지 궁금합니다.
-
해결됨AWS Certified Solutions Architect - Associate 자격증 준비하기
실전 문제 1-22번 질문
실전 문제 1-22번에서 최대 성능을 위한 것은 Amazon EC2 인스턴스 스토어가 아니라 Amazon EBS(io2) 볼륨 가 아닌가요? Amazon EBS보다 Amazon EC2가 적합한지 이해가 잘 안됩니다. 추가 설명 부탁드려도 될까요..?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 리뷰 부탁드립니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. function solution(str) { let answer = []; for(let i of str) { if(i != ')') answer.push(i); else { while(answer[answer.length - 1] != '(') { answer.pop(); } answer.pop(); } } return answer.join(''); } let str = "(A(BC)D)EF(G(H)(IJ)K)LM(N)"; console.log(solution(str));해당 코드도 괜찮은 코드인가요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 빈이란 것은
스프링빈 파트 부분을 듣다 보니처음에는 진짜 뭔소린지 하나도 모르겠고스프링스프릴ㅇㅇ스프링빈 컨테이너 막 혼동이 와서 정신줄 잡고 듣고있는데그러면 결국 스프링 빈은 객체 인가요?
-
미해결스프링부트 시큐리티 & JWT 강의
JWT + Oauth2 붙이기
안녕하세요. 강사님! 수업 정말 잘 들었습니다! 비전공자로써 3개월째인데 JWT 강의 중에 정말 이해가 잘 되었습니다!!! 진심으로 감사합니다~~다름이 아니라 더 나아가서, JWT와 Oauth2를 붙이려고 하는데 JWT 강의 초반에 기존의 Oauth2 방식을 사용하지 않고 다른 방식을 써야 된다고 하셔서 질문합니다.어떤 부분이 달라져야할지 전혀 감이 안 오는데, 제가 조금 참고할만한 자료가 있을까요? 혹시 JWT+Oauth를 붙이려고 할 때 코드가 많이 변경될까요?(혹시 강의 제작하실 생각 없으신가요...ㅎㅎ)
-
미해결Flutter 초입문 왕초보편
minSdkVersion에러(해결함)
094. sensor_plus 로 가속도 센서 값 얻기해당 영상 보면서 공부를 하다가 이런 에러를 발견 했습니다.android > app > build.gradle 들어가서 defaultConfig파트 찾으셔서 minSdkVersion을 21로 올리면 해결됩니다.
-
해결됨따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
false 나오시는분 이렇게 해보세요.
user.save((err, userInfo) => { if (err) return res.json({ success: false, err }) return res.status(200).json({ success: true }) }) 위 코드를 아래와 같이 바꾸니 잘되네요~ user.save() .then((userInfo) => res.status(200).json({ success: true })) .catch((err) => res.json({ success: false, err }));
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
로그인한 user의 비밀번호를 변경하는 API updateUserPwd 로직
quiz19 -2 에서토큰기반인증(로그인)된 유저의 비밀번호 변경 로직을 구현하고 있는데요..resolver와 service의 연결부분에서 에러가 발생하는데 혼자서 해결이 어려워 문의드립니다.제가 생각한 updateUserPwd의 로직은유저가 있는지의 여부 확인비밀번호의 일치 여부 확인bcrypt로 변경하고자하는 비밀번호의 암호화암호화된 변경비밀번호를 해당하는 email의 DB에 저장이렇게 하면 끝나는 로직이라고 생각하고 소스코드를 작성했습니다. 1차적으로 제가 생각한 로직에 빠진 부분이 있는지 궁금하고 지금의 소스코드로 어떤부분을 보완해야하는지 궁금합니다.(현재 코드블록으로 공유한 내용은 users.service.ts에서 return부분에 where에서 에러가 발생하는 상황입니다..) 추가로 필요한 정보나 내용, 소스코드가 있으면 추가적으로 공유하도록 하겠습니다. 도와주세요~~~나머지 import해온 class들은 수업을 통해서 그대로 가져온 내용들입니다.//users.resolver.ts @UseGuards(gqlAuthAccessToken) @Mutation(() => String) updateUserPwd( @Args('email') email: string, @Args('password') password: string, ): string { this.usersService.updateUserPwd({ email, password }); return '비밀번호 수정 성공'; }//users.service.ts async updateUserPwd({ email, password, }: IUserServiceUpdateUserPwd): Promise<UpdateResult> { const user = await this.findOneByEmail({ email }); if (!user) throw new UnprocessableEntityException('등록되지 않은 이메일 입니다.'); const isAuth = await bcrypt.compare(password, user.password); if (!isAuth) throw new UnprocessableEntityException('틀린 암호입니다.'); const hashedPassword = await bcrypt.hash( password, Number(process.env.SALT), ); return this.UsersRepository.update( { password: hashedPassword }, { where: { email: user.email }, }, ); }
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
모의문제 - 작업형2
모의문제를 여러 모델로 학습해보려고 하는데 코랩환경에서는 워닝이 없이 잘 실행되는데 시험 환경에서 위와 같은 오류가 발생하여 질문드립니다.
-
미해결자바 코딩테스트 - it 대기업 유제
공 굴리기 코드 질문드립니다.
클래스 사용해서 작성했는데, 계속 무한 반복을 도는 것 같습니다. 어디가 잘못된건지 잘 모르겠습니다. import java.util.*; class Node implements Comparable<Node>{ int x; int y; int c; Node(int x,int y, int c){ this.x=x; this.y=y; this.c=c; } @Override public int compareTo(Node o) { return this.c - o.c; } } class Main { public static int n,m; public static int INF = (int)1e9; public static boolean[][] visit; public static int[] dx = {0,0,1,-1}; public static int[][] map,dist; public static int[] dy = {1,-1,0,0}; public static int dij(int s1,int s2,int e1, int e2) { PriorityQueue<Node> q =new PriorityQueue<>(); q.offer(new Node(s1,s2,0)); dist[s1][s2] = 0; while(!q.isEmpty()) { Node tmp = q.poll(); int nowx = tmp.x; int nowy = tmp.y; int nowcnt = tmp.c; if(nowcnt>dist[nowx][nowy]) continue; for(int i=0; i<4; i++) { int nx = nowx+dx[i]; int ny = nowy+dy[i]; while(nx>=0 && ny>=0 && nx<n && ny<m && map[nx][ny]==0) { //맵의 범위안을 만족하면 계속 같은 방향으로 이동 nx+=dx[i]; ny+=dy[i]; nowcnt++; } //벽에 막혔다. nx-=dx[i]; //이전 칸으로 이동 ny-=dy[i]; nowcnt--; //이전 칸으로 이동했으니까 갯수 하나 감소 if(dist[nx][ny]>nowcnt) { //우선순위 큐에 넣기 dist[nx][ny] = nowcnt; q.offer(new Node(nx,ny,dist[nx][ny])); } } } //답 출력 if(dist[e1-1][e2-1]==Integer.MAX_VALUE) return -1; return dist[e1-1][e2-1]; } public int solution(int[][] board, int[] s, int[] e){ int answer = 0; n=board.length; m=board[0].length; dist = new int[n][m]; for(int i=0; i<n; i++) Arrays.fill(dist[i], INF); map = new int[n][m]; for(int i=0; i<n; i++) { for(int j=0; j<m;j++) { map[i][j] = board[i][j]; } } answer = dij(s[0],s[1],e[0],e[1]); return answer; } public static void main(String[] args){ Main T = new Main(); System.out.println(T.solution(new int[][]{{0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0}, {1, 0, 1, 1, 1, 0}, {1, 0, 0, 0, 0, 0}}, new int[]{1, 0}, new int[]{4, 5})); System.out.println(T.solution(new int[][]{{0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0}, {1, 0, 1, 1, 1, 0}, {1, 0, 0, 0, 0, 0}}, new int[]{0, 0}, new int[]{4, 2})); System.out.println(T.solution(new int[][]{{1, 0, 1, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 0}, {1, 1, 0, 1, 1}, {0, 0, 0, 0, 0}}, new int[]{0, 3}, new int[]{4, 2})); System.out.println(T.solution(new int[][]{{0, 1, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0}, {0, 1, 1, 0, 1, 1}, {0, 0, 0, 0, 0, 0}}, new int[]{0, 0}, new int[]{4, 5})); System.out.println(T.solution(new int[][]{{0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0}}, new int[]{0, 0}, new int[]{4, 3})); } }
-
미해결애플 웹사이트 인터랙션 클론!
translateY대신 애플에서 사용한 것 처럼 matrix로 scale의 크기를 주려고 하는데
안녕하세요!! 강의를 전부 듣고 코드를 뜯어보며 복습중에 있습니다. section-0에서 사용한 것을 이용해 스크롤 될 때 matrix로 Text에 scale(80)정도로 주려고 코드를 입력해보니 적용은 되었으나 스크롤을 빠르게 올릴시에 정상적으로 사이즈가 줄어들지 않고 줄어들다 말거나 그러더라구요...ㅠㅠ 폰트 픽셀도 많이 깨지는 현상이 발생하구요. 혹시 해결하려면 어떤식으로 접근해야 할까요? 해당 코드 첨부드립니다. const sectionInfo = [ { // section-0 type: "sticky", heightNum: 5, scrollHeight: 0, objs: { container: document.querySelector("#scroll-section-0"), messageA: document.querySelector("#scroll-section-0 .main-message.a"), messageB: document.querySelector("#scroll-section-0 .main-message.b"), messageC: document.querySelector("#scroll-section-0 .main-message.c"), messageD: document.querySelector("#scroll-section-0 .main-message.d"), }, values: { messageA_opacity_in: [0.4, 1, { start: 0, end: 0.05 }], messageA_opacity_out: [1, 0, { start: 0.15, end: 0.2 }], messageA_scale_in: [1, 80, { start: 0.05, end: 0.25 }], messageA_scale_out: [80, 1, { start: 0.25, end: 0.05 }], messageB_opacity_in: [0, 1, { start: 0.2, end: 0.25 }], messageB_opacity_out: [1, 0, { start: 0.35, end: 0.4 }], messageB_translateY_in: [50, 0, { start: 0.2, end: 0.25 }], messageB_translateY_out: [0, -50, { start: 0.35, end: 0.4 }], messageC_opacity_in: [0, 1, { start: 0.4, end: 0.45 }], messageC_opacity_out: [1, 0, { start: 0.55, end: 0.6 }], messageC_translateY_in: [50, 0, { start: 0.4, end: 0.45 }], messageC_translateY_out: [0, -50, { start: 0.55, end: 0.6 }], messageD_opacity_in: [0, 1, { start: 0.6, end: 0.65 }], messageD_opacity_out: [1, 0, { start: 0.75, end: 0.8 }], messageD_translateY_in: [50, 0, { start: 0.6, end: 0.65 }], messageD_translateY_out: [0, -50, { start: 0.75, end: 0.8 }], }, }, ]; function calcValues(values, currentScrollY) { let returnValue; const currentSectionHeight = sectionInfo[currentSection].scrollHeight; // 현재 스크롤 섹션에서 스크롤 된 범위를 비율로 구하는 식 const scrollRatio = currentScrollY / currentSectionHeight; if (values.length === 3) { const scrollAniStart = values[2].start * currentSectionHeight; const scrollAniEnd = values[2].end * currentSectionHeight; const scrollAniHeight = scrollAniEnd - scrollAniStart; if (currentScrollY >= scrollAniStart && currentScrollY <= scrollAniEnd) { returnValue = ((currentScrollY - scrollAniStart) / scrollAniHeight) * (values[1] - values[0]) + values[0]; } else if (currentScrollY < scrollAniStart) { returnValue = values[0]; } else if (currentScrollY > scrollAniEnd) { returnValue = values[1]; } } else { returnValue = scrollRatio * (values[1] - values[0]) + values[0]; } return returnValue; } function playAnimation() { const objs = sectionInfo[currentSection].objs; const values = sectionInfo[currentSection].values; const currentScrollY = scrollY - prevScrollHeight; const currentSectionHeight = sectionInfo[currentSection].scrollHeight; const scrollRatio = currentScrollY / currentSectionHeight; switch (currentSection) { case 0: // message if (scrollRatio <= 0.05) { objs.messageA.style.opacity = calcValues( values.messageA_opacity_in, currentScrollY ); } else { objs.messageA.style.opacity = calcValues( values.messageA_opacity_out, currentScrollY ); objs.messageA.style.transform = `matrix(${calcValues( values.messageA_scale_in, currentScrollY )}, 0, 0, ${calcValues( values.messageA_scale_in, currentScrollY )}, 0, 0)`; }
-
미해결
BindingResult 패러미터 위치 @ModelAttribute Item item 다음에 와야 하는 이유
이 이유가 뭔가요?@PostMapping("/add")public String addItemV1(@ModelAttribute Item item, RedirectAttributes redirectAttributes, BindingResult bindingResult) {이렇게 해도 잘 돌아가네요
-
미해결수학으로부터 인류를 자유롭게 하라(기초대수학편)
수강 기간 관련 문의입니다.
안녕하세요 지식 공유자님수강평이 워낙 좋아 언제고 수학에 대한 기본기를 다시 상기시키고자 강의를 구매하고 아직 수강하지 않은 상태입니다. 수강 기간이 정해져있다는건 알고 구매하였지만, 여느 강의 사이트와 같이 강의를 수강한 시점부터 강의 기간이 측정될거라 여겨 덮어놓고 지냈지만 인프런은 강의를 구매한 시점부터 수강 기간이 확정되는 시스템이네요 ..강의를 시청하지 않은 시점이라 인프런 고객센터를 통해 해당 부분 건의를 했지만 구매 후 일주일이 넘어 조치가 어렵다는 답변을 받았습니다. 이 부분 공유자님께 건의할 내용이 아니라 생각되지만 제 입장에선 다른 방법이 없네요😂 괜찮으시다면 수강 기간을 좀 더 길게 변경해주셨으면합니다.
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
param과 queryString차이
파라미터로 id나 URL 등 값 받아올 때와 쿼리스트링으로 받아올 때 파라미터로도 perPage나 page 등 받아올 수 있는데 어떤 차이로 파라미터와 쿼리스트링을 나누어서 사용해야 할지 질문드립니다.단순히 파라미터는 http 요청시 한 번 정해지면 고정되는 값에 사용하고 쿼리스트링은 매 요청마다 변하는 값에 사용한다고 생각이 드는데 맞을까요??
-
해결됨실전! 스프링 데이터 JPA
dto와 영속성 관리
안녕하세요 스프링 부트 시리즈를 거의 다 들었는데요,엔티티를 영속성 컨텍스트에서 관리하면 1차 캐시가 생겨서 2번째 조회할 때는 db가 아니라 영속성 컨텍스트에서 가져온다고 알고있는데요그래서 공부하면서 스프링 데이터 jpa랑 querydsl로 회원 조회, 수정, 삭제 등 공부하면서 api 호출로 값을 받을 때 dto를 통해서 받는 로직을 짜고 테스트를 했습니다.member1을 읽은 뒤에 db에서 강제로 이름을 member2로 바꾸고 다시 호출했는데 member2로 잘 읽어 오더라고요 member1을 읽어와서 영속성 컨텍스트에 이미 올라있는 정보를 바로 가져올 줄 알았는데 제 예상이 틀렸습니다.이게 엔티티를 직접 조회한게 아니라 dto를 통해 조회해서 그런건가요? 아니면 혹시 제가 뭘 잘못알고 있는 걸까요?
-
미해결네트워크, 그림으로 이해하자(2022ver.)
라우터 ip 부여 (라우터 강의)
자료 5pg를 보면 첫번째 라우터는 192.168.10.254와 192.168.20.1로 부여 했습니다. 또 두번째 라우터는 부여된 ip가 192.168.20.254와 192.168.30.254로 부여되어 있는데...ip 라우터는 해당 범위 내의 장치(컴퓨터등...)에 지정된 ip를 제외한 아무 ip나 부여해도 되는건가요? 예를들어 첫번째 라우터가 네트워크 1에 해당하는 192.168.10.233도 ip 부여가 가능한가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2데이터 베이스에 데어터가 들어오지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.java 17에 스프링 부트는 3.1.0 버전을 사용중이고h2 데이터 베이스는 최신 버전을 다운 받았습니다.스프링부트 3.0버전 이상은 h2 2.1.214버전 이상 사용하는게 맞나요?
-
해결됨Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
UpdateView - 포스트 수정 페이지 만들기 에서 질문이 있습니다.
26:27초 쯤에 tests.py의 test_update_post() 함수에서 카테고리의 pk를 적어줘야하는지 이해가 잘 되지 않습니다.앞서 setUp() 함수에서 post_001과 post_002를 생성할 때는 category를 입력할 때 pk는 사용하지 않고 진행했습니다.하지만 왜 포스트 수정을 핱때는 category를 입력할 때 pk를 사용해야 하는지 잘 모르겠습니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
g.dart 파일
visual studio에서는 숨기는방법 없나여?
-
해결됨디지털포렌식 입문자를 위한 디지털포렌식 전문가 2급 실기 시험대비 강의(Encase/Autopsy)
파티션 복구 질문입니다.
Unrecognized File System 일 경우HxD로 파일 백업본 찾아 복구하는 방법 이외에Encase로 복구할 수 있는 방법은 없나요?