묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
refreshToken cookie에 저장할때에 템플릿 리터럴 사용하는 부분에서의 질문
//auth.service.ts import { Injectable, UnprocessableEntityException } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import * as bcrypt from 'bcrypt'; import { JwtService } from '@nestjs/jwt'; import { IAuthServiceGetAccessToken, IAuthServiceLogin, IAuthServiceSetRefreshToken, } from './interfaces/auth-service.interface'; @Injectable() export class AuthService { constructor( private readonly userService: UsersService, // private readonly jwtService: JwtService, ) {} async login({ email, password, context }: IAuthServiceLogin) { // 1. 이메일이 일치하는 유저를 DB에서 찾기 const user = await this.userService.findOneByEmail({ email }); // 2. 일치하는 유저가 없으면?! 에러 던지기!!! if (!user) throw new UnprocessableEntityException('존재하지 않는 이메일입니다.'); // 3. 일치하는 유저가 있지만, 비밀번호가 틀렸다면?! const isAuth = await bcrypt.compare(password, user.password); if (!isAuth) throw new UnprocessableEntityException('틀린 암호입니다.'); // 4. refreshToken(=JWT)을 만들어서 브라우저 쿠키에 저장해서 보내주기 this.setRefreshToken({ user, context }); // 5. 일치하는 유저도 있고, 비밀번호도 맞았다면?! // => accessToken(=JWT)을 만들어서 브라우저에 전달하기 return this.getAccessToken({ user }); } getAccessToken({ user }: IAuthServiceGetAccessToken): string { return this.jwtService.sign( { sub: user.id }, { secret: process.env.JWT_SECRET_KEY, expiresIn: process.env.JWT_ACCESS_TOKEN_EXPIRE, }, ); } setRefreshToken({ user, context }: IAuthServiceSetRefreshToken): void { const refreshToken = this.jwtService.sign( { sub: user.id }, { secret: process.env.JWT_REFRESH_SECRET_KEY, expiresIn: process.env.JWT_REFRESH_TOKEN_EXPIRE, }, ); //개발환경 context.res.setHeader( 'set-Cookie', `refreshToken=${refreshToken}; path=/;`, ); // 배포환경 // context.res.setHeader('set-Cookie', `refreshToken=${refreshToken}; path=/; domain=.mybacksite.com; SameSite=None; Secure; httpOnly`); // context.res.setHeader('Access-Control-Allow-Origin', 'https://myfrontsite.com'); } } 리프레쉬 토큰을 생성하는 과정에서 개발환경에 사용하는context.res.setHeader( 'set-Cookie', `refreshToken=${refreshToken}; path=/;`, );이 코드에 'refreshToken'의 이름을 <한글>로 사용하게되면 graphql로 API테스트를 할때 read에 대한 에러를 발생시키더라구요.쿠키의 이름을 바꿔서 생성하려고 했는데 한글로 생성이 되지 않는거는 nodejs의 기본 특성인걸까요!?참고이미지로 아래에 이미지를 붙여봅니다~궁금해요~~~ 이런내용들은 nodejs 공식문서에서 제가 잘 못찾는건지 궁금합니다. 공식문서에도 있을것 같아서 찾아보려고했는데 잘 못찾겠더라구요ㅠㅜ..
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
삭제예정콘텐츠 강의
'(삭제 예정 콘텐츠) 회귀모형'라는 강의가 있는데 빅데이터분석기사 실기 시험에 필요한 내용일까요? 수강해야 되는지 몰라서 질문드립니다.
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
Code Base로 따로 구현해봤는데 막히는 부분이 있어서 질문드려요
안녕하세요! 앨런님, 강의 정말 잘 듣고 있습니다. 좋은 강의 만들어주셔서 감사합니다.다름이 아니라 ToDo 앱 강의를 참고해서 제 방식대로 스토리보드 사용하지 않고 코드로 앱을 만들어보고 있는데요. 막히는 부분이 있어서 질문드립니다!하단에 있는 4개의 Button들을 동그랗게 하고 싶어서 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() colorButtons.forEach { button in button.clipsToBounds = true button.layer.cornerRadius = button.frame.width / 2 } } 이렇게 구현했지만 전혀 바뀌는게 없어서 button.frame.width 를 print해봤는데 0.0이 나오네요...이건 왜그러는걸까요?참고로 말씀드리면 4개의 버튼은 모두 UIStackView의 subView입니다!혹시나 스택뷰의 서브뷰라 그런것인가 해서 구글링을 해봤습니다!print(stackView.arrangedSubviews[0].frame) print(stackView.arrangedSubviews[1].frame)근데 이렇게 해봐도 똑같이 0.0이 나오더라구요,,, ㅠㅠㅠ 도저히 이해가 안돼서 질문드립니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
프로젝트 생성 오류
4강에서 프로젝트 생성 따라하는 와중에 오류가 발생합니다.프로젝트 설정 버전은 아래와 같습니다.아래는 설치 버전 확인 그림입니다.프로젝트 설정에서 안드로이드 플로그인도 여러차례 바꾸었지만 동일한 오류가 생성됩ㄴ다.. 조치 방법 부탁드립니다..
-
해결됨처음하는 플러터(Flutter) 기초부터 실전까지 [풀스택 Part4] (쉽고 견고하게 단계별로 다양한 프로젝트까지)
파라미터 질문있습니다~
Q1. Dart 언어에서 Optional parameters에도 Name을 붙여 파라미터 값 대입 시 순서를 다르게 할 수 있나요?void function1(int a, [int b]) {..} // b에 이름을 붙여 function1을 호출할 수 있는가 Q2. 하나의 함수에 Optional parameters, Named parameters 둘 다 쓴다고 하면, 작성 순서는 어떻게 되나요?void function2(int a, {int? b}, [int c]) {..} // 둘을 같이 쓸 일이 있는지는 모르겠지만 궁금합니다
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
9장 추가 과제 관련 질문
안녕하세요. 9장강의를 듣고 추가 과제를 시도해보던 중 궁금증이 생겨 질문드립니다.스스로 해보기 -> 팔로잉 끊기에서 destory와 라우터를 사용하라고 안내해주셨는데 user자체를 삭제하는 것이 아닌 중간테이블(follow)에서 해당 로우만 삭제하는 방법이 따로 있나요? if (user) { const a = await user.destroy({ where: { Followings: { followerId: req.params.id } }, });위와 같이 방법을 여러가지로 시도해보았지만 계속해서 유저 삭제(탈퇴)가 되는 상황이라 도움주시면 감사하겠습니다..!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-p14502 질문입니다
안녕하세요 선생님벽을 3개를 세우라고 해서 조합을 먼저 떠올렸고 영역을 구해야 한다는 부분에서 dfs를 떠올렸습니다그래서 조합과 dfs를 사용해 벽을 3개 세울때마다 dfs 및 visited배열을 매번 초기화 해주고 2차원 배열 arr을 돌면서 2(바이러스)가 나올때마다 동서남북으로 0또는 2인 곳으로 탐색해가며 영역의 크기를 구하게 해주었습니다. 예제는 분명히 다 맞는데 틀리는 이유가 뭘까요? 0또는 2로 한게 잘못된 걸까요?http://boj.kr/5d0f072fce1a471fb02deec85b4d906d
-
미해결
수강확인증 초기화
수강확인증 목록 전부 초기화 가능하나요?
-
해결됨웹 애니메이션을 위한 GSAP 가이드 Part.01
autoAlpha를 사용한다고 해도 성능상의 이점은 없는거 아닌가요?
Q. FOUC에 대한 보완으로 autoAlpha를 사용하면 효율적인 이유가 뭘까요? FOUC 강의에서 authAlpha를 사용함으로써 GSAP가 효율적으로 visibility를 visible로 바꿀 수 있다 라고 말씀하셨습니다. 그런데 생각해보니 GSAP 객체도 해당 Element의 style에 접근해서 attribute 값을 바꾸는게 아닌가? 하는 생각이 들어서 질문드려봅니다.이렇게 되면 사실 문법적인 설탕(syntatic sugar) 같은게 아닌가요? 🤔
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
postman에 /login으로 send 시 무한 로딩 에러
postman에서는 이런 오류가 뜨구요..위에는 index.js 파일이고User.js 파일입니다!몇일을 열심히 구글링해봐도 답을 찾을 수가 없네요,, register은 잘 작동합니다. 어떤 문제가 있는지 부탁드려요,,,
-
해결됨비전공자를 위한 진짜 입문 올인원 개발 부트캠프
로그 이미지 주소 중 절대 경로 원리에 관한 질문
본 강의 중 로그가 나오지 않는 이슈에 관하여경로 설정에 문제가 있다고 하셨고, grab_market_web/src/App.js의 내용 중 로그 src의 경로를"./imgages/icons/log.png"에서 -> "/imgages/icons/log.png"으로 변경하라고 하였습니다. 작동은 잘 되는데, 작동 원리가 궁금합니다./ 절대값 root경로의 시작은 어디로 설정되어 있나요?이전에는 메인 화면에서는 ./ 상대 경로 중, 현재 경로로 설정되어 있었는데 잘 작동했던 이유도 궁금합니다.App.js파일의 내용이니까 App.js가 존재하는 grab_market_web/src 디렉토리가 현재 경로라고 이해되는데,그보다 상위 디렉토리에 존재하는 grab_market_web/public이 ./ 현재 경로로 인식되어grab_market_web/public/images가 호출 되는 것도 이해가 잘 되지 않으며/ 절대 경로로 설정시에도grab_market_web/public/images가 호출되는 것이 잘 이해가 되지 않습니다.
-
미해결실전! Querydsl
p6spy 쿼리 파라미터 노출 안됨
안녕하세요!이번에 spring boot 3.1.0 version 으로 p6spy 라이브러리 설정 후 테스트 코드 실행을 하는데 쿼리 파라미터 값이 확인되지 않습니다.Hibernate: insert into hello values ( ) 2023-06-20T14:55:04.965+09:00 INFO 28956 --- [ main] p6spy : #1687240504965 | took 5ms | statement | connection 1| url jdbc:mysql://20.249.79.13:3306/patron_dev?characterEncoding=UTF-8 insert into hello values ( ) insert into hello values ( ); Hibernate: select h1_0.id from hello h1_0 2023-06-20T14:55:05.596+09:00 INFO 28956 --- [ main] p6spy : #1687240505596 | took 7ms | statement | connection 1| url jdbc:mysql://20.249.79.13:3306/patron_dev?characterEncoding=UTF-8 select h1_0.id from hello h1_0 select h1_0.id from hello h1_0; 2023-06-20T14:55:05.717+09:00 INFO 28956 --- [ main] p6spy : #1687240505717 | took 9ms | rollback | connection 1| url jdbc:mysql://20.249.79.13:3306/patron_dev?characterEncoding=UTF-8 ; 2023-06-20T14:55:05.759+09:00 INFO 28956 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2023-06-20T14:55:05.763+09:00 INFO 28956 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-06-20T14:55:05.849+09:00 INFO 28956 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Process finished with exit code 0 위 로그 화면에서 보는 것처럼 rollback 이 되기전 insert 문이 실행될 때 값이 비어 있는 상태로 전달되고 있습니다이유를 모르겠습니다 ㅠㅠ
-
미해결실전! Querydsl
JPQL 실행직전 flush외에 clear도 함께 해주는것인지
자바 ORM 표준 JPA프로그램 듣고 넘어왔습니다.이전 기본강의에서는 JPQL이 flush를 먼저 수행이 된후 JPQL쿼리가 동작한다고 배웠는데요.이게 EntityManager의 일반적인 find() 메소드의 경우clear()을 한 뒤 준영속상태에서 비로서 select쿼리가 나가는것으로 알고있습니다. (그렇지 않으면 1차 캐시에서 조회)근데 JPQL의 경우 flush는 자동으로 호출 되지만 clear 즉, 1차캐시와 연관성이 있느냐 없느냐에 대해서 궁금증이 생겼습니다.clear를 직접 해주지 않았음에도 불구하고 쿼리가 나가는 이유에 대해서 clear를 자동으로 해줘서 쿼리가 나가게 된것인지? 혹은 1차 캐시와 상관없이 자연쿼리가 나가게 되는것인지 한번 더 다잡고 가고싶습니다.답변 감사히 기다리겠습니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
redux toolkit에서는 redux thunk가 들어있는건가요?
import { configureStore } from "@reduxjs/toolkit"; import { createWrapper } from "next-redux-wrapper"; import reducer from "../reducers"; function getServerState() { return typeof document !== "undefined" ? JSON.parse(document.querySelector("#__NEXT_DATA__").textContent)?.props .pageProps.initialState : undefined; } const serverState = getServerState(); console.log("serverState", serverState); const makeStore = () => { configureStore({ reducer, devTools: true, middleware: (getDefaultMiddleware) => getDefaultMiddleware(), preloadedState: serverState, // SSR }); }; export default createWrapper(makeStore); https://redux-toolkit.js.org/api/getDefaultMiddleware이걸 읽어보니configureStore에서 middleware의getDefaultMiddleware()에 redux thunk가 이미 추가가 되어있는거 같은데 맞나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 호출 관련 질문
안녕하세요 강사님좋은 강의 감사드립니다.참여했던 실무 프로젝트에서 @Transactional 을 잘 이해하지 못한 채 사용했던 적이 있습니다.특정 서비스의 한 메소드에서 @Transactional을 선언하고 해당 메소드가 여러 작업을 하기 때문에 다른 메소드를 호출하는 방식이었습니다.이때 저는 트랜잭션의 특징을 잘 몰라서 두 메소드에 다 @Transactional을 선언했었습니다.예시)@Transactionalpublic void ex1() {...// 로직 수행 후 다른 메소드 호출ex2();}@Transactionalpublic void ex2() {// 로직 수행}테스트를 하는데 로직 수행중 ex1에서 에러가 나든 ex2에서 에러가 나든 트랜잭션 롤백이 안됐었는데 이런 케이스는 무엇이 원인인지 알려주실 수 있나요?강의에서처럼 ex1이 아예 @Transactional이 선언되어 있지 않았다면 롤백이 안되는게 맞다고 생각이 드는데 저는 두 메소드 다 선언했었거든요,,확인해주시고 답변 주시면 정말 감사드리겠습니다ㅠ(혹시나 해서 강의 코드의 externalCall 메소드에 트랜잭션 선언해보고 테스트 돌려봤는데 트랜잭션 적용 되더라고요)+추가 질문으로 이런 경우에는 ex1 메소드에만 @Transactional을 선언하면 될까요?
-
미해결홍정모의 따라하며 배우는 C++
복사 생성자 부분에서 질문이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 9.11, 11분 21초 입니다.교수님께서 복사 생성자를 MyString(const MyString &src) { cout << "Copy constructor" << endl; m_length = src.m_length; m_data = new char[m_length]; if (src.m_data != nullptr){ for (int i = 0; i < m_length; i++) m_data[i] = src.m_data[i]; } else m_data = nullptr; } 이렇게 정의 하셨는데 해당 코드에서는 m_data의 제일 끝에 널 문자를 두지 않습니다. 제가알기로 문자열의 끝부분에는 널문자를 둔다고 기억하는데 왜 이렇게 해도 되는지 궁금합니다!
-
해결됨실전! Querydsl
sequence id값이 공유(?)되는 현상에 대한 질문
@GeneratedValue에 의해 Sequence가 호출되어서 순차값이 id에 부여되어 저장되는것으로 알고있습니다.근데, team의 id와 member의 id의 sequence가 마치 공유가 되는듯이 team의 id가 1, 2 그리고 member의 id가 3, 4, 5, 6 으로 저장이 되는 부분에 대해서@Column으로 각각의 id 이름을 다르게 부여했다고 하더라도 @GeneratedValue 어노테이션은 엔티티에 정의한 필드명에 맞춰서 생성이 되어서 그런것인지 궁금합니다.또한, 만약 위 원리가 맞다면 실무에서는 이런 부분에 대해서 각각을 명확하게 구분지어서 해야할거같다 라는 생각이 들었으며,그렇다면 실무에서는 애초에 @Column에 의한 DB 컬럼명 변경이 아닌 엔티티 자체의 필드명에서 부터 다르게 지정해 줘야 하는것이 아닐까 하는 생각을 해봤습니다.이 부분에 대해 바람직하게 생각한것이 맞을까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
이 강의에서 타입스크립트를 사용하지 않은 이유가 있나요??
요즘은 타입스크립트가 대세라는 소리를 어디서 들은 것 같아서 질문드립니다.왜 타입스크립트를 안썼냐고 따지는 것은 절때 아니고...단순히 자바스크립트를 사용했는데 어떠한 의도를 갖고 했는지가 궁금합니다.작성하기가 쉬울 수도 있고, 코드의 길이가 짧을 수도 있고, 기존에 만들어진게 자바스크립트일 수도 있다는 생각이 들긴 하지만 직접 물어보는게 더 좋을꺼같아서 질문드립니다.
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
7강 1940 런타임 에러
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tk = new StringTokenizer(br.readLine()); int N = Integer.parseInt(tk.nextToken()); int M = Integer.parseInt(tk.nextToken()); int[] nums = new int[N + 1]; for (int i = 1; i < N + 1; i++) nums[i] = Integer.parseInt(tk.nextToken()); Arrays.sort(nums); int start = 1, end = N, answer = 0; while (start != end) { int sum = nums[start] + nums[end]; if (sum < M) start++; else if (sum > M) end--; else { answer++; start++; end--; } if (start > end) break; } System.out.println(answer); } }안녕하세요 ~항상 좋은 강의를 만드시기 위해 노력해주셔서 감사합니다!강사님의 강의를 참고해 위 코드로 재출을 했는데 인텔리제이에서는 정상적으로 실행되지만,백준에 재출했을 때 런타임 오류가 발생하는 이유를 모르겠어서 질문드립니다 ㅠㅠ오류 코드는 아래와 같습니다.Error: Main method not found in class Main, please define the main method as: public static void main(String[] args)제대로 main 객체와 메서드가 있는데 왜 인식을 못하는지 모르겠네요 ㅠㅠ감사합니다 :)
-
미해결타입스크립트 입문 - 기초부터 실전까지
에러 ㅠㅠ
똑같이 따라 해봤다고 생각했는데 다시 켜보니..이런 일이 벌어졋습니다 ㅠㅠ 뭐가 문제인지 알고싶습니다 ㅠㅠ