인강 링크 : https://inf.run/MBJT
![](https://private-user-images.githubusercontent.com/75060346/249467868-9e6cfbb5-9e15-4df1-a453-645dcb998c12.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDk0Njc4NjgtOWU2Y2ZiYjUtOWUxNS00ZGYxLWE0NTMtNjQ1ZGNiOTk4YzEyLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTliNjE3M2VlNTQzYzEzNDU5ZTA0NWU5ZDZmODk0OTU3ZDJhYmFkYTk4ZWYzYWIxM2QzNDgwY2Y1ZDAyN2ZkZTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.BTx9dad0jsXFX-7k9lgObjaLbgMNRGtsQ1bPw6oeO-w)
- core data 사용해보기
![](https://private-user-images.githubusercontent.com/75060346/249086795-a5576383-b00b-4959-9010-ae97d6f404b9.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDkwODY3OTUtYTU1NzYzODMtYjAwYi00OTU5LTkwMTAtYWU5N2Q2ZjQwNGI5LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdjZTZmNzk5ODU4YTU1ZmMzN2IyZjFlZmZmOTUyNTRlYTcwOGUzODgxZDkwNDZhNzczMTMxZDNhOTdiODA5NDAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.TYIIPMpgfGP1Ki0RAOUu1t8HRWicTgTojBngfkfkzz8)
- Network 관련 작업
- itunes search api 연결 작업
- 서버에서 받아온 이미지 비동기 처리
- postman을 활용한 api 체크 진행
- searchBar 적용
- 검색시 collectionView에 엘범 이미지 보이도록 적용
![](https://private-user-images.githubusercontent.com/75060346/248523953-95265c72-13db-4764-b190-ed9b7b30d8bc.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDg1MjM5NTMtOTUyNjVjNzItMTNkYi00NzY0LWIxOTAtZWQ5YjdiMzBkOGJjLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY0NDJiNzlmYTQyZGQ2MmNjYmI5YjU5YzI3MTc2YWFmNWU0NWRkNGVkYjY5ZGE5OTk0ODZhOWI1NTY2NGNlOTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Ohp0SY4kmEtHL-O-Btk4M5rWooR2uyqp4478AXndwX8)
- Study Custom Delegate Pattern
- Delegate Pattern & Notification
- 델리게이트 패턴
- 1:1 객체간 쌍방향 커뮤니케이션에 사용 한다.
- 리턴값 있을 수 있음
- Notification
- 1:N 라디오 방송의 개념
- 등록하면 Nofi를 받을 수 있음
- 리턴값의 개념이 없음
- 델리게이트 패턴
![](https://private-user-images.githubusercontent.com/75060346/247870605-7ef122eb-5aed-4f4f-a2eb-255286f694cd.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDc4NzA2MDUtN2VmMTIyZWItNWFlZC00ZjRmLWEyZWItMjU1Mjg2ZjY5NGNkLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlhNWNhZDZiOGJmNWFmYjIzZjYzZDdhZjUwOGM4NWY0YmYzNzY1MTVhNDE1M2YyYTc3MTE5ZTJmZGViNzAyYzgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.O47esPxxLcZxqEQyhRG9b2Ay9A2rrdpmn33LySvcia0)
- 델리게이트 패턴을 사용
- dataSource - 테이블뷰의 구성
- 몇개의 셀로 만들것인지?
- 셀의 구성은 어떻게?
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print(#function)
return movieDataManager.getMovieData().count //컨텐츠 생성 개수
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print(#function)
//indexPath.section //그룹
//indexPath.row // 행
let cell = tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! MovieCell
let movie = movieDataManager.getMovieData()[indexPath.row]
cell.mainImageView.image = movie.movieImage
cell.movieNameLabel.text = movie.movieName
cell.movieDescription.text = movie.movieDescription
return cell
}
}
- delegate
- 터치가 일어남/ 드레그가 일어남 등
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "toDetail", sender: indexPath)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toDetail" {
let detailVC = segue.destination as! DetailViewController
let array = movieDataManager.getMovieData()
let indexPath = sender as! IndexPath
detailVC.moiveData = array[indexPath.row]
}
}
}
- tableView Data 추가시
tableView.reloadData()
호출
- Model - 비즈니스 로직, 데이터 (화면과 전혀 관련이 없는 로직과 데이터 관련)
- View - UI관련. 즉, 사용자 화면 표시(뷰컨트롤러의 명령을 받아 화면 표시)
- Controller - 뷰컨트롤러, 모델의 정보를 어떻게 뷰에 표시할지를 해석해서 전달(중재자)
![](https://private-user-images.githubusercontent.com/75060346/246728482-411425d3-a7f5-461e-8e01-6bb5dca9b61a.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDY3Mjg0ODItNDExNDI1ZDMtYTdmNS00NjFlLThlMDEtNmJiNWRjYTliNjFhLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNjYzY2YTQzZjE1MWY5ZTNhZDJhZDIwM2RmODA4N2QzMjYxY2M0MTEyNTM0NzJhOWZhZDlkNTU0NzlkMjk2NzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.njAysV8a95pxmAfWJg0VRNa-j1uXkwGcm3QCzRgDt0c)
-
코드로 화면 전환
//////////////////////////특정 화면으로 이동///////////////////////// let firstVC = FirstViewController() firstVC.someString = "Hello" firstVC.modalPresentationStyle = .fullScreen //전체화면으로 전환 present(firstVC, animated: true) ///////////////////////////돌아가기(공통)/////////////////////////// dismiss(animated: true)//이전화면으로 돌아가기
-
코드로 스토리보드 객체를 생성해서, 화면 전환
// 2) 코드로 스토리보드 객체를 생성해서, 화면 이동 @IBAction func storyboardWithCodeButtonTapped(_ sender: UIButton) { if let secondVC = storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondViewController { secondVC.someString = "아빠상어" // 인자 전달 present(secondVC, animated: true) } }
-
스토리보드에서 화면 이동(간접 세그웨이)
// 3) 스토리보드에서의 화면 이동(간접 세그웨이) - 버튼을 눌렀을 때 @IBAction func storyboardWithSegueButtonTapped(_ sender: UIButton) { performSegue(withIdentifier: "toThirdVC", sender: self) } // 인자 전달 방법 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "toThirdVC" { let thirdVC = segue.destination as! ThirdViewController thirdVC.someString = "엄마상어" } }
-
스토리보드 버튼에서 화면 이동(직접 세그웨이)
// 4) 직접적인 segue를 버튼하고 연결했을 때 실행됨. -> 다음화면으로 넘어가기 위한 조건 설정 override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { return true }
![](https://private-user-images.githubusercontent.com/75060346/246613225-9dbd32b0-7d36-4e8e-9dee-6f7017651850.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDY2MTMyMjUtOWRiZDMyYjAtN2QzNi00ZThlLTlkZWUtNmY3MDE3NjUxODUwLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTAwNjJkMjk0MTY0M2I3ZTRhZWYwMGRmNjAzZGNkNjdlZWEzMDVmMmI4OTVmNWUwMTg2NmU0ZmRjYjYzYjMzZjYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.KHR22OfueAPe0NLnpXF6nUhicA4KubJka6zX4dSOxEU)
- 스크립트만으로 UI 만들기
- Alert 창 만들기
let alert = UIAlertController(title: "비밀번호 바꾸기", message: "비밀번호를 바꾸시겠습니까?", preferredStyle: .alert)
let success = UIAlertAction(title: "확인", style: .default) { action in
print("확인 버튼이 눌렸습니다.")
}
let cancel = UIAlertAction(title: "취소", style: .cancel) { cancel in
print("취소 버튼이 눌렸습니다.")
}
alert.addAction(success)
alert.addAction(cancel)
present(alert, animated: true, completion: nil)
- UI 애니메이션 할당
UIView.animate(withDuration: 0.3) {
self.stackView.layoutIfNeeded()
}
- textField 관련 속성 써보기
textField.keyboardType = UIKeyboardType.emailAddress
textField.placeholder = "이메일 입력"
textField.borderStyle = .roundedRect
textField.clearButtonMode = .always
textField.returnKeyType = .go
- textField 글자 수 제한 방법
// 텍스트필드 글자 내용이 (한글자 한글자) 입력되거나 지워질때 호출이 되고 (허락)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let maxLength = 10
let currentString: NSString = (textField.text ?? "") as NSString
let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString
return newString.length <= maxLength
}
- textField 이외의 영역 터치시 키보드 내리기
// 화면의 탭을 감지하는 메서드
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
![](https://private-user-images.githubusercontent.com/75060346/246293537-710665fe-a4f4-483c-980a-b8fd184136d7.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDYyOTM1MzctNzEwNjY1ZmUtYTRmNC00ODNjLTk4MGEtYjhmZDE4NDEzNmQ3LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU2Njc2OTkyZDc1ZDQxNGQ4NzVmMTc5MGI5ZTA0N2E4ZjM3NTI4YjBiODQ4ZDUxMWQxNjFkNTllMGMwYjc1ZDQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.gQDYGlS8lx6WOf2ldWA2olQuZJxU7_VZB_46eSNs1g8)
- 타이머 구현하기/ 셀렉터 & 클로저 사용
weak var timer: Timer? // 강한 레퍼런스 사이클을 조심해야 한다.
@IBAction func startButtonTapped(_ sender: UIButton) {
timer?.invalidate()
//셀렉터 사용
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(doSomethingAfter1Second), userInfo: nil, repeats: true)
//클로저 사용
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { [self] _ in
if number > 0 {
number -= 1
slider.value = Float(number)/Float(60)
mainLabel.text = "\(number) 초"
} else {
number = 0
mainLabel.text = "초를 선택하세요"
timer?.invalidate()
AudioServicesPlayAlertSound(SystemSoundID(1322))
}
})
}
@objc func doSomethingAfter1Second() {
if number > 0 {
number -= 1
slider.value = Float(number)/Float(60)
mainLabel.text = "\(number) 초"
} else {
number = 0
mainLabel.text = "초를 선택하세요"
timer?.invalidate()
AudioServicesPlayAlertSound(SystemSoundID(1322))
}
}
- 사운드 플레이
import AVFoundation
AudioServicesPlayAlertSound(SystemSoundID(1322))
![](https://private-user-images.githubusercontent.com/75060346/246051138-0092048a-b488-4034-b5a4-f05e792c3c21.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDYwNTExMzgtMDA5MjA0OGEtYjQ4OC00MDM0LWI1YTQtZjA1ZTc5MmMzYzIxLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZhY2Y1YjgwMTcwYjUwMzU4NjU4MzM4ZTFjMDIzNWFkNzM3NWMwNWVkYjA3Njk5ZmRjOTQyYTRmNmIzN2U4NDYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.cA0RAEWAYRp1DYK1ltfVDuXl5NipJyBxDcGBDXBTKfM)
- 업다운 게임
- String을 Int로 형변환
- guard let num = Int(string값) 사용
![](https://private-user-images.githubusercontent.com/75060346/246050683-f9543b8e-2b96-4c72-b8b1-09ef67e737ed.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDYwNTA2ODMtZjk1NDNiOGUtMmI5Ni00YzcyLWI4YjEtMDllZjY3ZTczN2VkLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ1ZTE2Y2Y0YTNiMjE3Y2U5MTRkMmU2Y2RmM2M0NjBkY2MyZjY0YzgzMTVkOWFlMmQwODk1MDdjMDA0ZjBmZGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.QwHkOabRkd7ZcrrzeHZu8yMe27zdJ9zXgi8VIofxSA4)
- 가위바위보 게임
![](https://private-user-images.githubusercontent.com/75060346/246050222-2136f482-61f7-47ba-bd43-36de0b1917bb.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDYwNTAyMjItMjEzNmY0ODItNjFmNy00N2JhLWJkNDMtMzZkZTBiMTkxN2JiLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU3Y2FhNjlhODI3ZDM2YmI1NTFlMjc1OTM4YjZlOWYwN2YwNzhiYzM1OTgwMTQ3ZDAxNTg2YjIzZjRkNWZjYTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.KqjG7QYGtMt_saOFeZPaOn9lCWbs4-pOXyMQQ977x4s)
- 버튼을 누르면 랜덤으로 다이스 이미지 바꾸기
![](https://private-user-images.githubusercontent.com/75060346/246049606-060e28c4-917b-47d8-97ce-d287937fb92b.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5MzI0MTQsIm5iZiI6MTcyNDkzMjExNCwicGF0aCI6Ii83NTA2MDM0Ni8yNDYwNDk2MDYtMDYwZTI4YzQtOTE3Yi00N2Q4LTk3Y2UtZDI4NzkzN2ZiOTJiLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDExNDgzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU5ODc3ZWRiOTljOGU3NzhiYzNlZTgwZjkzNjFjYTY5OTU2OTY0MjA2ZjBhYzMxNDBmNjUyZDk2MDE2ZTE3OTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Wgekz9aqCF12wRYm-7TlmDUvbfZ8m_Q3T4JP_4VkHHM)
- 단순 버튼을 누르면 텍스트 바꾸기