macOS에서 docker 설치
미해결
Airflow 마스터 클래스
안녕하세요 mac에서 docker 설치하려고 하는데 apt-get command not found가 뜹니다. 찾아보니 apt 명령어는 macOS에서 동작 안한다고 하는데 어떻게 진행하면 될까요?
- python
- airflow
172만명의 커뮤니티!! 함께 토론해봐요.
미해결
Airflow 마스터 클래스
안녕하세요 mac에서 docker 설치하려고 하는데 apt-get command not found가 뜹니다. 찾아보니 apt 명령어는 macOS에서 동작 안한다고 하는데 어떻게 진행하면 될까요?
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
언어과목에서 다 맞는 목표가 아니면 커리큘럼 중에 섹션 7, 10, 12는 안봐도 될까요?
해결됨
남박사의 파이썬으로 실전 웹사이트 만들기
from flask import Flask from flask import request from flask import render_template from flask_pymongo import PyMongo from datetime import datetime from bson.objectid import ObjectId from flask import abort from flask import redirect from flask import url_for import time import math app = Flask(__name__) app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb" mongo = PyMongo(app) @app.template_filter("formatdatetime") def format_datetime(value): if value is None: return "" now_timestamp = time.time() offset = datetime.fromtimestamp(now_timestamp) - datetime.utcfromtimestamp(now_timestamp) value = datetime.fromtimestamp((int(value) / 1000)) + offset return value.strftime('%Y-%m-%d %H:%M:%S') @app.route("/list") def lists(): #페이지 값(값이 없는 경우 기본값은 1) page = request.args.get("page", 1, type=int) #한페이지당 몇개의 게시물을 출력할지 limit = request.args.get("limit", 7, type = int) search = request.args.get("search", -1, type=int) keyword = request.args.get("keyword", type=str) #최종적으로 완성된 쿼리를 만들 변수 query = {} #검색어 상태를 추가할 리스트 변수 search_list = [] if search == 0: search_list.append({"title":{"$regex": keyword}}) elif search ==1: search_list.append({"contents":{"$regex": keyword}}) elif search ==2: search_list.append({"title":{"$regex": keyword}}) search_list.append({"contents":{"$regex": keyword}}) elif search == 3: search_list.append({"name":{"$regex": keyword}}) #검색 대상이 한개라도 존재할 경우 query 변수에 $or 리스트를 쿼리 합니다. if len(search_list) > 0: query = {"$or": search_list} print(query) board = mongo.db.board datas = board.find(query).skip((page - 1)*limit).limit(limit) #게시물의 총 갯수 tot_count = board.find(query).count() #마지막 페이지의 수를 구합니다. last_page_num = math.ceil(tot_count / limit) #페이지 블럭을 5개씩 표기 block_size = 5 #현재 블럭의 위치 block_num=int((page-1)/ block_size) #블럭의 시작 위치 block_start = int((block_size * block_num) +1) #블럭의 끝 위치 block_last = math.ceil(block_start +(block_size - 1)) return render_template( "list.html", datas = datas, limit=limit, page=page, block_start=block_start, block_last=block_last, last_page_num=last_page_num, search=search, keyword=keyword) @app.route("/view/<idx>") def board_view(idx): # idx = request.args.get("idx") if idx is not None: board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if data is not None: result = { "id" : data.get("_id"), "name" : data.get("name"), "title" : data.get("title"), "contents" : data.get("contents"), "pubdate" : data.get("pubdate"), "view" : data.get("view"), } return render_template("view.html", result=result) return abort(400) @app.route("/wirte", methods = ["GET", "POST"]) def board_wirte(): if request.method == "POST": name = request.form.get("name") title = request.form.get("title") contents = request.form.get("contents") print(name, title, contents) current_utc_time = round(datetime.utcnow().timestamp() * 1000) board = mongo.db.board post = { "name" : name, "title" : title, "contents" : contents, "pubdate" : current_utc_time, "view" : 0, } x = board.insert_one(post) print(x.inserted_id) return redirect(url_for("board_view", idx=x.inserted_id)) else: return render_template("wirte.html") if __name__ == "__main__": app.run(debug = True) <script> function search() { var v_search = document.getElementById("search").value; var v_keyword = document.getElementById("keyword").value; if(v_search == "" || v_keyword == ""){ return false; } else{ self.location.href="{{url_for('lists')}}?search=" + v_search + "&keyword=" + v_keyword; } } </script> {% if datas.count() > 0%} <table> <thead> <tr> <td>번호</td> <td>제목</td> <td>이름</td> <td>날짜</td> <td>조회수</td> </tr> </thead> <tbody> <!--반복되는 구간--> {%for data in datas%} <tr> <td>{{loop.index + (page - 1) * limit}}</td> <td><a href="{{url_for('board_view', idx=data._id, page=page, search=search, keyword=keyword)}}">{{data.title}}</a></td> <td>{{data.name}}</td> <td>{{data.pubdate | formatdatetime}}</td> <td>{{data.view}}</td> </tr> <!--반복되는 구간 끝--> {%endfor%} </tbody> </table> {%if block_start -1 > 0%} <a href="{{url_for('lists', page=block_start - 1, search=search, keyword=keyword)}}">[이전]</a> {%endif%} {%for i in range(block_start, block_last + 1)%} {% if i > last_page_num%} {%else%} {%if i == page%} <b>{{i}}</b> {%else%} <a href="{{url_for('lists', page=i, search=search, keyword=keyword)}}">{{i}}</a> {%endif%} {%endif%} {%endfor%} {%if block_last < last_page_num%} <a href="{{url_for('lists', page=block_last+ 1, search=search, keyword=keyword)}}">[다음]</a> {%endif%} <select name="search" id="search"> <option value="">검색대상</option> <option value="0">제목</option> <option value="1">내용</option> <option value="2">제목 + 내용</option> <option value="3">작성자</option> </select> <input type="text" name="keyword" id="keyword"> <input type="button" value="검색" onclick="search()"> {% else %} <h3>데이터가 없습니다.</h3> {%endif%} 분명 똑같이 했는데 왜 검색이 안되고 무반응인지 잘 모르겠어요. 뭐가 문제일까요?
미해결
죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
공부중인데 내용이 너무 좋아서 블로그에 공부한 예제 코드와 정리된 내용을 일부 작성하려 하는데 괜찮을까요?? 스크린샷으로 첨부하거나 그런건 아니고 코드는 제 ide 에서 실행한것과 git repo 에 올리면서 공유하려고 해~ 그리고 공부한 내용들은 직접 작성 하고 정리해서 올리려고 하는데 괜찮은지 궁금해서 질문해!!
해결됨
6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
1. 현재 학습 진도 4-5 수강중 트랜잭션 내 isolation level에 따른 데이터 consistency 보장을 위해, WAL(Write-Ahead Logging)시 내부적으로 사용하는 UNDO LOG와 REDO LOG를 활용한다. 2. 어려움을 겪는 부분 그러면 트랜잭션 내에서 rollback을 수행하면, UNDO LOG를 기반으로 디스크 내용을 트랜잭션 수행 이전 상태로 되돌린다고 이해했습니다. 맞게 이해한걸까요? 만약 이게 맞다면, WAL로 인해 트랜잭션 내 작업들은 커밋되기 전에 디스크에 반영되지 않으므로, rollback된다면 UNDO LOG를 활용하지 않더라도 디스크 내 데이터가 이전 내용임이 보장되지 않나요? 롤백 시 UNDO LOG가 어떤 부분에서 활용되어야 하는지 이해하지 못했습니다.
미해결
토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
안녕하세요! 토비님 좋은 강의 잘 듣고 있습니다 :) 별거 아닌것 같긴합니다만.. 도메인 코드 개선중 문득 궁금한 점이 생겨서 문의남겨봅니다..! Member를 생성하는 정적 펙토리 메소드에서 member.passwordHash = requireNonNull(passwordEncoder.encode(createRequest.password())); 이렇게 암호화된 값에 대한 null 체크를 하도록 구현하셨습니다. 그런데 아래와 같이 다른 파라미터처럼 암호화를 하기전에 password 파라미터 자체를 null 체크하는게 일관성이 있다고 생각되는데 암호화를 한 후 null체크를 하신 토비님의 의도가 궁금합니다!! member.passwordHash = passwordEncoder.encode(requireNonNull(createRequest.password()));
미해결
토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
repository에 직접 접근하는 기준이 어떤건지 궁금합니다. 강의에서 예를 들면 @Override public Member updateInfo(Long memberId, MemberInfoUpdateRequest memberInfoUpdateRequest) { Member member = memberFinder.find(memberId); checkDuplicateProfile(member, memberInfoUpdateRequest.profileAddress()); member.updateInfo(memberInfoUpdateRequest); return memberRepository.save(member); } private void checkDuplicateProfile(Member member, String profileAddress) { if(profileAddress.isEmpty()) return; Profile currentProfile = member.getDetail().getProfile(); if(currentProfile != null && currentProfile.address().equals(profileAddress)) return; if(memberRepository.findByProfile(new Profile(profileAddress)).isPresent()){ throw new DuplicateProfileException("이미 존재하는 프로필 주소입니다: " + profileAddress); } } 이 부분에서 member를 찾아올 때는 memberFinder를 통해서 가져왔는데 아래 중복 체크에서는 repository를 바로 사용했습니다. 물론 강의에서 profile을 찾는거기에 memberFinder에 넣기에는 책임이 난잡해질 것 같다는 느낌은 듭니다만 여기서 구분한 기준이 있는지 궁금합니다. 다른 예를 들면 public LoginResponse login(LoginRequest request) { Member member = memberFinder.findByEmail(request.email()); if(!member.verifyPassword(request.password(), passwordEncoder)){ //일치하지 않으면 에러 } //이 부분은 직접 접근하는게 좋은지 member.updateLastLoginAt(); memberRepository.save(member); //아니면 memberUpdater라는 포트를 통해 접근하는게 좋은지 memberUpdater.updateLastLoginAt(); return new LoginResponse(member.getId(), member.getStatus()); } 이런 경우 둘중 어떤 방법이 더 구조적으로 좋은지 궁금합니다.
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
[질문 내용] 24분 27초에 연관관계 편의 메서드 위치는 컨트롤 하는 쪽에 있는 게 좋다. 라고 하셨는데 연관관계의 주인쪽이라고 이해를 했습니다. 그렇다면 OrderItem을 추가하는 메서드는 Order쪽이 아니라 OrderItem에 해주어야 하는 게 아닐까 생각이 드는데 맞을까요?
미해결
죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
1.오타 JobScope와 StepScop가 선언된 빈은 애플리케이션 구동 시점에는 우선 프록시 객체로만 존재한다. 그 후 Job이나 Step이 실행된 후에 프록시 객체에 접근을 시도하면 그 때 실제 빈이 생성된다. StepScop <-오타 2.건의(내가틀렸을수도있음 그러면 수정해주셈) 그리고 JobParameters가 잡 실행 내부에서 불변이라는 내용이 필요할거같음 배치쓰던사람들은 당연한거라 생각할수있는데(잡파라미터랑 잡이름으로 유니크체크한댔나 그런거도 있으니까) 배치 첨쓰는사람은 왜 잡파라미터가 있는데 ExecutionContext를 사용하지 라는 생각을 할수있을거같음 3.궁금증 컴파일 시점에 없는 값을 어떻게 참조할 것인가? 여기서 잡의 스텝생성시점에서 di받는 잡파라미터 자리에 null을 넣는식으로 처리하는 방법이 있다고했는데,만약 코틀린의 경우엔 명시적으로 잡파라미터를 ?를 붙여서 nullable로 선언하고 로직에서 NullSafe 박는식으로밖에 해결할수없고 저게 맘에안들면 빈주입해야함? 저런 null전달같은 꼼수딴거없음? 강의가 자바기반이라고 적혀있어서 물어봐도되나싶긴한데 예전에 저것땜에 고생했었는데 다른방법을 못찾아서 물어봄
미해결
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] // @Transactional public void update(Long id, String name, String city, String street, String zipcode) { Address address = new Address(city, street, zipcode); Member member = memberRepository.findOne(id); member.setName(name); member.setAddress(address); } 위와 같이 update 메서드의 @Transactional 을 주석 처리하고 해봤습니다. 제 예상이라면 응답값이 새로워진 값이 아니라 기존의 값이 응답값으로 내려와야 할 것 같았습니다. @PutMapping("/v2/members/{id}") public UpdateMemberResponse updateMemberV2( @PathVariable Long id, @RequestBody @Validated UpdateMemberRequest request ) { memberService.update( id, request.name, request.city, request.street, request.zipcode ); Member findMember = memberService.findOne(id); return new UpdateMemberResponse(findMember.getId(), findMember.getName()); } 왜냐하면 결론적으로 엔티티 자체는 수정되었지만 DB에 쿼리가 날라가지 않았고 위 컨트롤러 코드에서 find 메서드는 엄연히 다른 트랜잭션에서 진행되니(애초에 업데이트는 트랜잭션이 없었지만) 다른 영속성 컨텍스트가 존재할 것이며, 1차 캐시또한 비워져있을 테니(애초에 업데이트는 영속성 객체를 가지고 있지 않았기에 1차캐시에 없음) 즉, 컨트롤러에서 find한 Member 객체는 새로 DB에서 가져온 객체 == 기존 객체 일테니 응답 값이 기존 값과 같아야할텐데 아래와 같이 달라진 값을 응답으로 내려주고 있었습니다. 왜 그런걸까요? 가입 응답 { "name": "hello", "city": "city", "street": "street", "zipcode": "12345" } 수정 응답 { "name": "hello@", "city": "city@", "street": "street@", "zipcode": "12345@" }
미해결
Airflow 마스터 클래스
안녕하세요 CLI로 Trigger 기능을 수행하는 부분 강의를 듣던 중에, Web UI에서 Trigger를 누르면 정상적으로 수행 되지만, 쉘 스크립트 커맨드로 airflow dags trigger <DAG 이름>이라는 명령어를 실행했을 때 아래와 같은 실패 로그가 나타나서 문의드립니다. 혹시 커맨드라인으로 실행하면 {{data_interval_end}} 와 같은 템플릿을 적용할 수 없나요?
해결됨
실전! Django 입문 [최신 5.2 버전]
ConnectionRefusedError: [WinError 10061] Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 에러가 발생했는데 찾아보니 EMAIL_USE_TLS = False EMAIL_USE_SSL = True EMAIL_PORT = 465 위의 코드로도 시도를 해보라해서 해봤지만 계속 동일한 에러가 발생했습니다. 강의에서 사용된 운영체제는 맥 os이고 저는 윈도우 환경에서 실행했는데 윈도우환경에서 자주 발생하는 에러라고 하는데 해결방법을 찾기가 어려워서 문의남깁니다.
미해결
실전! Django 입문 [최신 5.2 버전]
settings.CSRF_COOKIE_NAME이라는게 존재하지 않는다고 나와요
미해결
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의에서 강사님께서 11에서 17로 바꾸라는 모든 설정 확실하게 수정 완료했고 gradle 코드 수정하여 실행하니 A problem occurred configuring root project 'library-app'. > java.util.concurrent.ExecutionException: org.gradle.api.GradleException: Failed to create Jar file C:\Users\seong\.gradle\caches\jars-9\3baa90cc2341a9ffd1656b87b2a3526e\spring-core-6.2.11.jar. 아래와 같은 jar 파일 오류가 떴습니다. 구글링과 GPT를 써보니 캐시 파일 버전 충돌 오류라고 하여 캐시 파일을 삭제 하려고 해도 디렉터리가 비어있지 않다는 오류가 뜨며 삭제되지 않고, 또 .\gradlew wrapper 버전이 현재 7.5인데 스프링 부트 3.5.6은 최소 8.x를 사용한다고 하여 이것 또한 업그레이드 하려고 하였으나 PS C:\Project\Study-SpringBoot\library-app> .\gradlew wrapper --gradle-version 8.3 --distribution-type all Starting a Gradle Daemon, 5 stopped Daemons could not be reused, use --status for details FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring root project 'library-app'. > java.util.concurrent.ExecutionException: org.gradle.api.GradleException: Failed t o create Jar file C:\Users\seong\.gradle\caches\jars-9\3baa90cc2341a9ffd1656b87b2a3526e\spring-core-6.2.11.jar. 동일한 이런 jar 파일 오류가 떴습니다. 이 오류를 어떻게 해결해야 할까요 .... 도와주세요 ㅜㅜ
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
제본을하려고 합니다! 총 매수가 어느정도 나오나요??
미해결
스프링 시큐리티 OAuth2
안녕하십니까. 스프링 시큐리티 강의를 듣고 있는 대학생입니다. 현재 강의를 들으면서 팀 프로젝트에 소셜 로그인을 적용하던 중 궁금증이 생겨 글을 작성하게 되었습니다. 현재 사용자가 로그인 후 토큰을 발급받고 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(); } }
해결됨
6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
안녕하세요 딩코님 제가 완강을 하여 이력서를 작성해봤는데 보완·추가 할만한 부분을 알려주실수 있을까요 https://earthy-chalk-721.notion.site/Lee-Jeongwon-1aa176858bf380cca9cce9625a5ad1e4?pvs=73 강의중 살짝 봤는데 포공 졸업하셨나요,,, 역시 너무 잘배웠습니다
해결됨
남박사의 파이썬으로 실전 웹사이트 만들기
강사님께서 알려주신 from googlesearch import search query = "파이썬 강좌" for r in search(query, num_results=10, advanced=True): title = r.title contents = r.description url = r.url print(f"Title: {title}") print(f"Contents: {contents}") print(f"URL: {url}") print("-" * 40) 요 코드대로 해보았으나 출력이 안됩니다. 뭐가문제일까요?? ''' 게시판 리스트 테스트를 위한 Google 검색어 크롤링 프로그램 설치 해야하는 라이브러리 pip install --upgrade BeautifulSoup4 requests lxml pymongo googlesearch-python ''' import requests from bs4 import BeautifulSoup from pymongo import MongoClient from datetime import datetime import random from googlesearch import search # 몽고DB client = MongoClient(host="localhost", port=27017) # myweb 데이터베이스 db = client.myweb # board 컬렉션 col = db.board # 구글 검색시 헤더값을 설저하지 않으면 브라우저에서 보이는것과 다른 결과가 나옴 header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"} # 검색 결과 30개 수집 query = "파이썬 강좌" for r in search(query, num_results=30, advanced=True): # 구글 검색 URL, 검색어는 파이썬 # 게시물 작성시간 기록을 위해 현재시간 저장 (utc 타임) current_utc_time = round(datetime.utcnow().timestamp() * 1000) try: title = r.title contents = r.description # 몽고DB에 저장 # 작성자와 writer_id 설정 필요 col.insert_one({ "name": "테스터", "writer_id": "", "title": title, "contents": contents, "view": random.randrange(30, 777), "pubdate": current_utc_time }) except: pass 이것도 수업자료에 있었던 코드입니다. 이대로 해도 진행이 안되네요..
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
func 매서드에서 while문 마지막 실행문인 node = node -> next -> next; 가 이해가 잘 안되었는데요. 해당 실행문 위에 있는 다른 실행문은 node->value 또는 node->next를 통해서 n1메모리에 참조해서 그 값을 가르키기 때문에 =을 통해 값변화가 일어난다. 하지만 node = node -> next -> next; 의 경우에 node는 func메서드가 가지고 있는 지역변수이기 때문에 main에서부터 참조받은 n1 변수를 변경하지 않는다. 이게 맞을까요? 저말고도 다른분들도 여럿 같은 질문을 했는데 정확한 답변이 없어서 제가 이해한게 맞는지 올려봅니다.. 그럼에도 확실하게 개념이 잡히지 않네요. node -> value 또는 node -> next조차도 func메서드 안에 있는 지역변수의 요소들인 건 매한가지 아닌가요...ㅠㅠ node도 메모리주소.. node->next->next도 메모리주소인데.. 왜 지역변수로 얕은복사(?)가 되는 것인지..ㅠㅠ
해결됨
백엔드 6주 실전 미션과 1:1 피드백으로 완성하는 합격 포트폴리오
3주차 수업 자료(notion) category 안에 Training 이 없습니다. 글 내용 흐름에 따라 Training 대신 Fiction 으로 수정하면 될 것 같습니다 🙂 아래 GROUP BY 를 통해서도 없다는 것을 다시 한 번 확인할 수 있습니다. GROUP BY 조회 결과