inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

MemberServiceTest 이게 왜 틀리죠?

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; //@ExtendWith(SpringExtension.class) //@SpringBootTest에 이미 정의됨.(중복) @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입()throws Exception{ //given Member member=new Member(); member.setUsername("kim"); //when Long savedId = memberService.join(member); //then Assertions.assertThat(member).isEqualTo(memberRepository.findOne(savedId)); } } junit 5 버전이라 이렇게 고쳤는데도 테스트에 실패합니다. setUsername은 구버전 MemberRepository에서 오류가 나서 Member의 name을 username으로 바꿨습니다. test/resources/application.yml에 spring: logging.level: org.hibernate.SQL:debug 이것도 넣어줬는데 안됩니다

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
윤건희 댓글 1 좋아요 0 조회수 449

구조 분해 할당에서 변수가 더 많이 존재하는 상황은 어떤 경우인가요??

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

2.3) 구조분해할당 강의의 배열의 구조 분해 할당과 객체의 구조 분해 할당 모두 아래 코드의 four와 extra와 같이 추가적으로 존재하지 않는 변수를 만드셨는데요. 이렇게 할당 받을 값보다 할당 받을 변수가 더 많은 경우가 실제로도 사용이 되나요?? 사용이 된다면 어떤 목적으로 사용이 되나요? let arr = [1, 2, 3]; let [one, two, three] = arr; let person = { name: "이름", age: 24, }; let { name, age, extra, } = person;

  • javascript
  • react
  • node.js
황서영 댓글 1 좋아요 0 조회수 174

교재 크로스벨리데이션, 하이퍼파라미터 관련 질문

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

1. 교재 작업2 다중분류 약물종류 예측에서 크로스벨리데이션으로 평가하는 방법이 나와있는데 제가 이해한게 맞는지 질문드립니다. from sklearn.metrics import f1_score from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(random_state = 0) f1 = cross_val_score(model ,train, target ,cv=3 , scoring="f1_macro") 마지막 한줄에서 cross_val_score가 train , target을 3(cv=3)덩어리로 나눈 후 각 덩어리?를 model을 통해 학습한 후 나머지 데이터로 평가하여 f1_macro로 각각의 평가지표가 계산되는것이고, 이후 앞으로 돌아가 전처리 등을 통해서 평가지표를 향상할 수 있도록 해본 후에 최종 제출하기 전에 마지막에 model.fit(train,target)을 통해서 전체 train, test로 다시 학습을 시킨 후 제출을 하는 과정이 맞을까요? 이 문제에서 총 train 데이터가 100개라 그런지 f1이 1이 나오길래 검증 데이터수가 너무 적어서 점수가 높게 나왔다고 생각하여 test_size를 0.3로 변경하고 진행을 하였습니다. 이런식으로 하는 방법은 train 데이터 수가 작아지기 때문에 옳은 방법이 아닌걸까요? 3. 하이퍼파라미터 max_depth , n_estimators 등은 lightgbm, 랜포에서 동일하게 사용하는걸까요? lightgbm에 대한 하이퍼파라미터 튜닝은 다루지 않은것 같아서요(아직 기출 강의는 듣지 않아서 강의에서 다뤘을지도 모르겠습니다..) 1)튜닝을 하는 경우에는 데이터셋에 과적합 우려가 있기 때문에 cross_val_score을 사용하는것이 나아보이기도 하고, 2)튜닝값이 분할된 각 데이터셋에 적용되는 것이므로 , 마지막에 전체 데이터로 다시 학습시키는 과정에서 동일한 튜닝값이 적용되면 더 안좋아질 수도 있을 것 같은데 1) 2) 중 어느것이 옳은 생각일까요? train_test_split을 이용하는 경우 전처리 + X_tr, y_tr을 통해 학습한 모델로 검증한 후 마지막에 전체 train, target으로 다시 학습시키는게 더 좋을 것 같은데(데이터 양의 증가), 튜닝을 한 경우에는 X_tr, y_tr로 학습한 모델로 제출을 하는 것이 옳을까요? train_test_split을 했을때 하이퍼 파라미터 튜닝으로 f1이 0.61 ->0.65로 올라갔으나, cross_val_score에서 같은 튜닝값을 적용하니 f1이 0.71 -> 0.69으로 내려갔습니다. 이런 경우 튜닝전후 어떤 값으로 제출하는게 좋을까요? 시험이 며칠 안남기는 했지만 cross_val_score을 익숙하게 쓸 수 있으면 시험에서도 train_test_split 대신 cross_val_score을 사용하는게 좋을까요? 아니면 train_test_split으로만 검증해도 상관없을까요 질문이 많아서 죄송합니다. 감사합니다.

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
위잉 댓글 2 좋아요 0 조회수 122

2회 기출 작업형2 결과값

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 아직 강의 보기전 혼자 풀어보았을때 결과가 이런식으로 다르게 나온다면 코드에서 잘못된 부분이 있는거겠죠ㅠㅠ? 검증데이터로는 roc_auc_score 0.75 나옵니다 (오류없이 실행은 되는데 결과 확률이 다르게 나옵니다ㅠ)

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
토리 댓글 2 좋아요 0 조회수 102

post가 안되요

미해결

[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발

"Required request body is missing: public kr.co .joneconsulting.myrestfulservice.bean.User kr.co .joneconsulting.myrestfulservice.controller.UserController.createUser( kr.co .joneconsulting.myrestfulservice.bean.User)", 이런 에러가 뜨네요 @PostMapping("/users") public User createUser(@RequestBody User user) { return service.save(user); }

  • rest-api
  • spring-boot
kimoon Hong 댓글 1 좋아요 0 조회수 142

regionList 클릭시 해당 cities가 안나옵니다.

해결됨

한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지

혼자서 찾아보려고 했는데 도저히 모르겠네요 ㅜ 오류메세지는 나오는건 없고 제목과 같습니다. region을 선택하면 해당 cities가 나와야하는데 안나와요 ㅜ import Header from "./components/Header.js"; import RegionList from "./components/RegionList.js"; import CityDetail from "./components/CityDetail.js"; import CityList from "./components/CityList.js"; import { request } from "./components/api.js"; export default function App($app){ const getSortBy = () => { if (window.location.search){ return window.location.search.split('sort=')[1].split('&')[0]; } return 'total'; }; const getsearchWord = () => { if(window.location.search && window.location.search.includes('search=')){ return window.location.search.split('search=')[1] } //뒤에 있는 값을 반환 return ''; }; this.state={ startIdx : 0, sortBy : getSortBy(), region: '', searchWord: getsearchWord(), cities:'', }; const header = new Header({ $app, initialState:{ sortBy:this.state.sortBy, searchWord:this.state.searchWord }, handleSortChange: async(sortBy) => { const pageUrl = `/${this.state.region}?sort=${sortBy}`; history.pushState( null, null, this.state.searchWord ? pageUrl + `&search=${this.state.searchWord}` : pageUrl ); //변경된 정렬기준을 적용한 새로운 데이터를 불러옴 (매개변수로 전달받은 새로운 정렬기준인 sortBy 값을 넣어야함) const cities = await request(0, this.state.region, sortBy, this.state.searchWord); // 변경된 상태값을 업데이트 this.setState({ ...this.state, startIdx:0, sortBy: sortBy, cities: cities, }); }, handleSearch: async(searchWord) => { //웹사이트 주소를 알맞게 변경 history.pushState( null, null, `/${this.state.region}?sort=${this.state.sortBy}&search=${searchWord}` ); const cities = await request(0, this.state.region, this.state.sortBy, searchWord); this.setState({ ...this.state, startIdx:0, searchWord: searchWord, cities: cities }) }, }); const regionList = new RegionList({ $app, initialState:this.state.region, handleRegion: async(region) => { history.pushState(null, null, `/${region}?sort=total`); const cities = await request(0, region, 'total'); console.log("cities",cities) this.setState({ ...this.state, startIdx: 0, region: region, sortBy: 'total', cities: cities, searchWord: '', }); }, }); const cityList = new CityList({ $app, initialState:this.state.cities, // 아래는 더보기 버튼을 눌렀을 때 실행되는 것 handleLoadMore: async() => { const newStartIdx = this.state.startIdx + 40; const newCities = await request(newStartIdx, this.state.region, this.state.sortBy, this.state.searchWord); this.setState({ ...this.state, startIdx : newStartIdx, cities:{ cities:[...this.state.cities.cities, ...newCities.cities], isEnd: newCities.isEnd, } }) } }); const cityDetail = new CityDetail(); this.setState = (newState) => { this.state = newState; cityList.setState(this.state.cities); header.setState({sortBy:this.state.sortBy, searchWord:this.state.searchWord}); regionList.setState(this.state.region); }; const init = async() => { const cities = await request(this.state.startIdx, this.state.sortBy, this.state.region, this.state.searchWord); this.setState({ ...this.state, cities: cities, //api 호출의 결과인 cities }); }; init(); } export default function RegionList({$app, initialState, handleRegion}){ this.state = initialState; this.$target = document.createElement('div'); this.$target.className = 'region-list'; this.handleRegion = handleRegion; $app.appendChild(this.$target); this.template = () => { const regionList = [ '🚀 All', '🌏 Asia', '🕌 Middle-East', '🇪🇺 Europe', '💃 Latin-America', '🐘 Africa', '🏈 North-America', '🏄 Oceania', ]; let temp = ``; regionList.forEach((elm) => { let regionId = elm.split(' ')[1]; temp += `<div id=${regionId}>${elm}</div>`; }); return temp; }; this.render = () => { this.$target.innerHTML = this.template(); let $currentRegion; if(this.state){ $currentRegion = document.getElementById(this.state); $currentRegion && ($currentRegion.className = 'clicked'); } else { document.getElementById('All').className = 'clicked'; } const $regionList = this.$target.querySelectorAll('div'); $regionList.forEach((elm) => { elm.addEventListener('click', () => { this.handleRegion(elm.id); }); }); }; this.setState = (newState) => { this.state = newState; this.render(); }; this.render(); }

  • javascript
  • rest-api
  • spa
  • dom
최유진 댓글 1 좋아요 0 조회수 252

웹 주소로 데이터를 끌어오면 설명과 다르게 나옵니다

미해결

진짜 현업에서 쓰이는 직장인의 실무 엑셀 - 데이터 가공부터 분석까지

안녕하세요 2강에서 네이버증권(강의에서 나오는 것과는 이름은 바뀌었더군요) 주소를 가져와서 웹 주소를 입력하면 아래와 같이 부정확한 데이터로 끌어와지는데 어떤 차이가 있는 것일까요?

  • excel
  • ms-office
jb_eom 댓글 3 좋아요 1 조회수 286

작업형 2

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 # F1 스코어(F1 Score) *** 숫자 문자 차이 없음 from sklearn.metrics import f1_score f1 = f1_score(y_true, y_pred, average='macro') # average= micro, macro, weighted print("F1 스코어:", f1) f1 = f1_score(y_true_str, y_pred_str, average='macro') print("F1 스코어:", f1) *RMSE(Root Mean Squared Error) *** from sklearn.metrics import mean_squared_error mse = mean_squared_error(y_true, y_pred) rmse = mse ** 0.5 print("RMSE:", rmse) F1 스코어 : f1 = f1_score(y_true, y_pred, average='macro' 여기서 y_true RMSE: mse = mean_squared_error(y_true, y_pred) 여기서 y_true 두 y_ture 모두 y_val 값을 말하는게 맞나요??

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
댓글 2 좋아요 0 조회수 104

연관관계 매핑 기초에서

미해결

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

단방향 매핑만으로도 충분하고 필요할떄 양방향으로 설계하라고하셨는데 단방향 매핑만하고 JPQL로 역방향으로 조회가 가능하다는 말씀이신가요? 제가 이해한건 양방향으로 굳이 안하고 단방향으로 설계했을때 JPQL을 사용해서 역방향으로 조회가 가능하다?이말씀이신가요?

  • java
  • jpa
임다정 댓글 1 좋아요 0 조회수 57

검증데이터셋으로 훈련 및 검증 후 다시 훈련(fit) 여부

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

안녕하세요, 6회 기출 유형 작업형2 풀이에서 마지막에 최종 제출 파일에서 rf.fit(train, target)으로 다시 훈련한 후에 pred = rf.predict(test)로 예측을 하시더라구요, 저는 기존의 강의에서 from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(random_state=2013) rf.fit(X_tr, y_tr) pred = rf.predict(X_val) 이렇게 검증데이터 셋으로 훈련 후에 바로 pred = rf.predict(test)로 예측을 했었거든요, 최종 파일 제출할 때는 rf.fit(train, target)으로 다시 훈련한 후에 pred = rf.predict(test) 예측을해야하는 것일까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
reverq 댓글 2 좋아요 0 조회수 101

기출 7 작업형 1 관련 문의입니다.

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

ValueError : Length of values (1) does not match length of index (33)와 같은 오류가 뜨는 이유를 잘 모르겠습니다. 실행한 코드입니다. import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/refs/heads/main/p4/7_1/student_assessment.csv") df = df.dropna() df['id_assessment'].value_counts() print(df.head(10)) con = df['id_assessment'] == 12 df = df[con] from sklearn.preprocessing import StandardScaler ss = StandardScaler() df['score'] = ss.fit_transform([df['score']])

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
jinhakeun 댓글 2 좋아요 0 조회수 74

@Value 관련 환경변수 주입 테스트코드 질문..

미해결

Practical Testing: 실용적인 테스트 가이드

@ActiveProfiles("test") @SpringBootTest class CategoryServiceTest { @Autowired private CategoryService categoryService; @DisplayName("카테고리 목록들을 조회한다.") @Test void getAllCategories() { System.out.println("222222222222222222"); } } @Service @RequiredArgsConstructor public class KakaoApiService { @Value("${social.kakao.apikey}") private String kakaoApiKey; @Value("${social.kakao.redirect_uri}") private String kakaoRedirectUri; } 위와 같이 코드가 있을때 테스트 코드를 실행시키면 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kakaoApiService': Injection of autowired dependencies failed 다음과 같은 에러가 발생하는데,, @SpringBootTest를 돌릴때 환경변수 주입을 못받아서 실패하는것 같은데 이럴 경우 어떻게 테스트를 진행해야할까요 ?? 전혀 관련 없는 서비스인데 에러가 터져서 진행이 안됩니다 ㅜㅜ.. ```yml spring: profiles: default: local social: kakao: apikey: ${KAKAO_API_KEY} redirect_uri: ${KAKAO_REDIRECT_URI} jwt: secret: ${JWT_SECRET} access_expiration_time: 36000000 --- # 테스트 환경 spring: config: activate: on-profile: test h2: console: enabled: true datasource: url: jdbc:h2:mem:~/ChallengeApplication driver-class-name: org.h2.Driver username: sa password: jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true yml은 전체는 아니지만 이렇게 구성되어 있습니다. 환경 변수주입은 ChallengeApplication에 다 넣어놨는데, 이게 테스트코드를 돌릴시에는 ChallengeApplication가 도는게 아니라 Junit 하위에 있는게 돌아서 환경변수 주입이 안된게 돌아서 실행이 안되더라구요 .. 보통 어떤식으로 하시나요 ? ㅠㅠ

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
돈벌고싶다 댓글 2 좋아요 0 조회수 282

test 데이터 예측 결과에서 한 값만 튀는데 이럴 수 있는건가요?

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

3-5 마지막 문제 중 평가 데이터로 예측하는 부분에서 이런 결과가 나왔습니다. 어떤 부분을 놓쳤는지 모르겠지만 강사님의 예측 결과랑 완전 똑같진 않아요. 그래도 첫번째 자리수까지는 똑같은데요.. 문제는 id가 4213인 값이 혼자 튀는데 이런 경우도 있을 수 있나요? 아니면 제가 뭘 잘못한건가요? 정확도 평가는 88% 나왔습니다.

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
은영조 댓글 2 좋아요 0 조회수 103

섹션 4(SaveData, HeroList, ItemData, ItemHolder)에 일부 항목들에 대한 재생오류 해결 부탁드립니다.

미해결

[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)

섹션 4 Project M1 - 성장 컨텐츠 제작(재화, 성장, 아이템, 퀘스트, ...) 에속한 SaveData, HeroList, ItemData, ItemHolder 이쯤부터 전부 재생이 안됩니다. 꽤 종종 이런 재생 오류 문제가 발생합니다. 한주에만 이런문제를 겪은게 3회정도 된거같습니다. 다음날 재생하면 또 되는경우가 존재하고, 너무 불편합니다. 인프런 운영사분들 제발 쾌적한 재생환경을 부탁드려요 .. 강의듣는 와중에, 흐름이 끊길때마다 너무 불편합니다... 강의는 잘듣고 있습니다..

  • C#
  • unity
  • MMORPG
woooooklkllo__ 댓글 1 좋아요 0 조회수 191

RestAuthenticationToken의미 token의 의미

미해결

스프링 시큐리티 완전 정복 [6.x 개정판]

RestAuthenticaionToken 클래스를 만든 의미가 궁금하고 여기 시큐리티에서 token의 의미가 무엇인지 궁금합니다

  • spring
  • spring-boot
  • spring-security
  • security
  • web-security
dkslasdud 댓글 1 좋아요 0 조회수 121

독립표본검정에서요

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

두 집단의 분산이 같은지 다른지 여부를 모를때 shapiro 검정을 통해 정규성 만족 여부 확인 1-1) 정규성을 만족한다면 levene 검정을 통해 등분산 검정을 한다. 등분산 검정 시 0.05보다 크다면 귀무가설 채택(등분산이다) 0.05보 다 작으면 대립가설 채택(등분산이 아니다) 1-2) ttest_ind 진행 stats.ttest_ind(a,b,equal_var = True) <- 레빈검정 귀무채택시 stats.ttest_ind(a,b,equal_var = False) <- 레빈검정 귀무기각 시 정규성을 만족하지 않는다면 stats.manwhitneyu(a,b,alternative = 'less') 진행 문의내용 위 순서로 진행하는게 맞는건지 문의드리며 만 휘트니 검정할때는 만 휘트니 검정 자체가 정규성 불만족할때의 ttest와 같다고 생각하면 되는건지 문의드립니다.

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김치현 댓글 2 좋아요 0 조회수 164

작업형2 - 8회 오류

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-32-9c792161035b> in <cell line: 2>() 1 # 최종 제출 파일 ----> 2 pred = rf.predict(test) 3 result = pd.DataFrame({'pred':pred}) 4 result.to_csv('result.csv', index=False) 3 frames /usr/local/lib/python3.10/dist-packages/sklearn/base.py in _check_feature_names(self, X, reset) 533 ) 534 --> 535 raise ValueError(message) 536 537 def _validate_data( ValueError: The feature names should match those that were passed during fit. Feature names unseen at fit time: - customerID_CUST0001 - customerID_CUST0002 - customerID_CUST0006 - customerID_CUST0007 - customerID_CUST0008 - ... Feature names seen at fit time, yet now missing: - customerID_CUST0000 - customerID_CUST0003 - customerID_CUST0004 - customerID_CUST0005 - customerID_CUST0009 작업형 2 한가지 방법으로 풀어보기를 그대로 해서 8회를 풀엇는데, 이런 에러가 뜹니다. id 값을 없애는 작업을 해줘야할까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
shs4166 댓글 2 좋아요 0 조회수 116

등분산이 같은지 다른지를 만약 모른다면,

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

문제에서 만약 안주어진다면, 레빈 검정을 우선 진행해서 pvalue값을 확인 해야하는거겠쬬?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김치현 댓글 2 좋아요 0 조회수 224

데이터 찾기

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

테스트 데이터와 train 데이터 프레임 안의 데이터가 서로 포함하지 못한다면, concat을 사용하여 합쳐서 label이나 one hot 인코딩 진행하라고 하셨는데요, 지금은 내부 데이터 양이 작아서 각 데이터 별로 서로 포함여부를 알 수 있는데 몇천 row가 되는 data들은 서로 포함되는지 어떻게 알 수 있을까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김치현 댓글 2 좋아요 0 조회수 92

RMSE 질문

미해결

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

안녕하세요 강사님~ RMSE 출력 할 때, from sklearn.metrics import mean_squared_error 많이 사용하지만, 이번에 확인 해보니까 from sklearn.metrics import root_mean_squared_error 가 있어서 사용 가능 할까요? 시험 체험에서도 dir()를 확인 한 결과 metrics 에 root_mean_squared_error 가 있는 걸 확인 했습니다. 감사합니다~

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
cjy3676 댓글 2 좋아요 0 조회수 187

인기 태그

인프런 TOP Writers

주간 인기글