티스토리

@Override
검색하기

블로그 홈

@Override

mrgamza.tistory.com/m

Bohemian Software Engineer

구독자
8
방명록 방문하기

주요 글 목록

  • iOS closure를 async, await 으로 변경하는 xcode 13.2 Beat에 iOS13 이상부터 Swift concurrency (async, await) 기능을 사용가능합니다. 완전히 좋은 기능입니다. 행복하죠. 콜백지옥에서 벗어날수 있습니다. 그럼 바로 변경하는 방법으로 넘어가겠습니다. withCheckedThrowingContinuation, withCheckedContinuation 를 이용하는 방법입니다. 다음과 같은 closure를 사용하는 곳이 있었다고 합시다. func testFunction(number: Int, handler: (Int) -> Void) { let sum = number + 1 handler(sum) } testFunction(number: 1) { value in print(value) } 결과는 2가 나옵니다. .. 공감수 2 댓글수 0 2023. 6. 7.
  • JavaScript. 가장 짧은 TETRIS 소스 와 굉장하네요. 대단합... 제가 만든건 아닙니다. ㅎㅎ 이걸로 됩니다. 엔터로 회전이 되고 화살표로 동작합니다. 재밌네요. html 파일도 첨부할게요. 문제되려나? 공감수 0 댓글수 0 2023. 5. 5.
  • slack channel에 chat 남기기. with python code 최근 회사에서 많이 사용하는 slack으로 어떠한 동작을 하게 나면 slack에 chat을 남기도록 할 수 있도록 하고 있지요. 일반적인 회사에서는 벌써 기능이 구현되어 있기는 하겠지만. 우리는 일단 만들어 보는걸로 하겠습니다. 유용합니다. ㅎㅎ 그럼 시작해볼게요. slack의 channel에 chat을 남기는걸 해보겠습니다. 처음 해보시는 분들은 조금 어려울수 있는데요. 쉽게 따라 할 수 있고. 이걸로 새로운걸 여러가지 만들수 있을거에요. 저는 SNKR 알리미 같은걸 이걸로 만들었었습니다. 이메일로도 전송했고요. 자... 그럼 일단 slack에서 설정부터 해야합니다. 앱부터 만들어 볼게요 https://api.slack.com/apps Slack API: Applications | Slack Your .. 공감수 0 댓글수 0 2023. 4. 29.
  • Apple Developer. 조치 필요: Distribution 인증서가 30일 후에 만료됨 애플에서 Distribution 인증서가 30일 후에 만료된다고 이메일이 왔네요. 그런데 뭐 걱정할건 없습니다. 기존 인증서가 없어진다고 해서 나중에 배포하는데 문제가 되지는 않거든요 ㅎ 1. Apple Developer에서 기존 인증서중에 Distribution 을 골라줍니다. 2. 선택하고 나서 보면 Revoke 가 보일거에요. 해줍니다. 괜찮습니다. 마구 지워도 다시 만들면 되니까요. 3. Xcode를 열어서 상단의 메뉴에서 Settings를 선택 4. Accounts / 아이디에서 / Team은 Admin으로 선택하고 Manage Certificates... 를 선택 5. Apple Distribution을 다시 만들어 줍니다. 공감수 0 댓글수 0 2023. 2. 27.
  • Swift. Snake -> Camel, Camel -> Snake 최근 Clojure 를 다루면서 function name 을 -> 이것을 넣어서 만들수 있었는데 조금 아쉽긴하네요. snake->camel 이런 이름으로 만드는건 좀 가독성이 좋은뎁 ㅎㅎ 암튼 다음과 같이 만들어 봤어요. struct Coding { func snakeToCamel(from input: String) -> String { if input.isEmpty { return "" } let split = input .split(separator: "_") .enumerated() .map { $0.0 == 0 ? $0.1.lowercased() : $0.1.capitalized } return split.joined() } func camelToSnake(from input: String) ->.. 공감수 0 댓글수 0 2023. 2. 18.
  • iOS - Swift. SwiftUI. @Environment @Environment? 뷰에서 EnvironmentValues의 특정 요소를 읽어와 뷰 구성에 반영할 때에 사용하는 요소라고 합니다. 이것 또한 Injection 관련된 부분으로 보이는데, 좋은건 다 가지고 와주길 바랍니다. 누구는 그냥 자동으로 다 되니깐 싫다고 하겠지만 타이핑을 조금 하게 되는건 정말 행복한겁니다. 자... 그럼 일단 우리가 프로젝트를 하나 만들때에 CoreData, SwiftUI를 포함해서 만든다고 합시다. XYZApp 파일을 보면 다음과 같은 부분이 있어요. App file 이라고 하면 다들 아시겠죠? ㅎㅎㅎ var body: some Scene { WindowGroup { ContentView() .environment(\.managedObjectContext, persiste.. 공감수 1 댓글수 0 2023. 2. 7.
  • iOS - Swift. Property Wrappers 나온지 한참되었지만 다시 한번 정리하는 마음으로 적어봅니다. 처음에는 이것 접했을때 그러한 생각이 들었네요. 많이 보던건데? 백엔드에서 잘 사용하는 스프링 프레임워크에서 사용하는 어노테이션이랑 같은 부분이죠. 무언가를 주입하여 주기 위해서 사용하는! 그런데 프로퍼티 래퍼도 같은 의미라고 보면 됩니다. A란변수에 이걸 적용해 달라고 하는것과 같습니다. 다음과 같이 사용 할 수 있습니다. @propertyWrapper struct TestPropertyWrapper { private var height = 0.0 var wrappedValue: Double { get { height } set { height = (newValue - 100) * 0.7 } } } struct TestStruct { @Tes.. 공감수 0 댓글수 0 2023. 2. 6.
  • MySQL - Docker로 띄우기 자신의 컴퓨터에 그냥 MySQL을 띄우고 사용해도 되지만 도커를 이용해서 띄우는게 깔끔하고 나중에 사용하다가 버전업을 할때에도 용의합니다. 그럼 MySQL을 Docker를 이용해서 사용하는 방법을 알아볼게요. 1. Docker 설치 이 부분은 많은 Docker 설치 관련된 문서가 있으니 찾아보시면 좋을거 같아요. 따로 설명하지는 않겠고 Mac을 이용하면 다음의 다운로드를 이용하면 되겠습니다. https://www.docker.com/products/docker-desktop/ Docker Desktop - Docker Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started.. 공감수 0 댓글수 0 2022. 12. 10.
  • SpringBoot - MySQL 연결하도록 설정하고 난 이후에 프로젝트 실행시 에러 발생한다면? MySQL을 프로젝트에 연결하고 프로젝트 실행을 했는데 다음과 같은 에러가 발생하게 된다면? 저는 다음과 같은 에러를 만났습니다. caused by: org.springframework.beans.factory.beancreationexception: error creating bean with name 'datasource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/datasourceconfiguration$hikari.class]: bean instantiation via factory method failed; nested exception is org.springframework.beans.beanins.. 공감수 0 댓글수 0 2022. 12. 9.
  • MySQL 완전히 삭제하고 재설치 - Mac 윈도우용 삭제는 아닙니다. 맥에서 삭제하는 방법입니다. 또한 brew를 이용해서 설치하고 삭제하는 방법이에요. MySQL 프로세스 죽이기 brew services stop mysql 관련 파일들 삭제하기 brew uninstall --force mysql 다음을 한줄씩 수행합니다. sudo rm -rf /usr/local/mysql sudo rm -rf /usr/local/bin/mysql sudo rm -rf /usr/local/var/mysql sudo rm -rf /usr/local/Cellar/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /tmp/mysql.sock.lock sudo rm -rf /tmp/mysqlx.sock.lock sudo rm -rf .. 공감수 0 댓글수 0 2022. 12. 9.
  • 파일 끝에 개행을 추가해야 하는 이유 파일 마지막에는 개행을 추가해야하는 것을 추천합니다. 왜 이런 것을 추천하게 되어 있을까요? 결론부터 이야기 하면 POSIX 명세에 내용이 들어가 있습니다. POSIX - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. ko.wikipedia.org 쉽게 이야기 하자면 다음과 같은 내용들이 들어가 있어요. Definitions - 3.392 Text File : A file that contains characters organized into one or more lines. The lines do not contain NUL characters and none can exceed {LINE_MAX} bytes in length, including the Although IEEE St.. 공감수 0 댓글수 0 2022. 12. 8.
  • [Postman] Pre-Request Script 사용하기 Postman을 자주 사용하게 되면서 사용하게 되는 기능입니다. 우리가 개발을 할때에 access_token 기반의 로그인 서비스들의 경우에는 token이 만료되는 시점 때문에 지속적으로 로그인 관련 API를 호출하여 주어야 하는데 굉장히 불편하죠. Pre-Request Script를 사용하면 됩니다. 다음과 같이 script 코드를 작성하면 되는데요. Postman이 지원하는 펑션들이 존재하기도 하기 때문에 사용이 편합니다. pm.sendRequest({ url: 'https://your-url/auth', method: 'POST', header: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' },.. 공감수 0 댓글수 1 2022. 12. 1.
  • Python - requirements.txt 패키지 관리 python으로 프로젝트를 개발하면 pip로 여러가지 패키지를 설치하여서 사용합니다. 이런 내용들을 하나씩 README 등에 넣어서 하나씩 설치하게 해도 되지만 굉장히 불편하게 만듭니다. 그래서 pip로 설치한 파일들을 하나로 관리하는게 좋은데요 그때 사용되는것이 requirements.txt 파일입니다. requirements.txt 파일이 생성되어 있지 않다면 다음과 같이 생성이 가능합니다. $ pip freeze > requirements.txt pip list 명령을 통해서 리스트도 가져올 수 있습니다. $ pip list Package Version ----------------------------- ----------- 기타등등 이렇게 들어가 있는 내용들은 다른 환경에서 다음과 같이 한번에 .. 공감수 0 댓글수 0 2022. 10. 2.
  • Nodejs + MySQL 8.0 ER_NOT_SUPPORTED_AUTH_MODE Nodejs를 이용해서 MySQL을 연동하였습니다. 다음과 같은 에러가 발생하였고 에러 내용은 다음과 같았죠. code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client. 에러의 원인은 만들어준 프로그램에서 MySQL의 패스워드 플러그인인 caching_sha2_password를 사용하지 못하기 때문입니다. 그래서 제가 선택한 방법은 플러그인을 변경하여 주는겁니다. mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_pass.. 공감수 0 댓글수 0 2022. 5. 15.
  • Android11 이상부터? 무선 디버깅으로 Adb 연결하고 명령하기 iOS에서도 무선으로 연결하는 기능이 존재했는데, Android11부터 이게 된다고 하네요. 그래서 개발자 모드를 켜고 해보니 정말 되더라고요. 이제는 케이블 없이 개발을 할 수 있는 세상인가 싶기도 하지만 있어야 겠죠. 문제는 케이블 없이 하는것보다 만들어진 빌드를 실행하는데 속도가 조금 느리다고 생각이 드는 ㅎㅎ 아래의 내용들은 SDK 도구나 기타 등등을 최신으로 해뒀다는 가정으로 이야기 합니다. 일단 폰의 개발자 옵션에 보면 다음과 같은 부분들이 생긴걸 보게 됩니다. Wireless debugging. 이걸 On 하여 주면, Allow 할것이냐고 나오게 됩니다. 당연스럽게 Allow 합니다. 그 상태에서 Switch 가 아니라 전체 열을 클릭하면 들어가는 부분이 있는데요. 그곳에서 Pair devi.. 공감수 1 댓글수 2 2022. 1. 8.
  • React native. Could not get BatchedBridge, make sure your bundle is packaged correctly 어쩌다보니 이런걸 하게 되었는데 정말 RN은 머하다보면 잘 안되고 막히고... 정말 답답합니다. 언능 네이티브로 전환해야지... 가끔 하다보면 제목과 같은 에러가 노출됩니다. 답답하죠. 이유는 metro의 cache가 이전에 쓰던 버전과 꼬여서 문제가 생기는 건데요. 다음과 같이 실행하여 줍니다. $ react-native start --reset-cache 퇴근합시다. 정말 백엔드만 하고 싶네요. 공감수 0 댓글수 0 2021. 12. 9.
  • direnv. 디렉토리 별로 개발환경 구축하기. feat Python, Node... 하나의 서비스를 하는 회사에서도 실제적으로는 많은 프로젝트들을 동시에 진행하기도 합니다. 이럴때에 각 서비스들의 version 등과 같은 환경을 다 동일하게 맞추면 좋지만 버전 업데이트를 위해서는 많은 시간을 들여야 할수도 있습니다. 그래서 프로젝트 별로 조금 다른 버전을 사용하여서 개발할수도 있습니다. 이러한 문제점을 없애기 위해서 direnv를 이용할 수 있습니다. 동작원리는 사용자가 지금 사용하고 있는 디렉토리의 .envrc 파일을 생성하고 읽어 들이면서 필요한 설정들을 불러오는 방식입니다. 그리고 해당 디렉토리에서 벗어나면 당연스럽게도 해제를 해주어서 여러가지 환경에서 개발하기에 좋도록 만들어줍니다. 맥에서 받고 싶으면 다음과 같이 합니다. 물론 brew는 설치가 되어 있어야 합니다. $ brew.. 공감수 0 댓글수 0 2021. 12. 6.
  • You are using safe update mode WorkBench에서 대량으로 업데이트를 할 일이 생겼는데, 명령을 했더니 다음과 비슷한 에러가 발생합니다. Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 원인은 키값을 이용하여서 하나 정도의 범위의 값들을 update나 delete 하여야 하는데, 한꺼번에 많은것을 하기 때문입니다. 네 제가 그랬습니다. ㅎㅎ 해결방법을 두가지 정도 알려 드립니다. 첫번째 set sql_safe_update.. 공감수 0 댓글수 0 2021. 11. 23.
  • git 터미널에서 한글 출력되는것 없애기 git을 받고 나서 터미널에서 git 명령어를 쳤더니 한글로 나온다... 뭐 한글이 편한 사람도 있겠지만 오랜기간동안 용어자체를 영어로 봐온 사람에게는 좋지 않아보이고. 특히나 개발자들의 세상에서는 거의 다 영어로 되는 부분들을 왜 이렇게 한글로 해놓는지 이해도 안되는... 뭐 그럼 방법을 이야기 드리겠습니다. $ echo $LANG 위와 같이 타이핑하고 나면 어떤 글자가 나오는지 봐야합니다. en_US로 나오면 난감하지만 저와 같은 분들은 아무것도 안나올겁니다. 그럼 zsh 기준으로 영어로 설정하는 방법을 알려드립니다. $ vi ~/.zshrc 내부에 이렇게 넣어줍니다. export LANG=en_US 그리고 저장하고 나와서. 다음을 해줍니다. $ source ~/.zshrc 그리고 나서 git 관련 .. 공감수 0 댓글수 0 2021. 11. 12.
  • SSH Key 생성하여 여러개 사용하기 github같은것을 이용하기 위해서 ssh key를 이용하여서 사용하는 경우가 있을겁니다. 아래의 순서대로 사용하면 됩니다. Local에 ssh key 생성하기 일단 .ssh 폴더로 이동하도록 합니다. 개인 계정의 루트에서 ssh로 이동합시다. $ cd ~/.ssh ls 명령을 통해서 기존에 사용하던 key가 있는지 확인 해봅니다. 잘 사용하던 key가 안될수가 있으니까요 id_rsa.pub is_rsa 이런 파일들이 보인다면 기존에 만들어둔것입니다. .pub는 공개 키, 없는것은 개인 키입니다. 키를 만들어 보려고 합니다. ssh-keygen을 이용하여서 만들어야 합니다. $ ssh-keygen -t rsa -b 4096 -C "your-email" 이 명령을 하게 되면 다음과 같이 나오게 됩니다. G.. 공감수 0 댓글수 0 2021. 6. 6.
  • iOS. UICollectionView로 Header만들고 Stretch 동작하도록 만들기 오랜만에 iOS 글을 적는거 같네요. 오늘 올려볼 글은 CollectionView를 이용해서 Header를 만들고 Stretch 동작하도록 할거에요. 뮤직 어플등에서 상단에 View를 Stretch 하는 것이에요. 이미지를 보여주는게 더 나을것 같아요. 사진은 이쁜 지수. Storyboard는 최근 사용하지 않아서 코드로 만들어진 부분들을 넣었습니다. 기본 CollectionView 만들기 ViewController에 다음과 같이 만들어 봅시다. final class ViewController: UIViewController { private let headerReusableId = "HeaderReusableView" private let cellReusableId = "CollectionViewCel.. 공감수 1 댓글수 0 2021. 5. 16.
  • AWS Lambda로 Hello, Lambda! 를 만들어 봅시다. Lambda는 AWS에서 제공하는 FaaS 서비스입니다. Google Cloud Functions, Azure Functions 같은것들이 있습니다. 이중에 AWS가 가장 많이 사용되고 있습니다. 제일 많이 사용하는 부분을 일단 사용해보려 합니다. 다음에 접속해서 Lambda를 새로 생성합니다. ap-northeast-2.console.aws.amazon.com/lambda/home?region=ap-northeast-2#/functions https://ap-northeast-2.console.aws.amazon.com/lambda/home?region=ap-northeast-2#/functions ap-northeast-2.console.aws.amazon.com 위에 들어가게 되면 함수 생성이 있습.. 공감수 0 댓글수 0 2021. 5. 9.
  • Ubuntu netplan으로 고정 IP 설정하기 요즘은 우분투를 설치하는 시점에 고정 IP를 설정할 수 있도록 되어 있는데요. 이렇게 사용하다가도 IP를 변경하고 싶을때도 있고 아니면 고정으로 안쓰다가 나중에 설정할수도 있습니다. 포트포워딩 해줄려면 이렇게 해야겠죠. 일단 해당 방법은 Ubuntu 18 LTS 이상을 사용한다고 생각하고 글을 적어보겠습니다. 그리고 다들 LTS를 이용한다고 가정할게요. 거의 한개의 인터페이스를 이용하여서 되어 있을거라고 생각하고 이름은 enp0s31f6 형태로 되어 있을겁니다. vi를 이용하여 다음의 설정 파일을 수정하여 줍니다. Ubuntu 20 $ sudo vi /etc/netplan/00-installer-config.yaml Ubuntu 18 $ sudo vi /etc/netplan/50-cloud-init.ya.. 공감수 0 댓글수 0 2021. 5. 9.
  • VSCode를 원격에서 브라우저로 접속해서 코딩하기 오늘은 VSCode를 원격으로 돌리는 방법을 알아보려고 합니다. 물론 VSCode가 그렇게 무겁지 않기 때문에 웬만하면 노트북에 설치가 다 되어 있을거라... 이동하면서 코딩하기 어렵지는 않습니다. 그래도 이런 방법도 있다는걸 공유하고 싶어서 글을 남깁니다. 일단 docker를 이용해서 원격지에 image를 pull 하여 주면 됩니다. hub.docker.com/r/codercom/code-server Docker Hub hub.docker.com 이미지는 code-server를 이용할겁니다. $ sudo docker pull codercom/code-server image를 다 받아오게 되면 다음과 같이 docker container를 실행하면 됩니다. $ sudo docker run --name co.. 공감수 1 댓글수 0 2021. 4. 29.
  • 애플 미리알림과 마이크로소프트 To Do 동기화하여 사용하기 저는 폰은 아이폰을 사용합니다. 그래서 맥과 연결된 환경에서는 작업하던중에 컴퓨터로도 미리알림을 시간을 맞춰두면 간단한 메모들을 넣어놔서 편안하게 사용 할 수 있습니다. 컴퓨터를 멀티로 사용하다 보니까 윈도우로도 이런것들을 같이 사용하고 싶을때가 있습니다. 윈도우에서는 To Do라는 앱이 있고요. Microsoft Store 에서 무료로 다운로드 받을수 있습니다. 따로 링크는 넣지 않을게요. 두번째로는 아이폰에서 계정을 연동하여 주어야 합니다. 아이폰 설정에서 계정을 찾아서 추가하여 줍니다. 방법은 설정에서 가서 위에 검색에서 계정 을 넣어주면 "계정 추가" 도 보이실거에요. Microsoft Exchange를 선택하여 주고 자신의 계정을 등록하여 주면 됩니다. 저는 미리 알림만 동기화 할거라 나머지는 .. 공감수 0 댓글수 0 2021. 4. 24.
  • swift. RealmSwift 이용하여 봅시다. 프로젝트를 생성하고 pod을 가져와서 사용하는 방법까지는 설명하지 않도록 할게요. 대신에 이 곳에 설명이 아주 잘되어 있으므로 참고해봅시다. docs.mongodb.com/realm-legacy/docs/swift/latest/ Realm: Create reactive mobile apps in a fraction of the time Oops something went wrong You will not be receiving an email shortly with details docs.mongodb.com 그리고 사용 방법은 간단합니다. 이 기능을 사용하여야 하는 파일의 상단에 import를 추가합니다. import RealmSwift 보기 편하게 저는 write와 read를 만들거에요. privat.. 공감수 0 댓글수 0 2021. 4. 3.
  • Python3. lotto 발생기 python은 뭔가를 해도 그냥 다 만들어 놓은 언어같습니다. 심심해서 만든 lotto 발생기 import random def lotto(sort=True): result = [] numbers = list(range(1, 46)) for _ in range(6): number = random.choice(numbers) result.append(number) numbers.remove(number) if sort: result.sort() return result print(lotto()) 공감수 0 댓글수 0 2021. 4. 2.
  • Python. 간단한 크롤링 만들기 with BeautifulSoup 어떤 서비스에서 API를 제공해주지 않으면 해볼만한게 크롤링입니다. 파이썬과 BeautifulSoup을 이용합니다. 그리고 Web page를 호출하기 위해서 requests를 이용합니다. BeautifulSoup 우리가 크롤링을 하기 위해서는 Tag안에 Tag안에 Tag안에... 이렇게 구조를 가지고 계속 파고 들어서 무언가의 유의미한 값을 찾아야 합니다. 그러나 이러한 구조를 찾아주는 라이브러리가 없다면 굉장히 힘들게 파싱을 해야하겠죠. find를 쓰던지 등등... BeautifulSoup은 이런 HTML 문서를 아름답게 정리된 상태로 변환하여 주는 라이브러리입니다. 만들어 봅시다. python을 처음부터 구성하는 부분은 생략을 하도록 하겠습니다. requests를 가져와서 사용하기 위해서 다음과 같이.. 공감수 0 댓글수 0 2021. 3. 7.
  • ParallaxScrollView 요즘 ClubHouse를 보다가 카테고리 선택하는 화면이 Parallax하게 동작하는것을 보고 한번 만들어봤습니다. 복잡하게 만들지는 않고 AutoLayout을 이용해서 간단하게 만들었습니다. 이런 형태로 여러가지 View를 만드는것이 가능하므로 많은 분들 좋은 의견 있으면 참여 부탁드립니다. 아래와 같이 동작합니다. 소스는 여기에... github.com/outofcoding/ParallaxScrollView outofcoding/ParallaxScrollView Make scroll parallax. ( like Club House ). Contribute to outofcoding/ParallaxScrollView development by creating an account on GitHub. g.. 공감수 0 댓글수 0 2021. 3. 7.
  • Windows10. 작업표시줄 시계 초 단위 표시하기 기본적으로 작업표지줄에 시간은 시와 분까지만 표시가 되게 됩니다. Mac에는 초를 보여주는 옵션이 있는데 윈도우에는 옵션으로 제공은 하지 않아요. 1. Win + R 눌러서 실행 창을 열어 줍니다. 2. regedit를 타이핑하고 엔터를 눌러줍니다. 3. 레지스트리 편집기가 노출이 되면 다음의 경로를 찾아갑니다. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 4. 이 경로에서 마우스 오른쪽을 누르고 DWORD(32비트) 값을 선택하여 줍니다. 5. ' ShowSecondsInSystemClock ' 을 생성하여 줍니다. 6. 항목을 더블클릭해서 값을 1로 변경하여 줍니다. 7. 윈도우를 재부팅, 로그아웃하였더가 .. 공감수 0 댓글수 0 2021. 2. 20.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.