묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결직장인 생존 엑셀 - 8개의 실무 프로젝트로 엑셀 마스터하기
기능 범위 지정 시 헷깔리는분
임의데이터 선택ctrl+A 전체선택머릿글포함 선택머릿글빼고선택 케이스마다 다른데 쉽게 외우는법이나 기준이있나요?
-
미해결직장인 생존 엑셀 - 8개의 실무 프로젝트로 엑셀 마스터하기
9강 양수 음수혼합차트
폭포차트로 구현이가능한가요?
-
미해결[VLM101] 파인튜닝으로 멀티모달 챗봇 만들기 (feat.MCP)
좋은 강의 감사합니다. 궁금한게 있어 질의 드립니다.
# 모델을 로드하는 코드 model_id = "/work/checkpoints/hf/Qwen2.5-VL-3B-Instruct" # 사용할 모델 경로 지정 model_org = Qwen2_5_VLForConditionalGeneration.from_pretrained( model_id, # 모델 경로로부터 모델 불러오기 device_map="auto", # 자동으로 장치 설정 (예: GPU 사용) torch_dtype=torch.bfloat16, # 모델의 데이터 타입을 bfloat16으로 설정 (메모리 최적화) ) processor = AutoProcessor.from_pretrained(model_id) # 모델에 맞는 processor 불러오기 ==> 질문 사항 (2개) 질문1) 위 코드에 동일한 모델을 model_org 와 processor 로 정의한 거 같은데 왜 이렇게 정의한 이유는 무엇인가요? 질문2) datacollator 는 모델마다 정의하는 방법이 다른 거 같은데 현재 샘플로 주신 모델은 어디를 참고해야 하나요?
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
18강에서 Blog-Image-Maker 연결시에 에러가 납니다.
JSON parameter needs to be valid JSON위와 같은 에러가 발생하여 이미지 생성에 실패합니다. JSON 내용은 아래와 같습니다.{ "image_prompt": "A clear and inviting workspace showing a modern laptop displaying a simple Python code editor with 'print(\"Hello, Python!\")' and a friendly terminal window ready for input. Bright, high-definition, realistic style.", "image_alt": "파이썬 첫 코드 실행 환경을 보여주는 현대적인 노트북 작업 공간" }Blog-Image-Maker에서 같은 image_prompt로 실행시에는 문제 없이 진행되고 있습니다.
-
미해결스프링 시큐리티 OAuth2
JWT 조회 에 대한 질문
안녕하십니까. 스프링 시큐리티 강의를 듣고 있는 대학생입니다. 현재 강의를 들으면서 팀 프로젝트에 소셜 로그인을 적용하던 중 궁금증이 생겨 글을 작성하게 되었습니다. 현재 사용자가 로그인 후 토큰을 발급받고 MySQL에 리프레시 토큰을 저장한 뒤에, 사용자가 API에 접근할 때마다 매번 사용자 정보를 조회하는 것이 좋은 방법인지 궁금합니다. 현재 매번 조회하는 이유는 토큰의 사용자 정보가 서버 데이터베이스에 올바르게 저장된 사용자인지 검증하기 위해서 이 방식을 채택했습니다 package backend_lingua.linguas.infrastructure.security.filter; import backend_lingua.linguas.infrastructure.security.token.enumerated.TokenType; import io.jsonwebtoken.ExpiredJwtException; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; @Slf4j @Component @RequiredArgsConstructor public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtTokenProvider jwtTokenProvider; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = getBearerToken(request); // 토큰이 있는 경우에만 검증 if (StringUtils.hasText(token)) { try { if (jwtTokenProvider.validateAccessToken(token)) { Authentication authentication = jwtTokenProvider.getAuthentication(token, TokenType.ACCESS_TOKEN); SecurityContextHolder.getContext().setAuthentication(authentication); log.debug("Security Context에 '{}' 인증 정보를 저장했습니다.", authentication.getName()); } } catch (ExpiredJwtException e) { log.error("토큰 인증 실패: {}", e.getMessage()); response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authentication failed"); return; } } filterChain.doFilter(request, response); } private String getBearerToken(HttpServletRequest request) { String bearerToken = request.getHeader("Authorization"); if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { return bearerToken.substring(7); } return null; } } public TokenInfo generateToken(Authentication authentication) { String accessToken = createAccessToken(authentication); String refreshToken = createRefreshToken(authentication); Date accessTokenExpiryDate = createExpiryDate(accessTokenExpiration); return TokenInfo.from(accessToken, refreshToken, accessTokenExpiryDate.getTime(), refreshTokenExpiration); } public String createAccessToken(Authentication authentication) { return createToken(authentication, accessTokenExpiration, accessTokenSecret); } public String createRefreshToken(Authentication authentication) { String token = createToken(authentication, refreshTokenExpiration, refreshTokenSecret); Date expiryDate = createExpiryDate(refreshTokenExpiration); // DB에 리프레시 토큰 저장 tokenService.createRefreshToken(token, expiryDate, authentication); return token; } private String createToken(Authentication authentication, long expirationTime, String secretKey) { String authorities = authentication.getAuthorities() .stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.joining(",")); return Jwts.builder() .setSubject(authentication.getName()) // email .claim("auth", authorities) .setIssuedAt(new Date()) .setExpiration(createExpiryDate(expirationTime)) .signWith(createKey(secretKey)) .compact(); } public String getUsernameFromToken(String token, TokenType tokenType) { String secretKey = (tokenType == TokenType.ACCESS_TOKEN) ? accessTokenSecret : refreshTokenSecret; return Jwts.parserBuilder() .setSigningKey(createKey(secretKey)) .build() .parseClaimsJws(token) .getBody() .getSubject(); } public Authentication getAuthentication(String token, TokenType tokenType) { String username = getUsernameFromToken(token, tokenType); UserPrincipal userPrincipal = (UserPrincipal) userDetailsService.loadUserByUsername(username); return new UsernamePasswordAuthenticationToken( userPrincipal, token, userPrincipal.getAuthorities() ); } public boolean validateAccessToken(String token) { return validateToken(token, accessTokenSecret); } public boolean validateRefreshToken(String token) { return validateToken(token, refreshTokenSecret); } private boolean validateToken(String token, String secretKey) { try { Jwts.parserBuilder() .setSigningKey(createKey(secretKey)) .build() .parseClaimsJws(token); return true; } catch (ExpiredJwtException e) { log.error("만료된 JWT 토큰입니다."); throw e; // Filter에서 401 처리하도록 } catch (SecurityException | MalformedJwtException e) { log.error("잘못된 JWT 서명입니다."); } catch (UnsupportedJwtException e) { log.error("지원되지 않는 JWT 토큰입니다."); } catch (IllegalArgumentException e) { log.error("JWT 토큰이 잘못되었습니다."); } return false; } private Date createExpiryDate(long expirationTime) { return new Date(System.currentTimeMillis() + expirationTime); } private SecretKey createKey(String secret) { byte[] keyBytes = Decoders.BASE64.decode(secret); return Keys.hmacShaKeyFor(keyBytes); } @Service @RequiredArgsConstructor public class UserDetailsServiceImpl implements UserDetailsService { private final MemberRepository memberRepository; @Override @Transactional(readOnly = true) public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { Member member = memberRepository.findByEmail(email) .orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다: " + email)); return UserPrincipal.create(member); } }public class TokenServiceImpl implements TokenService { private final RefreshTokenRepository refreshTokenRepository; private final MemberRepository memberRepository; @Override @Transactional public RefreshToken createRefreshToken(String token, Date expiryDate, Authentication authentication) { String email = authentication.getName(); Member member = memberRepository.findByEmail(email) .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다: " + email)); // 새 토큰 생성 RefreshToken refreshToken = RefreshToken.builder() .token(token) .member(member) .expiryDate(convertToLocalDateTime(expiryDate)) .build(); return refreshTokenRepository.save(refreshToken); } @Override @Transactional public void deleteRefreshToken(String email) { Member member = memberRepository.findByEmail(email) .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다: " + email)); deleteRefreshTokenByUser(member); } @Override @Transactional public void deleteRefreshTokenByUser(Member member) { refreshTokenRepository.findByMemberId(member.getId()) .ifPresent(refreshTokenRepository::delete); } private LocalDateTime convertToLocalDateTime(Date date) { return Instant.ofEpochMilli(date.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime(); } }
-
미해결[4주 과정] <클로드 코드> 완독 챌린지 : 매일 1시간씩 4주 동안 클로드 코드 도서 완독하기!
클로드 코드 결제시 우측상단 경고창
이 나오면서 결제가 안되는데요.참 어렵습니다. ㅎㅎ
-
해결됨
ansible 설치
16강 수강중에 있고 ping이 보내지지 않습니다.
-
미해결[4주 과정] <클로드 코드> 완독 챌린지 : 매일 1시간씩 4주 동안 클로드 코드 도서 완독하기!
33페이지 3번 1.claude account.. 눌렀는데
구글로 계속하기 안뜨고아래 화면이 나옵니다.
-
미해결[4주 과정] <클로드 코드> 완독 챌린지 : 매일 1시간씩 4주 동안 클로드 코드 도서 완독하기!
eBook 출판 계획이 있으신가요?
가볍게 클로드에 대해, 클로드 사용법과 응용 방법을 접하기 좋은 책이라고 생각합니다.다만, 오늘 메일을 받아보니 기존 책의 내용에서 수정사항이 많은 것 같습니다.수정이 완료된다면, pdf 파일이나 eBook을 받아볼 수 있을까요?
-
미해결Kafka & Spark 활용한 Realtime Datalake
터미널에서 NAT 인스턴스로 직접 로그인 안됨
16강 ansible 설치를 위해 터미널에서 NAT 인스턴스로 직접 로그인하려고 하는데 오류가납니다. PS C:\Users\nayun\downloads> ssh -i public-nat-key.pem ec2-user@3.39.207.192ssh: connect to host 3.39.207.192 port 22: Connection timed out 15강까지 원활히 강의따라 실습 진행한 상태입니다.
-
해결됨[VOD] 6주 완성! 개발 실무를 위한 고농축 바이브코딩 (Cursor AI, Figma)
피그마 수업자료
피그마 소스파일을 복사해서 붙여 넣어도 그림은 안나오는데 어떻게 하는지 알려주세요
-
해결됨QGIS 입문자 올인원 스타터팩 (이론/실습형)
[음영기복도] 심볼과 툴박스 차이 여부
안녕하세요.심볼-음역기복도와 툴박스-hillshade가 기능적으로 차이가 있는 건가요?
-
미해결비전공자도 이해할 수 있는 CI/CD 입문·실전
사용자 삭제가 안되는 이유
그림 보시면 사용자 삭제 버튼이 활성화 안되는 이유는 뭘까요??하위 정책도 없습니다.
-
미해결
검색어를 입력하세요를 누르면 빈창이 나와요
이 화면에서 검색어를 입력하세요에서 아무거나 입력하면빈창이 떠요List.jsx:73 Each child in a list should have a unique "key" prop https://github.com/Unsok1234/frontend3
-
미해결[4주 과정] <클로드 코드> 완독 챌린지 : 매일 1시간씩 4주 동안 클로드 코드 도서 완독하기!
챌린지 설문을 어디서 하나요?
라이브 사전 설문은 진행했는데,챌린지 설문을 어디서 하는지 모르겠습니다.
-
미해결[4주 과정] <클로드 코드> 완독 챌린지 : 매일 1시간씩 4주 동안 클로드 코드 도서 완독하기!
독서 인증은 어떻게 하나요?
월요일 내용분 다 학습했습니다그러면 끝인가요?! 독서 인증은 어떻게 하나요?
-
미해결[4주 과정] <클로드 코드> 완독 챌린지 : 매일 1시간씩 4주 동안 클로드 코드 도서 완독하기!
32페이지 11번도 설치 에러가 납니다.
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
이력서 첨삭
안녕하세요 딩코님 제가 완강을 하여 이력서를 작성해봤는데보완·추가 할만한 부분을 알려주실수 있을까요https://earthy-chalk-721.notion.site/Lee-Jeongwon-1aa176858bf380cca9cce9625a5ad1e4?pvs=73강의중 살짝 봤는데 포공 졸업하셨나요,,, 역시 너무 잘배웠습니다
-
미해결
회의, 잘 진행되고 있나요?
여기 계신 분들, 회의 잘 진행되고 있나요?회의하면서 겪었던 불편한 점에 대해 이야기를 들려주세요🙂👉🏻지금 설문하러 가기 : https://buly.kr/2JorHyk 저는 회의 생산성 서비스 프로젝트를 앞두고 있으며, 현재 사람들이 회의하며 어떤 고충을 겪고 있는지 조사하고자 설문조사를 받고 있습니다. 익명으로 받고 있으니, 회의했던 상황을 떠올리며 솔직하게, 진지하게 임해주시면 감사하겠습니다 :) 설문은 회의를 참여/진행하는 분들 누구나 참여 가능하며, 랜덤 추첨을 통해 아주 실용적인 기프티콘도 드리니 많은 참여 부탁드립니다! ** 당첨자분들께는 9/29 (월)에 문자로 일괄 개별 연락드리겠습니다. ✅예상 소요시간 : 5분 이내✅문의 : hlson1004@gmail.com👉🏻지금 설문하러 가기 : https://buly.kr/2JorHyk
-
미해결독하게 시작하는 C 프로그래밍
필수실습문제 공부법 (진도 vs 복습)
필수 실습 문제에서 배열까지 어찌저찌 왔는데배열부터 본격적으로 구현 성공 후 풀이를 본적이 없네요ㅠ기초적인 문제부터 막혀서 답답한데, gpt에게 유사문제를 요청해서 무조건 내 걸로 만들고 다음 진도로 나가야 될지아니면 시행착오 겪으면서 어찌저찌 진도만 빼면 될지 몰라 더 학습방향이 틀어지기 전에 문의드립니다!