inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

data import 덤프 기능

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

데이터 분석을 위한 환경 구축 (업데이트) 4:27 data import 덤프기능을 사용하는 이유가 궁금합니다 이전에 배웠던대로 student.sql파일로 실행할때처럼 file->open sql.script->student.sql 이런 방식과 차이점이 어떤것인가요? 그리고 create database bestproducts; 를 하기 전 오류가 뜨는 이유와 치면 오류가 왜 사라지는지 궁금합니다

  • python
  • sql
  • mysql
  • dbms/rdbms
  • 데이터-엔지니어링
이하윤 댓글 1 좋아요 0 조회수 293

MYSQL 수강하고 Pandas 강의로 넘어가도 될까요? (몽고DB수강 X)

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

안녕하세요. 전 열심히 잔재미코딩 선생님 강의 수강하고 있는 수강생입니다. 크롤링 기본,고급 강의 수료했고 지금 열심히 SQL 듣고 있는 중입니다. 이 다음 단계로 MongoDB 건너띄고 판다스 강의로 넘어가도 강의 듣는데 문제없을까요? 조언 부탁드립니다. 감사합니다.

  • python
  • sql
  • mysql
  • dbms/rdbms
  • 데이터-엔지니어링
dostudydo 댓글 1 좋아요 0 조회수 465

fetch함수

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

패턴으로 익히는 파이썬과 MySQL - 데이터 입력과 검색 9:09 fetch함수는 별도로 테이블을 지정하지않고 데이터베이스만 지정하는 것(fetch앞에있는 cursor로부터) 같은데 그러면 한 데이터베이스에 있는 모든 레코드를 출력해주는 것인가요?

  • python
  • sql
  • mysql
  • dbms/rdbms
  • 데이터-엔지니어링
이하윤 댓글 1 좋아요 0 조회수 444

db.cursor()에서 질문

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

pymysql 소개 및 설치 14:30 cursor=db.cursor()에서 pymysql을 db앞에 안붙이는 이유는 db안에 pymysql.이 포함되어있기 때문이라고 이해하는 것이 맞나요?

  • python
  • sql
  • mysql
  • dbms/rdbms
  • 데이터-엔지니어링
이하윤 댓글 1 좋아요 0 조회수 264

varchar text 차이

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

[연습] 실제 데이터 기반, 데이터베이스 직접 만들어보기1 11:55 데이터타입 varchar text 차이가 궁금합니다 ' 그리고 강의내에서 varchar의 경우 int와 달라서 auto_increment를 사용할수없다고 하셨는데 auto_increment는 숫자에만 가능해서 그런건가요?

  • python
  • sql
  • mysql
  • dbms/rdbms
  • 데이터-엔지니어링
이하윤 댓글 1 좋아요 0 조회수 1331

19:04 초 where in 쿼리 대신 where array_conatins 쿼리가 나왔습니다. (스프링 부트 3.1)

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 현재 스프링 부트 3.1 로 강의를 따라가고 있습니다. default_batch_fetch_size:10 을 설정해서 나가는 쿼리가 줄어드는 것을 확인했습니다만, 쿼리가 두 개가 아니고 총 세 개가 나왔습니다. 023-06-13T23:24:02.666+09:00 DEBUG 68750 --- [nio-8080-exec-5] org.hibernate.SQL : select o1_0.order_id, d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.memeber_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.memeber_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id offset ? rows fetch first ? rows only 2023-06-13T23:24:02.676+09:00 INFO 68750 --- [nio-8080-exec-5] p6spy : #1686666242676 | took 2ms | statement | connection 8| url jdbc:h2:tcp://localhost/~/springbootjpa select o1_0.order_id,d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status,m1_0.memeber_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name,o1_0.order_date,o1_0.status from orders o1_0 join member m1_0 on m1_0.memeber_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id offset ? rows fetch first ? rows only select o1_0.order_id,d1_0.delivery_id,d1_0.city,d1_0.street,d1_0.zipcode,d1_0.status,m1_0.memeber_id,m1_0.city,m1_0.street,m1_0.zipcode,m1_0.name,o1_0.order_date,o1_0.status from orders o1_0 join member m1_0 on m1_0.memeber_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id offset 0 rows fetch first 100 rows only; 2023-06-13T23:24:02.681+09:00 DEBUG 68750 --- [nio-8080-exec-5] org.hibernate.SQL : select o1_0.order_id, o1_0.order_item_id, o1_0.count, o1_0.item_id, o1_0.order_price from order_item o1_0 where array_contains(?,o1_0.order_id) 2023-06-13T23:24:02.689+09:00 INFO 68750 --- [nio-8080-exec-5] p6spy : #1686666242689 | took 0ms | statement | connection 8| url jdbc:h2:tcp://localhost/~/springbootjpa select o1_0.order_id,o1_0.order_item_id,o1_0.count,o1_0.item_id,o1_0.order_price from order_item o1_0 where array_contains(?,o1_0.order_id) select o1_0.order_id,o1_0.order_item_id,o1_0.count,o1_0.item_id,o1_0.order_price from order_item o1_0 where array_contains('ar2: ARRAY [CAST(1 AS BIGINT), CAST(2 AS BIGINT), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL]',o1_0.order_id); 2023-06-13T23:24:02.690+09:00 DEBUG 68750 --- [nio-8080-exec-5] org.hibernate.SQL : select i1_0.item_id, i1_0.dtype, i1_0.category_item_id, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.author, i1_0.isbn, i1_0.artist, i1_0.etc from item i1_0 where array_contains(?,i1_0.item_id) 2023-06-13T23:24:02.691+09:00 INFO 68750 --- [nio-8080-exec-5] p6spy : #1686666242691 | took 0ms | statement | connection 8| url jdbc:h2:tcp://localhost/~/springbootjpa select i1_0.item_id,i1_0.dtype,i1_0.category_item_id,i1_0.name,i1_0.price,i1_0.stock_quantity,i1_0.author,i1_0.isbn,i1_0.artist,i1_0.etc from item i1_0 where array_contains(?,i1_0.item_id) select i1_0.item_id,i1_0.dtype,i1_0.category_item_id,i1_0.name,i1_0.price,i1_0.stock_quantity,i1_0.author,i1_0.isbn,i1_0.artist,i1_0.etc from item i1_0 where array_contains('ar3: ARRAY [CAST(1 AS BIGINT), CAST(2 AS BIGINT), CAST(3 AS BIGINT), CAST(4 AS BIGINT), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL]',i1_0.item_id); 수강 중에 제가 따라 작성한 코드를 스프링부트 2.4.1에 그대로 옮겨보니 강의 내용대로 where in 쿼리가 나오는 것을 확인했습니다. 스프링부트 버전 차이에서 나오는 쿼리가 달라진 것 같은데, 제 생각이 맞을까요? 답변 확인 : 빠르게 답변해주셔서 감사합니다!! 덕분에 array_contains 로 최적화된 이유를 쉽게 이해할 수 있었습니다. (Hibernate에서 최적화를 했었었군요!) 아 그리고 강의 내용에서 쿼리 세 개 나온다는 것을 확인했습니다(잘못 본 것에 대해 질문글에서 수정을 해놨어야 했는데 빼놓지 않았었네요 ㅠㅠ) 다시 한번 상세한 답변 정말 감사드립니다.

  • java
  • spring
  • spring-boot
  • jpa
말랑한참깨 댓글 1 좋아요 1 조회수 1929

강사님 analytic 집계함수 에 대해서 궁금한게 있습니다.

해결됨

데이터 분석 SQL Fundamentals

select empno, ename, deptno, sal, avg(sal) over (partition by deptno) dept_avg_sal , sal - avg(sal) over (partition by deptno) dept_avg_sal_diff from hr.emp; 위 SQL은 강사님이 작성해주신 코드 입니다. with temp_01 as ( select empno ,ename ,sal as "개인 급여" ,avg(sal) over (partition by deptno) as "평균 급여" from emp ) select empno,ename,"개인 급여","평균 급여",abs("평균 급여"-"개인 급여") from temp_01; 밑에는 제가 답안지를 안보고 먼저 작성한 코드 입니다. 제가 처음에 첫번째 코드처럼 작성을 하려다가 이게 group by 처럼 부하가 좀 큰 작업이라고 생각이되었습니다. 그래서 한번만 사용하고 싶어서 임시테이블을 만들고 그 테이블의 컬럼끼리 계산을 하게 했는데 윈도우 함수를 한번 더 사용하는것과 서브쿼리로 한번만 호출하는 것 중에서 윈도우 함수를 한번 더 호출하는게 더 나은 선택이라면 그 이유가 궁금합니다. 만약에 서브 쿼리를 사용하는데 그 서브 쿼리에 함수를 사용한 컬럼이 있다면 그 컬럼을 호출할때마다 그 함수를 실행해서 그 결과를 가져오나요? 아니면 한번 서브쿼리를 실행하면 그 데이터가 저장되서 값만 가져오나요?

  • sql
  • postgresql
  • dbms/rdbms
cjh 댓글 1 좋아요 0 조회수 350

alter table 명령에서

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

SQL로 테이블 변경하기 11:34 alter table에서 변경할 컬럼 타입을 넣을때 not null을 안써주면 원래 not null이었으면 null이어도 되는걸로 바뀌는 건가요? 이처럼 변경할 컬럼 타입에 원래 컬럼에 있던 타입에 관련된 것을 안써주면 리셋되는 건가요?

  • python
  • sql
  • mysql
  • dbms/rdbms
  • 데이터-엔지니어링
이하윤 댓글 1 좋아요 0 조회수 324

AWS사용과 슬랙 접속에 어려움이 있습니다

미해결

직접 활용할 수 있는 SQL - 기초부터 실무 활용까지

안녕하세요 사내 망을 사용해서만 인프런에 들어와 수업을 수강할 수 있습니다. 그래서 보안상 aws 페이지나 슬랙으로 접속이 안되네요.. 그래서 환경구축(AWS) 없이 수업을 들으며 실습을 진행하고 싶은데, 어떻게 해야하는지 질문드립니다.

  • sql
  • dbms/rdbms
이지윤 댓글 1 좋아요 0 조회수 365

혹시 join 자체도 특정 조건에 따라 동적으로 작용되게 할 수 있나요?

미해결

실전! Querydsl

안녕하세요. where 조건을 동적으로 생성해주는 부분에 대해서는 충분히 이해가 되었습니다. 그런데 혹시 특정 condition 값에 따라 join을 해줘야하는 테이블이 다른 경우라면 어떻게 처리되어야 할지 모르겠어서 글을 남기게 되었습니다. condition조건에 teamName이 있을 때만 team을 조인해주고 싶은데 join 구문을 동적으로 처리할 수 있는 좋은 방법이 어떤 것인지 질문드립니다. 😭 감사합니다.

  • java
  • jpa
chaerin920 댓글 1 좋아요 0 조회수 1120

오라클의 경우 좀 다른거같습니다.

해결됨

SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법

이렇게 선언하여 사용하였는데 오라클의 경우에는 RTRIM을 해주어야 하는거 같은데 맞나요 ?

  • sql
  • dbms/rdbms
leejh 댓글 1 좋아요 0 조회수 434

강사님 Analytic을 사용하는 이유가 뭔가요?

해결됨

데이터 분석 SQL Fundamentals

Analyric을 사용할때 많은 데이터나 필요한 함수가 많아지면 서브쿼리나 with절을 많이 사용해야할거같은데 데이터가 많아지면 복잡한 쿼리를 작성할때 부담스러울거같다는 생각이 들더라구요 차라리 필요한 데이터만 가지고 엑셀로 작업하는게 더 빠르고 엑셀이 가진 GUI를 활용하는게 나을거같다는 생각도 들더라구요 그런데 DB만 검색해봐도 윈도우 함수는 공부하는게 좋다, 이런 이야기가 많은데 그 장점이 뭔지 궁금합니다.

  • sql
  • postgresql
  • dbms/rdbms
cjh 댓글 2 좋아요 0 조회수 452

6번문제

해결됨

SQL 왕초보를 위한 해커랭크로 배우는 실전 SQL

6번문제 이렇게 작성해도 정답인가요? select * From CITY where POPULATION > 100000 AND COUNTRYCODE ='USA'

  • sql
  • mysql
  • dbms/rdbms
  • 코딩-테스트
Yongje Jang 댓글 1 좋아요 0 조회수 427

update쿼리로 인한 영속성컨텍스트 불일치

해결됨

실전! Querydsl

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 수정, 삭제 벌크 연산의 6:20 부분에서 update쿼리로 인한 영속성컨텍스트 문제를 설명해주셨는데요. 전 강의에서 em.flush()실행되는 조건들을 설명해주실 때, 직접 호출 시 트랜잭션 커밋 시 JPQL쿼리 실행 시 em.flush()가 실행된다고 설명해주신 것으로 기억하고 있습니다. querydsl도 결국 JPQL기반으로 작동된다고 알고 있는데, querydsl을 통한 select쿼리 실행을 하면 자동으로 em.flush()가 실행되지 않고, 직접 해주어야 하는 메커니즘이 궁금합니다!

  • java
  • jpa
Dompoo 댓글 1 좋아요 1 조회수 526

헤커랭크 테스트 속도

미해결

[백문이불여일타] 데이터 분석을 위한 중급 SQL

테스트 케이스 채점할때 속도가 원래 좀 늘리나요,,,..? 프로그래머는 채점 속도랑 다른데 저만 그런가 해서요

  • sql
지루한 멍게 댓글 1 좋아요 0 조회수 514

build.gradle 빌드 실패 에러(JDK 17.0.6, Spring boot 3.0.7)

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

안녕하세요, build.gradle의 빌드 실패가 나서 문의드립니다. JDK 버전은 다음과 같이 17.0.6입니다. 그리고 인텔리제이 설정은 다음과 같습니다. java 컴파일러 설정 2. 빌드 도구 설정 3. 프로젝트 설정 마지막으로 처음 프로젝트를 다운로드 받았던 설정은 다음과 같습니다.(spring boot 3.0.7 버전 사용) 처음 build.gradle을 실행할 때부터 에러 로그 하나도 없이 그냥 빌드 실패했다는 에러가 뜹니다. 컴퓨터를 여러번 껐다가 켜봐도 여전히 같은 에러가 뜹니다. 인텔리제이와 스프링이 완전 처음이라서 이 에러를 어떻게 해결해야 하는지 모르겠습니다. 커뮤니티의 다른 글들을 참고해봐도 딱히 도움이 되지는 않는 것 같습니다. 도와주시면 너무 감사하겠습니다.

  • java
  • spring
  • mvc
  • spring-boot
spring study 댓글 4 좋아요 0 조회수 6252

강사님 Group By 실습 - 01 질문 있습니다

해결됨

데이터 분석 SQL Fundamentals

with : https://www.inflearn.com/questions/542285 강사님께서 with 절을 사용하시는 이유는 수강생이 SQL 진행 순서를 보여주기 위해서 사용하신다고 하셨는데 강사님께서는 실무에서 with을 주로 어떤 용도로 사용하시는지 궁금합니다 그리고 select a.dname , round(avg(c.sal),0) as "부서별 평균 급여" from dept a join emp b on a.deptno = b.deptno and a.dname in ('SALES','RESEARCH') left join emp_salary_hist c on b.empno = c.empno group by a.dname ; -- 강사님께서 작성하신 코드 select a.deptno, max(a.dname) as dname, avg(c.sal) as avg_sal, count(*) as cnt from hr.dept a join hr.emp b on a.deptno = b.deptno join hr.emp_salary_hist c on b.empno = c.empno where a.dname in('SALES', 'RESEARCH') group by a.deptno order by 1; 저는 where에 조건을 넣지 않고 and에 조건을 넣었습니다. 그이유는 dname에 인덱스가 없기때문에 where에 조건을 추가하면 테이블을 조인한 후에 필터링을 하고 Group by를 진행하게 되는 것보다 join on and 에 조건을 넣으면 조건에 만족하는 데이터만 가지고 조인을 하기때문에 조금이라도 조인 성능이 좋아지지 않을까 생각했습니다. 아니면 join 조건도 인덱스가 없으면 where 절과 똑같이 조건 스캔을 먼저 하냐 뒤에 하냐 차이일 뿐인가요 ?

  • sql
  • postgresql
  • dbms/rdbms
cjh 댓글 1 좋아요 0 조회수 387

강사님 with 절을 사용하시는 이유가 궁금합니다.

해결됨

데이터 분석 SQL Fundamentals

강사님께서 with절을 꾸준히 보여주시는 이유가 있을거라 생각해서 찾아보니 장점도 있지만 단점도 있더라구요 with를 사용하면 임시테이블을 만들기 때문에 장점은 재귀 사용이 가능하고, 반복 사용이 가능하다. 단점은 불필요한 코드가 들어가서 가독성이 나빠질수 있고 임시 테이블을 만들기 때문에 성능에 영향을 줄수있다고 적혀있더라구요 강사님께서는 with를 꾸준히 보여주시는 이유가 궁금합니다. select a.dname , round(avg(c.sal),0) as "부서별 평균 급여" from dept a join emp b on a.deptno = b.deptno and a.dname in ('SALES','RESEARCH') left join emp_salary_hist c on b.empno = c.empno group by a.dname ; 저는 and에 부서명 조건을 추가했습니다. 그 이유는 dept.dname에 인덱스가 없고 where에 dname을 넣으면 조인후에 필터가 되기때문에 join 조건에 추가하면 조인할때 데이터를 조금 더 줄인 상태에서 실행한다고 이해를 했습니다. 제가 잘못 이해를 하고 있는 걸까요? 조인 할때 and 조건도 마찬가지로 인덱스가 없다면 큰 상관이 없는건가요 ?

  • sql
  • postgresql
  • dbms/rdbms
cjh 댓글 1 좋아요 1 조회수 496

엔티티 매니저 프록시 역할

미해결

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

안녕하세요! 질문 좀 드리려고 합니다 엔티티 매니저 프록시는 프록시를 싱글톤으로 주입해서 동시성 문제를 해결하고 실제 엔티티 매니저 인스턴스를 ThreadLocal로 관리하는 역할 정도로 생각해도 괜찮을까요? 추가적으로 실제 엔티티 매니저는 @Transactional을 사용하면 JpaTransactionManager에서 생성이 되는데 @Transactional을 사용하지 않으면 처음 엔티티 매니저를 사용할 때 생성이 되나요?

  • java
  • jpa
code-tree 댓글 1 좋아요 0 조회수 441

1012 - 반례를 모르겠습니다. JAVA

미해결

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

안녕하세요. 큰돌님 강의 잘 보고있습니다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { static int[][] board; static boolean[][] visited; static int[] dy = {-1, 0, 1, 0}; static int[] dx = {0, 1, 0, -1}; static int yLen; static int xLen; static int cnt; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); while (n-- > 0) { int[] given = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); if (given[2] == 1) { sb.append(1).append(System.lineSeparator()); continue; } board = new int[given[0]][given[1]]; visited = new boolean[given[0]][given[1]]; yLen = given[0]; xLen = given[1]; for (int i = 0; i < given[2]; i++) { String[] numStr = br.readLine().split(" "); int y = Integer.parseInt(numStr[0]); int x = Integer.parseInt(numStr[1]); board[y][x] = 1; } for (int i = 0; i < yLen; i++) { for (int j = 0; j < xLen; j++) { if (!visited[i][j] && board[i][j] == 1) { dfs(i, j); cnt++; } } } sb.append(cnt).append(System.lineSeparator()); } System.out.print(sb.substring(0, sb.length() - 1)); } public static void dfs(int y, int x) { visited[y][x] = true; for (int i = 0; i < 4; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || ny >= yLen || nx < 0 || nx >= xLen) continue; if (visited[ny][nx] || board[ny][nx] == 0) continue; dfs(ny, nx); } } } 위 코드를 실행하면 12%, ArrayIndexOutOfBounds가 발생하는데 어떤 부분인지 알 수 있을까요?

  • c++
  • 코딩-테스트
  • java
최찬호 댓글 2 좋아요 0 조회수 322

인기 태그

인프런 TOP Writers

주간 인기글