inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

실무에서 캐시 처리를 할 때 질문입니다.

미해결

모든 개발자를 위한 HTTP 웹 기본 지식

안녕하세요 캐시 강의 듣다가 궁금한점이 생겨서 질문하게 되었습니다. https://www.inflearn.com/questions/112647/no-store-%EB%A1%9C%EB%8F%84-%EC%B6%A9%EB%B6%84%ED%95%A0-%EA%B2%83-%EA%B0%99%EC%9D%80%EB%8D%B0-no-cache-must-revalidate-%EB%8A%94-%EC%99%9C-%EA%B0%99%EC%9D%B4-%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80%EC%9A%94 위 링크를 참고했는데요~ 캐시 기능에 대해 여러 클라이언트 환경을 지원하는 셋팅을 하려면 캐시를 사용할 대상 (정적 리소스)에 헤더에는 no-cache, must-revalidate, etag를 걸어주고, 캐시를 사용하지 않을 대상에는 no-cache, no-store, must-revalidate를 걸어줘도 성능상 단점이 없을까요? HTTP 헤더에 값을 넣으려면 여러가지 방법이 있는데 interceptor를 이용해도 성능상 단점이 없을까요? Thymeleaf에서 prefix, suffix 설정을 하여 viewResolver가 view를 찾으면 캐시된 값에 대해 304 응답코드를 반환하는 반면에, 설정하지 않으면 200 (디스크 캐시, 메모리 캐시) 응답코드가 반환됩니다.. 무슨 차이가 있는건가요?

  • 네트워크
seon 댓글 1 좋아요 0 조회수 562

크레인 인형뽑기(카카오) 왜 오답이 뜨는지 모르겠어요 ㅠㅠ

미해결

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

package hello; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.Stack; public class Main { public int solution(int n, int[][] board, int m, int[] moves) { Stack<Integer> baguny = new Stack<>(); int count = 0; //크레인 for(int i=0; i<moves.length; i++) { //크레인 작동위치에서 인형빼와서 바구니에 담기 for(int j=0; j<board.length; j++) { if(board[j][moves[i]-1] != 0) { if(baguny.contains(board[j][moves[i]-1])) { baguny.pop(); count += 2; board[j][moves[i]-1] = 0; break; } else { baguny.push(board[j][moves[i]-1]); board[j][moves[i]-1] = 0; break; } } } } return count; } public static void main(String[] args) { Main t = new Main(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] board = new int[n][n]; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { board[i][j] = sc.nextInt(); } } int m = sc.nextInt(); int[] moves = new int[m]; for(int i=0; i<m; i++) { moves[i] = sc.nextInt(); } System.out.println(t.solution(n, board, m, moves)); } }

  • java
  • 코딩-테스트
wsim 댓글 1 좋아요 0 조회수 265

Session

해결됨

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] session Manager을 domain패키지에 두면 이상한가요? session값을 실무에서 데이터베이스에 저장하고 쓰나요?

  • spring
  • mvc
원종찬 댓글 1 좋아요 0 조회수 457

INSERT를 시도해보고 싶은데 에러가 발생합니다.

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

[질문 내용] maven이 아니라 gradle로 시도를 해보고 싶어서 스프링부트로 생성하여 진행을 해봤는데 em.persist(member);를 실행할때 에러가 발생하는데 도저히 원인을 못찾겠는데 혹시 어떤 문제인지 아시나요? package com.example.demo.entity; import jakarta.persistence.Entity; import jakarta.persistence.Id; @Entity public class Member { @Id private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import com.example.demo.entity.Member; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; import jakarta.persistence.Persistence; @SpringBootApplication public class StudySpringJpaApplication { public static void main(String[] args) { SpringApplication.run(StudySpringJpaApplication.class, args); EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); //애플리케이션 전체 공유 (persistence.xml 참조) EntityManager em = emf.createEntityManager(); //한번 쓰고 버려야함, 쓰레드간 공유하지 않음 EntityTransaction tx = em.getTransaction(); //조회를 제외한 DML 작업시 필수로 사용 tx.begin(); try { Member member = new Member(); member.setId(1L); member.setName("memberA"); em.persist(member); tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); System.out.println("=== ROLLBACK 진행 ==="); } finally { em.close(); } emf.close(); } } <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> <!-- EntityManagerFactory 생성 시 사용되는 persistence name --> <persistence-unit name="hello"> <class>com.example.demo.entity.Member</class> <properties> <!-- 필수 속성 --> <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="비밀번호"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3307/jpa?characterEncoding=UTF-8&amp;serverTimezone=UTC"/> <!-- 하이버네이트 사용 시 다른 DB에서 MySQL 문법을 사용 가능하도록 변경.--> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57Dialect"/> <!-- 콘솔에 SQL 출력 여부 --> <property name="hibernate.show_sql" value="true"/> <!-- 가독성 높여주는 formatting 여부 --> <property name="hibernate.format_sql" value="true"/> <!-- Comment 확인 여부 --> <property name="hibernate.use_sql_comments" value="true"/> </properties> </persistence-unit> </persistence> 에러는 다음과 같이 발생합니다. jakarta.persistence.PersistenceException: Converting `org.hibernate.property.access.spi.PropertyAccessException` to JPA `PersistenceException` : Error accessing field [private java.lang.Long com.example.demo.entity.Member.id] by reflection for persistent property [com.example.demo.entity.Member#id] : com.example.demo.entity.Member@1bc6c7f0 at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:165) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:175) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:182) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:743) at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:721) at com.example.demo.StudySpringJpaApplication.main(StudySpringJpaApplication.java:29) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) Caused by: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.Long com.example.demo.entity.Member.id] by reflection for persistent property [com.example.demo.entity.Member#id] : com.example.demo.entity.Member@1bc6c7f0 at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:48) at org.hibernate.metamodel.mapping.internal.BasicEntityIdentifierMappingImpl.getIdentifier(BasicEntityIdentifierMappingImpl.java:148) at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:5269) at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4856) at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:293) at org.hibernate.event.internal.EntityState.getEntityState(EntityState.java:59) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:93) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:53) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:737) ... 7 more Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.example.demo.entity.Member.id to com.example.demo.entity.Member at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) at java.base/java.lang.reflect.Field.get(Field.java:425) at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:44) ... 16 more === ROLLBACK 진행 ===

  • java
  • jpa
그냥곰 댓글 1 좋아요 0 조회수 1296

공부방법에 대한 질문입니다

해결됨

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

현재 1주차 누적합문제까지 풀었는데요 문제를 풀고난 후 강사님 코드를 보면 저에 비해 너무 간결하시게 푸시거나 가독성이 좋다는게 느껴집니다 그렇다보니 강사님이 푸신 코드를 안 보고도 칠 수 있을 정도로 외우는게 맞는지 아니면 어떤 개념을 이용해서 풀수있는지 확인하고 다음 문제에서 적용하려고 노력하는게 좋을지 고민됩니다 예를들어 저는 이 문제를 http://boj.kr/33ede55138c644e8a8c18c3dd4623764 이렇게 풀었습니다 그리고 실제 기업 코테를 진행할 때는 백준이나 프로그래머스 사이트만 키게해주나요? Devc++이나 VSC사용 못하고? 이에 대한 얘기를 들어본적이 없어서 질문드립니다

  • c++
  • 코딩-테스트
겜개발자 댓글 1 좋아요 0 조회수 553

현재 inflearn 사이트가 매우 느려서 원활한 학습을 못하고 있습니다.

미해결

안녕하세요. 현재 시각 사이트 전체가 원활하게 돌아기지 않고 있습니다. 혹시 점검 중이신가요? 지금 학습이 잘 안 될 정도여서 내일 아침에 하려고 합니다. 오늘 아침쯤에는 강의 시청하는데 지장이 없게 해 주실 수 있으신지요?

박종성 댓글 1 좋아요 0 조회수 240

8강 jupyter 첫 실행부터 막히네요..

미해결

[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)

다 설치하고 jupyter notebook 실행시키고 수업 듣고 있는데, 저는 왜 shift+ent 눌러도 저렇게 줄만 바뀔까요. 선생님 알려주시는 것처럼 출력이 안됩니다.. 그리고 Untitled name도 바꿔보려고 했는데 어떤 걸 입력해도 error 라고만 뜹니다. 마지막으로 질문을 올리다보니 제 화면이 선생님 화면과 다른 점이 우측 상단에.. Python 3 (ipykernel)이라고 되어 있네요? 선생님 화면은 Python 3만 나와 있습니다..ㅠㅠ 누가 좀 알려주세요ㅠㅠ 흑흑

  • python
  • 웹-크롤링
Lucy 댓글 1 좋아요 0 조회수 660

코드 설명이 필요합니다ㅠ.ㅠ

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

안녕하세요 선생님 벡터 관련 함수를 사용하다가 도저히 이해가 안되서 질문 남깁니다ㅜ.ㅜ #include<bits/stdc++.h> using namespace std; int n, p , d, sum; vector<int> b; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); b.push_back(10); b.push_back(20); b.push_back(50); b.push_back(100); if(b.size() - 10 > 0) b.erase(b.begin(), b.begin() + b.size() - 10); for(int i:b) cout << i << " "; return 0; } 위 코드의 출력이 왜 10 20 50 100이 아닌 엉뚱한 것이 출력되는지 모르겠습니다ㅜ.ㅜ

  • c++
  • 코딩-테스트
이상목 댓글 1 좋아요 0 조회수 400

서버사이드렌더링 준비하기 강의 질문

미해결

[리뉴얼] React로 NodeBird SNS 만들기

강의에 올라와 있는 pages폴더에서 index.js 파일 getServerSideProps부분이 저도 store.dispatch오류가 나서 고차함수로 바꾸어 주니까 해결됬습니다. 근데 이유를 잘모르겠습니다 ㅠㅠ export const getServerSideProps = wrapper.getServerSideProps( (store) => async () => { store.dispatch({ type: LOAD_MY_INFO_REQUEST, }); store.dispatch({ type: LOAD_POSTS_REQUEST, }); store.dispatch(END); await store.sagaTask.toPromise(); } );

  • react
  • redux
  • node.js
  • express
  • next.js
장산 댓글 1 좋아요 0 조회수 714

1N 6분 부근 모듈러 합동 관련

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

안녕하세요! 1N 문제 강의 6분 부근에 모듈러 합동 관련하여 설명해주신 부분에 오류가 있는 것 같습니다. 교안과는 다르네요. 확인 한번 부탁드립니다.

  • c++
  • 코딩-테스트
박찬울 댓글 1 좋아요 2 조회수 394

아두이노에서 MQTT서버 접속이 안됩니다.

미해결

사물인터넷 통신은 내 손에 (Arduino, MQTT, Nodejs, MongoDB, Android,VS Code)

위 상태의 환경인데요, 아두이노에서 wifi 접속까지는 되지만 192.168.0.2의 브로커에 접속하려하면 Attempting MQTT connection... failed, rc=2 try again in 5 seconds 의 메세지가 계속 뜨며 접속이 안됩니다. 구글에 찾아보니 client null이 아니라 다른 문자열이 나오는 것 같은데, 이를 어찌해야 좋을까요? 진도를 못 나가고 있습니다... 방화벽도 해제하였고, # listener port-number [ip address/host name/unix socket path] #listener listener 1883 # Defaults to false, unless there are no listeners defined in the configuration # file, in which case it is set to true, but connections are only allowed from # the local machine. allow_anonymous true 위 내용도 콘피그에 넣어봤습니다. 당연히 토픽 명은 아두이노 코드와 같게 outTopic으로 하였습니다.

  • node.js
  • mongodb
  • arduino
  • iot
  • MQTT
윤선웅 댓글 1 좋아요 0 조회수 820

은닉 상태에 대한 질문이 있습니다

해결됨

혼자 공부하는 머신러닝+딥러닝

강사님 언제나 친절한 답변에 감사드립니다. 다름이 아니라 490p에 은닉 상태 이미지에 관해 질문이 있습니다. 하단의 도움말을 참고하면 '앞의 그림 O도 은닉상태랍니다'라고 적혀있는데, 이 말이 의미하는 것이 두번째 타임스탭부터는 이전 층의 출력이 재사용되기 때문에, 셀도 출력에 포함되는 것으로 생각하면 된다는 말씀이 맞을까요? 그 부분이 직관적인 이해가 되질 않습니다

  • 머신러닝
  • 딥러닝
박세은 댓글 1 좋아요 0 조회수 370

데이터 수집하기 오류 질문

미해결

비트코인 알고리즘 트레이딩 봇 개발

8분 22초 print(type(webpage)) run하면 아무 결과값이 안뜹니다 14분 50초 run 눌러도실행이 안되고 오류가 납니다. File "C:\Users\kimminsoo\AppData\Local\Temp\ipykernel_6404\2059768320.py", line 31 $ print(df_temp_data.head(5)) ^ SyntaxError: invalid syntax 이런 오류메시지가 뜹니다 뭐가 문제인가요?

  • pandas
  • 투자
  • 퀀트
김민수 댓글 1 좋아요 0 조회수 523

배포에 대한 질문이 있습니다. 급합니다 ㅠㅠ

미해결

현재 프론트하고 백엔드하고 배포를 따로 하려고 하는데 이 배포를 언제까지 유지해야 하는지가 궁금합니다. 포폴에 배포 링크를 담아주고 취업할 때 까지 유지해야 하는지 아니면 배포하고 시연 이미지 첨부한 설명을 포폴에 담고 배포를 종료해도 되는지 어떻게 해야하는지 궁금합니다. 알려주시면 감사하겠습니다 ㅠㅠ (__) 꾸벅

  • 배포
  • aws
  • ec2
  • s3
  • springboot
  • 스프링부트
유요한 댓글 1 좋아요 0 조회수 344

The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher. 해결법을 모르겠습니다

미해결

Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 잘 따라가다가 '13. Firebase로 이메일 로그인 기능 구현' 강의 수강 중 pubspec.yaml 파일에 flutterfire_ui: ^0.4.3+20 을 추가 하니 The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher. The following dependencies do not satisfy the required version: project ':sign_in_with_apple' -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50 라고 오류가 떠서 못넘어가고 있습니다 ㅠㅠ 어떻게 해결해야할까요? 구글링도 해봤으나 적절한 답을 찾지 못했습니다ㅠㅠ

  • flutter
  • ios
  • android
동인 댓글 4 좋아요 0 조회수 6981

취업시 포폴을 제출할 때

미해결

퍼블리셔 개인 포트폴리오 홈페이지 제작 완벽 가이드(PDF)

궁금한점이 있습니다. 취업시 포트폴리오를 작성한 것을 제출할 때 프로젝트 배포한것을 계속 유지한체 링크를 포폴에 올려줘야나요 아니면 배포했을 때 모습을 이미지로 보여주는 건가요?

  • HTML/CSS
  • 웹-디자인
  • 포트폴리오
유요한 댓글 2 좋아요 1 조회수 631

1차캐시와 SQL 쓰기지연 저장소에 저장되는 시점이 궁금합니다.

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 섹션3을 듣고 나서 영속성 컨텍스트에 대해서 이해가 되지 않아서 질문드립니다. /* 비영속 / Member member = new Member(); member.setId(101L); member.setName("HelloJPA"); / 영속 / em.persist(member); Member findMember = em.find(Member.class, 101L); / 변경 감지 */ findMember.setName("HelloJPA dirty checking"); tx.commit(); 영속성 컨텍스트의 동작원리에 대해 이해하려다 보니 이상한? 코드가 작성되었는데 양해 부탁드립니다. Member 객체를 persist하면 영속성 컨텍스트에 저장되고 em.find를 하면 그 객체를 다시 가져오게 이때 영속성 컨텍스트에 저장된 객체는 1개 그 객체의 value를 다시 변경하면 dirty checking에 의해 1차캐시에 저장된 객체에 반영 로그를 확인했을 때 commit 시점에 insert쿼리와 update쿼리가 둘다 나감. 트랜잭션이 commit되는 시점에 sql 쓰기지연 저장소에서 insert문 하나만 나갈 것으로 예상했는데 둘다 나가서 의아 질문 드립니다. 도중에 flush되는 시점이 없고 sql쓰기지연저장소에 쌓이는 시점 때문인거 같긴한데, 변경감지해서 쓰기지연저장소에 쌓이는 시점이 commit할 때가 아닌건가요? 아니라면 어느시점에 쌓이는 건지 궁금합니다. 또한 그래서 1차캐시가 sql 쓰기지연 저장소와 동기화가 되지 않는다고 이해하면 될까요? 실제로 이렇게 코드가 작성되지는 않겠지만 영속성 컨텍스트가 어떤 메커니즘으로 작동하는지 궁금해서 여쭤봅니다. 강의 너무 잘듣고 있어요.!! 감사합니다.

  • java
  • jpa
하얀종이개발자 댓글 1 좋아요 0 조회수 618

상태코드

해결됨

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

1. 13:09 부분을 Integer statusCode = (Integer)request.getAttribute(ERROR_STATUS_CODE) 위와 같이 해도 될텐데, RequestDispatcher를 사용하신 이유가 궁금합니다. 2. log.info ("1 : " + request.getAttribute(ERROR_STATUS_CODE)); log.info ("2 : " + request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE)); getAttribute의 반환 타입이 Object여서 위와 같이 로그 출력을 하면 Object안에 데이터가 출력될 줄 알았는데 500이 출력 됩니다. 이건 왜 그런건가요? 타입 자동 변환 그런것이 있는 건가요?

  • spring
  • mvc
lwisekiml 댓글 1 좋아요 1 조회수 557

github

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

제 깃헙 아이디를 만들어서 푸시를 해야 이 섹션 진행 할 수 있는건가요? vscode와 git 연결을 해야하는건지 답변 부탁드립니다.

  • react
  • node.js
  • seo
  • graphql
  • next.js
wodndi0321 댓글 1 좋아요 0 조회수 329

인기 태그

인프런 TOP Writers

주간 인기글