๐ฑ Today I Learned (์ง์ค ์๊ฐ: 12์๊ฐ 15๋ถ)
- (09:50 ~ 10:00 / 10๋ถ) TIL ๋ฐ ํ๋ฃจ ๊ณํ ์ ๋ฆฌ
- (10:00 ~ 11:00 / 1์๊ฐ) ํํ๋ก์ ํธ ํ์
- (11:00 ~ 13:00 / 2์๊ฐ) ํํ๋ก์ ํธ ๋ง์ดํ์ด์ง ๊ตฌํ : UI
- (14:50 ~ 17:00 / 2์๊ฐ 10๋ถ) ํ ํ๋ก์ ํธ ๋ง์ดํ์ด์ง ๊ตฌํ : UI
- (17:00 ~ 17:20 / 20๋ถ) ์ด์ TIL ๋ด์ฉ ์ ๋ฆฌ
- (19:00 ~ 23:00 / 4์๊ฐ) ํ ํ๋ก์ ํธ ๋ง์ดํ์ด์ง ๊ตฌํ ๋ฐ ํ์
- (01:00 ~ 02:00 / 1์๊ฐ) ์ค๋ TIL ๋ด์ฉ ์ ๋ฆฌ
- (02:00 ~ 03:35 / 1์๊ฐ 35๋ถ) ํ ํ๋ก์ ํธ ๋ง์ดํ์ด์ง ๊ตฌํ : Activity
- ์งํ์ค - ์ ์ฐฝ๊ฒฝ ์ค๋ช ํ ๋ด์ฉ ์ ๋ฆฌ
- ์งํ์ค - 9์ ์ดํ ์คํ ๋ค๋ ์ฌํ๋ฐ ๊ตฌํ
*** ์ ์ฌ 13:00 ~ 14:00 / ์ ๋ 18:00 ~ 19:00 ์ ์ธ
โ
1. ํํ๋ก์ ํธ ๋ง์ดํ์ด์ง ๊ตฌํ : UI
์ค๋์ ์ ๋ง ํ๋ฃจ์ข
์ผ ํํ๋ก์ ํธ์๋ง ๋งค์งํ๋ค.
ํผ์์ git์ ์ฌ์ฉํ๋ค๊ฐ ํ์
์ ํ๊ฒ ๋๋ฉด ์ฒ์์ ๋ง์ ์ค๋ฅ๋ฅผ ๊ฒฝํํ๊ฒ ๋๋ค๋๋ฐ, ์ ๋ง ๊ทธ ์ค๋ฅ๋ค์ ๊ฒช๊ณ ์๋ค. ์์ํด๋ณด์ง ๋ชปํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๊ฐ๋ ๊ณผ์ ์ด ์ฌ๋ฐ๊ธฐ๋ ํ๋ฉด์, ์ด ๊ธฐํ๋ก ์๋ก ์์๊ฐ๋ ๋ด์ฉ๋ ๋ง๋ค.
๋ง์ดํ์ด์ง UI๊ตฌํ์ ์ด๋ ์ ๋ ์ด์์ด ์๋ฃ๋์๊ณ , ์กํฐ๋นํฐ๋ง ์์ ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๐ก ๊ตฌํํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ (MyActivity.kt)
1. MainActivity์์ ํ๋กํ ์ฌ์ง์ ๋๋ฅด๋ฉด ๋ง์ดํ์ด์ง๋ฅผ ๋ณผ ์ ์๋ค.
2. MainActivity์์ Edit Profile์ ๋๋ฅด๋ฉด ๋ง์ดํ์ด์ง๋ฅผ ๋ณผ ์ ์๋ค.
3. ๋ง์ดํ์ด์ง์์ ์ด๋ฆ, ๋ฐ์ด์ค ๋ฑ์ ๊ฐ์ ์์ ํ๊ณ Done์ ๋๋ฅด๋ฉด ๋ฐ์ดํฐ์ ์์ ์ด ๋ฐ์๋๋ค.
- ์ฑ๊ธํค ํจํด์ ์ํด MemoryStorage ๊ฐ์ ๊ฐ์ ธ์ค๊ณ , ์์ ์ฌํญ์ ๋ฐ์์ํจ๋ค.
4. ๋ง์ดํ์ด์ง์์ ์ด๋ฆ, ๋ฐ์ด์ค ๋ฑ์ ๊ฐ์ ์์ ํ๊ณ Cancel์ ๋๋ฅด๋ฉด ์ด์ ์กํฐ๋นํฐ๋ก ๋์๊ฐ๋ค.
- finish()
5. ๋ง์ดํ์ด์ง์์ Switch to Login Page๋ฅผ ๋๋ฅด๋ฉด ๋ก๊ทธ์ธ ์กํฐ๋นํฐ๋ก ๋์๊ฐ๋ค.
6. Change Profile photo๋ฅผ ๋๋ฅด๋ฉด ํ๋กํ ์ฌ์ง์ด ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. (๋ก์ปฌ? ํ๋ก์ ํธ ๋ฐ์ดํฐ?)
- ์ ์ฒด์ ์ผ๋ก ๋ค๋ฅธ ํด๋์ค๋ ์กํฐ๋นํฐ์ ๊ฐ์ ๋๊ฒจ์ฃผ๊ณ , ๋๊ฒจ๋ฐ๊ณ ํ๋ ๋ก์ง ๊ตฌํ์ด ๋ง๋ค.
- ์ด๋ฒ ์ฃผ์ฐจ์ ๋ฐฐ์ฐ์ง ์์๋ ๋ด์ฉ์ ๊ฝค ์ฐ๊ฒ ๋ ๊ฒ ๊ฐ๊ธด ํ๋ฐ, ๋ฌธ์ ํด๊ฒฐ๊ณผ ๊ณ ๋ฏผ ๊ฒฝํ์ด ๋ง์ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
๐จ ๋ก์ง ๊ณ ๋ฏผ์ค
companion object {
private const val REQUEST_IMAGE_PICK = 100 // ์ด๋ฏธ์ง์ ํ ์์ฒญ์ ๊ตฌ๋ถํ๊ธฐ ์ํ ์์ฒญ ์ฝ๋, ์์์ ์์
}
...
fun changeProfilePhoto(view: View) {
val changePictureIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI)
startActivityForResult(changePictureIntent, REQUEST_IMAGE_PICK)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == REQUEST_IMAGE_PICK && resultCode == Activity.RESULT_OK && data != null){
val selectedImageUri = data.data
binding.imgProfile.setImageURI(selectedImageUri)
}
}
- ํด๋ํฐ ๋ก์ปฌ ํ์ผ์ผ๋ก ์ฌ์ง ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐ์ ์์ด ๊ณ ๋ฏผ์ด ์ข ์์๋ค.
- ์์ ๋ด์ฉ์ ๊ณ ๋ฏผํ ํ์ ์ธ๋ฐ, ์ผ๋จ์ ๊ถํ ๋ถ์ฌ ํ์ธ ๋ฑ์ด ๊ตฌํ๋์ด ์์ด์ ์ ์์ ์ผ๋ก ์๋ํ์ง ์๋๋ค.
์ผ๋ถ๋ฌ ๊ถํ ๋ถ์ฌ๊ฐ ํ์ ์๋ INTERNAL_CONTENT_URI์ธ๋ฐ๋ ์ผ๋จ์ ๊ทธ๋ ๋ค.
private fun changeProfilePhoto(view: View) {
val profileImages = arrayOf(
R.drawable.img_profile1,
R.drawable.img_profile2,
R.drawable.img_profile3,
R.drawable.img_profile4,
R.drawable.img_profile5
) // ์ํด ์ด๋ฏธ์ง์, ๊ฐ๋ก์ธ๋ก ๊ธธ์ด ์ค์ ํ ๊ฒ
val randomIndex = (0 until profileImages.size).random()
binding.imgProfile.setImageResource(profileImages[randomIndex])
}
- ๋ฐ๋ผ์ ์์ ๊ฐ์ด '์ผ๋จ์' ๋๋ค ์ด๋ฏธ์ง๋ก ๊ตฌํํ๋ค
binding.btnDone.setOnClickListener {
val newName = binding.etName.text.toString()
val newBio = binding.etBio.text.toString()
val newEmail = binding.etEmail.text.toString()
val newPhoneNumber = binding.etPhone.text.toString()
editUserInfo(newName, newBio, newEmail, newPhoneNumber)
Toast.makeText(this, "์ ๋ณด๊ฐ ์์ ๋์์ต๋๋ค.", Toast.LENGTH_SHORT).show()
}
...
private fun editUserInfo(newName: String, newBio: String, newEmail: String, newPhoneNumber: String) {
user?.let {
user.name = newName
user.bio = newBio
user.email = newEmail
user.phoneNumber = newPhoneNumber
MemoryStorage.setUser(user)
}
}
MemoryStorage.kt
object MemoryStorage {
private lateinit var user: User
internal fun getUser(): User = user
internal fun setUser(user: User) {
this.user = user
}
}
User.kt
@Parcelize
data class User(
val id: String,
val password: String,
var name: String,
var phoneNumber: String?,
var email: String?,
var bio: String?,
var postDatas: List<Post>
): Parcelable
- Done๋ฒํผ์ ๋ก์ง์ ๋ํด์๋ ๊ณ ๋ฏผ์ ์ข ํ๊ณ ์๋ค. ๊ตฌ์์ ์์ ๊ฐ๋ค.
- ์ฑ๊ธํค์ผ๋ก ๊ตฌํํ๊ธฐ ์ํด MemoryStorage์ User.kt๋ฅผ ์ฐ๊ฒฐํ๊ณ setUser์ getUser๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
- id๊ฐ์ ์์ ์ด ๋์ง ์์ผ๋ฏ๋ก android:enabled="false" ์ฒ๋ฆฌ ํด๋จ๋ค.
- Parcelable์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ธํ
ํธ(Intent)๋ ๋ฒ๋ค(Bundle)์ ๋ด์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ค.
๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ์ฌ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์๋๋ฉด์์ Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ณด๋ค ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ค.
๐จ UI ๊ตฌํ ์ค TextView์ Edittext ์์ ์ด๋ป๊ฒ ๊ตฌํํ๋ ๊ฒ ์ข์์ง?
- ๋ชฉํ UI์์ ์ฌ๋ฌ๊ฐ๋๋ก ๊ตฌํํด๋ณด๋ฉฐ ๊ณ ๋ฏผ์ ํ๋ค.
- 1) ๋ฆฌ๋์ด ๋ ์ด์์ orientation์ horizontal ๋ก ์ค์ ํ๊ณ , ์ผ์ชฝ Textview, ์ค๋ฅธ์ชฝ Edittext weight ๊ฐ๊ฐ ๋๋์ด ๋ถ๋ฆฌ
- ์ ๋ณด ์ด๋ฆ๊ณผ ์ ๋ณด ์ ๋ ฅ ๊ฐ์ ๋์ด ์ฐจ์ด๋ฅผ ์กฐ์ ํ๊ธฐ๊ฐ ๋๋ฌด ํ๋ค๊ณ ๋นํจ์จ์ - โ
2) ๊ฐ๊ฐ์ ์ด๋ฆ/์ ๋ณด ํ ์๋ง๋ค ๋ฆฌ๋์ด ๋ ์ด์์์ ๊ฐ๋ณ์ ์ผ๋ก ๋ง๋ค์ด ๋ฐฐ์น
- ์ด๊ฒ ์ ์ผ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ ๋๊ปด์ ํด๋น ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ๋ค.
- ๊ถ๊ธ์ฆ : ์นด์นด์คํก์ ํ์ฌ/๋ฉ์์ง/์๊ฐ ๋ ์ด์์ ๋ฐฐ์น๊ฐ ์ด๋ฐ ์์ผ๋ก ๋ฐฐ์นํ ๊ฒ์ผ๊น? - 3) ๋ฐ๋ก ๋ ์ด์์ ์์ด, ์ ์ฒด ContraintLayout ์์์ ์ด๋ฆ/์ ๋ณด ํ์์ ์ฒด์ธ์ผ๋ก ์ฐ๊ฒฐํ์ฌ ๋ฐฐ์น
- ์ฒด์ธ์ ์ด์ฉํ๋ฉด ๊ฐ๊ฐ ๋ค๋ฅธ ์ด๋ฆ์ ๊ฒฝ์ฐ ๊ณต๋ฐฑ ๊ธธ์ด๊ฐ ๊ฐ์ ๋ฌ๋ผ์ ํด๊ฒฐ์ด ์ ๋งคํ๊ณ ๋นํจ์จ์ - 4) ConstraintLayout์ผ๋ก ์ฒด์ธ์ ๊ฑธ์ง์๊ณ , ์ ๋ง ๊ฐ์ ๋ฐ๋ก margin์ผ๋ก๋ง ๋ฐฐ์น
- ๊ณต๋ฐฑ ์ฐจ์ด ์ฒ๋ฆฌ๊ฐ ์ด๋ ค์, ๋ค์ํ UI์ ๋์๋ ๋ถ๊ฐ๋ฅํ๋ฉฐ ๋ง๋ ์ ๋จ - 5) Contraint ์์ Constraint Layout
- ์ด ๋ฐฉ๋ฒ๋ ๊ด์ฐฎ์ง๋ง ๊ท์ฐฎ์์ 2 ์ฑํ
๐ก ๋ฆฌ๋์ด ๋ ์ด์์์์ weight ์ค์ ์์ ์ฃผ์ ์ฌํญ
- ๋ฆฌ๋์ด ๋ ์ด์์ ์์์ weight๋ฅผ ์ค ๋๋, width๋ height๋ ์ํฉ์ ๋ง๊ฒ 0dp๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
(์: ๋ฆฌ๋์ด ๋ ์ด์์์ orientation์ด horizontal์ด๋ผ๋ฉด width๊ฐ 0dp) - ์ด๋ ๊ฒ ์ค์ ํ์ง ์๋๋ค๋ฉด weight ์ ์ฉ์ด ์ ๋์ง์์ ์ค๋์ ์ฝ์ง๊ณผ ๊ฐ์ ํ์์ด ์ผ์ด๋๋ค.
- ์ฐธ๊ณ ๋ก ๋ฆฌ๋์ด ๋ ์ด์์์ ์ฌ์ฉํ์ง ์๊ณ constraint layout์์ width๋ height์ 0dp ๊ฐ์ ๋ฃ์ ๋ค์ ํผ์ผํธ ๊ฐ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
- layout_constraintHeight_percent (๋์ด ๊ธธ์ด๋ฅผ ๋ถ๋ชจ์ ๋น๋กํด ์ค์ )
- layout_constraintWidth_percent (๋๋น ๊ธธ์ด๋ฅผ ๋ถ๋ชจ์ ๋น๋กํด ์ค์ )
๐จ stash ๊ด๋ จ
- ํ์ ์ค pull๊ณผ ๊ด๋ จํด์ ์น์ํ์ ํด๋ณด๋ฉด git stash๊ฐ ๋น๋ฒํ๊ฒ ๋์ค๋๋ฐ, ์ฌ์ค stash๋ก ์๊ธฐ๋ ๋ฌธ์ ์ ์ ๋ํด์๋ ํ์ ๊ฐ๋ฐ์ ๋ถ๋ค์ด ์คํ๋ ค stash ์ฌ์ฉ์ ์ ํ์ ์ ์ ๋ชจ๋ฅด์๋ ๊ฒ ๊ฐ์๋ค.
- ์ฌ์ค ํํฐ๋๊ป ์ฌ์ญค๋ณด๋ฉด ํ์ ์์ bash๋ณด๋จ ์์คํธ๋ฆฌ ๊ฐ์ GUI๋ฅผ ์ด์ฉํ์๋ ๋ถ๋ค๋ ๋ง์ ๋ฏ ํ๋ค. (ใ ใ )
- ๊ธฐ๋ฅ ๋ธ๋์น์ ์๋ค๊ฐ ๋ฉ์ธ ๋ธ๋์น์ ๋ด์ฉ์ pull ํ๊ณ ์ถ์ ๋ stash๋ฅผ ์ฌ์ฉํด์ ์์ ์ ์ฅํ๊ธฐ๋ณด๋ค๋,
1) ๊ธฐ์กด ๋ด์ฉ commit์ ๋จผ์ ํด๋๊ณ
2) ํด๋น ์ํ์์ ํฉ์น ๋ธ๋์น์ ๋จธ์ง๋ฅผ ๋ก๊ฒจ์ค๊ณ
3) Conflict ๋ถ๋ถ (๋นจ๊ฐ์) ๋ณด์ด๋ ๊ฑฐ ์๋ง๊ฒ ์์ ํ๊ณ ํฉ์น๋ ๊ฑธ ๋ง๋ฌด๋ฆฌํ๋ ๊ฒ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ ํ์ จ๋ค.
๐จ merge์ ์ปค๋ฐ ์๋ ์์ฑ ๊ด๋ จ
- ๋ค๋ฅธ ๋ธ๋์น์ ๋ด์ฉ์ pull ํ ๋ค ๋ด ๋ธ๋์น์ mergeํ ๋ ์์ ๊ฐ์ ์ปค๋ฐ์ด ์๋์ผ๋ก ์์ฑ๋๋ ๊ฒ์ด ๋ณด๊ธฐ ์ซ์๋ค.
- ํด๋น ๋ด์ฉ์ ๋ฐ๊ฟ ์ ์๋ ๋ฐฉ๋ฒ์ ํํฐ๋๊ป ์ฌ์ญค๋ดค๋๋ฐ, ์๋์ผ๋ก ์ปค๋ฐ์ด ์์ฑ๋๋ ๊ฒ์ ์ด์ฉ ์ ์์ผ๋ฉฐ
์ด๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ bash๋ฅผ ์ด์ฉํด์ '์ ์ด์ ๋๋ฒจ๋กญ์์ ํฉ์ณ์ง๊ณ ๊ฐ๋ฐํ๋ ๊ฒ'์ฒ๋ผ ๊พธ๋ฉฐ์ฃผ๋ ๋ฐฉ๋ฒ๋ฐ์ ์๋๋ฐ, ์ด๊ฒ ์ข ์ด๋ ค์ด ๋ฐฉ๋ฒ์ด๋ผ ์ง๊ธ ๋จ๊ณ์์ ์๋ชป ํ๋ค๊ฐ ๋ค ๋ ๋ ค๋จน์ ์ ์์ด์ ๋น์ถ์ฒํ๋ค ํ๋ค. - ํ์ ๋จ๊ณ์์ merge๋ฅผ ํ๋ฉด ๋น์ฐํ ๋๋ถ๋ถ ์ถฉ๋์ฝ๋๊ฐ ์์์ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์๋ค์ด๋ผ๋ ์๊ฒฌ...
- ์ธ๋ฐ ๋์ค์ ๋ค์ ํ ๋ฒ ์ฐพ์๋ณด๊ณ ์ถ๋ค. ๊ทธ๋ฅ ์ปค๋ฐ์ ํฉ์น๋ฉด ์ ๋๋? ํ๋ ์๊ฐ์ด ๋ค๊ธด ํ๋๋ฐ ๋ง์ด๋ค.
+ ์ถ๊ฐ์ ์ผ๋ก PR์ด ์ด๋ ค ์์ ๋ ๊ธฐ์กด ์ปค๋ฐ ์์ ์ ๋ซ์ง ์๊ณ ๋ฐ์ํ๋ ค๋ฉด git amend๋ฅผ ์จ์ผ ํ๋ ์ค ์์๋๋ฐ, ๊ทธ๋ฅ ํฉ์ณ์ง ์ฌ๋ฃ ๋ธ๋์น์ commit push ํ๊ณ ๋๋ฉด ๋ณ๋์ ์กฐ์น ์์ด ์๋์ผ๋ก PR์ ๋ฐ์์ด ๋์ด ์์๋ค.
๐ญ Retrospect
์๊ณ ๋ฆฌ์ฆ์ ํ ์๊ฐ์ด ์์ด์ ์ข ์์ฝ์ง๋ง, ์ฒซ ํํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๋ง์ ๊ฑธ ๋๋ผ๊ณ ๋ฐฐ์ฐ๋ ๊ฒ ๊ฐ๋ค.
๊ธธ๊ฒ ํ๊ณ ๋ฅผ ์ฐ๊ณ ์ถ์ ๋ ์ธ๋ฐ... ๋๋ฌด ๋ชฐ๋ํ๋๋ ์กธ๋ ค์ ์ผ๋จ ์์ผ๊ฒ ๋ค.
โ