우아한테크코스

삶의 의미 많은 사람들이 한 번쯤 생각해 볼 것이다. 어차피 죽을 건데 왜 사냐고. 인간은 우주의 먼지 같은 존재라고 과거의 나는 이 숨막힐 듯 거대한 무의미에 짓눌려 허덕였다. 그럼에도 작지만 빛나는 의미 하나를 찾고 싶었다. “삶의 의미는 무엇인가요?” 그 누구도 쉽게 답하지 못했지만 각자 경험을 토대로 서로 다른 답을 들려주었다. 그제야 삶의 의미를 알게 됐다. 나만의 의미를 찾아가는 그 삶이 자체가 의미 있는 것이라고 그때부터 결과가 아닌 과정, 삶 자체에 집중하기 시작했다. “정답이 없으면 결과보다 과정이 중요하다.” 삶과 개발 개발에는 정답이 없다. 다수의 의견도 있고 누군가의 경험에 의해 정형화된 방법(아키텍처나 패턴 등)도 있다. 그렇지만 그것조차 정답은 아니다. 몹프로그래밍이나 팀프로젝트..
벌써 우아한테크코스 레벨 4! 배우면 배울수록 배워야 할 것도 많아지고 기억해야 할 것도 많아지는 기분이다. 레벨 3에선 팀 프로젝트 진행을 위해 미션이 사라졌었다. 레벨 4엔 "심화 미션" 이라는 이름으로 다시 미션이 돌아왔고 더 깊은 공부를 할 수 있게 되었다. 그 첫 번째는 “자동 DI 구현하기” Dagger Hilt 나 Koin 을 제대로 사용해본 적 없이 수동 DI 만 구현해본 나에게 자동 DI 가 무슨 말인지 이해조차 되지 않았다. 그래서 처음엔 수동 DI 부터 만들어 보았다. private val viewModelFactory = object : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return whe..
현재 프로젝트에 적용 중인 로깅 방식을 공유하려고 한다! 로깅 전략 의 필요성 로깅 전략은 어떤 로그를 어떤 방식으로 남길지, 로그를 얼마나 관리할 지 등이다. 그럼 애플리케이션에 어떤 로깅 전략이 필요할까? 아래는 가장 중요하다고 생각하는 두 가지 이다. 1. Error 로깅 네트워크 통신하는 부분에서 왜 Failure 하는지, Exception 이 어디서 어떻게 발생하는지 Message 는 무엇인지 로깅하고 싶을 수 있다. 오류가 반복된다면 fix 가 필요할 것이다. 2. 비즈니스와 연결 사용자가 어떤 flow 로 앱을 이용하는지 어떤 화면에 오래 체류하는지 체크해서 비즈니스와 연결 지어 이용할 수 있다. 로깅의 범위나 방향은 앱마다 다르다. 즉, 어떤 로깅 전략을 세울 지 앱 바 앱 이고 팀 바 팀..
다시 돌아온 코루틴! 그럼 바로 문제부터 시작해볼까요? 문제1 다음 코드는 언제 끝날까요? fun main() = runBlocking { val job = launch { while (true) { println("While in ${Thread.currentThread().name}") } } } 정답 이 코드는 안끝납니다! launch 스코프로 실행하고 runBlocking 이 끝날 때 까지 기다리기 때문에 무한루프를 타게 됩니다. 문제 2 그럼 이 녀석은 언제 끝날까요? fun main() = runBlocking { val job = launch { while (true) { println("While in ${Thread.currentThread().name}") } } println("종료"..
사용이 목적이라면 쉽지만 이해하긴 어려운 코루틴을 공부해보자 킹갓 제이슨은 말씀하셨다. 어떻게 코어를 효율적이고 효과적으로 사용할 것인가? 코어나 프로세서가 추가됨에 따라 실행시간이 항상 빨라지는가? 코루틴 학습을 통해 이해해보도록 하자. 학습 로드맵 Philipp Lackner 의 KOTLIN COROUTINES https://www.youtube.com/playlist?list=PLQkwcJG4YTCQcFEPuYGuv54nYai_lwil_ Android Kotlin 코루틴 https://developer.android.com/kotlin/coroutines?hl=ko Kotlin Docs 코루틴 https://kotlinlang.org/docs/coroutines-overview.html 용어 정리 ..
MVP 패턴으로 작성한 단순한 화면을 MVVM 패턴으로 바꿔보자! + 버튼을 누르면 1씩 증가하고 - 버튼을 누르면 1씩 감소하는 단순한 앱을 만들어보자. 먼저 xml 파일을 작성해서 화면을 그렸다. MVP 패턴 Counter 작성 먼저 도메인 Model 부터 만들어 보자 count 를 프로퍼티로 가지며 add 나 sub 를 호출할 경우 현재 count 를 return 한다. class Counter { private var count = 0 fun add(): Int { return ++count } fun sub(): Int { return --count } } MainContract 작성 MVP 패턴은 View 와 Presenter 의 1대1 계약과 비슷하다. 그러니 Contract interfac..
들어가기 전에 이 글은 MVP 패턴 적용이나 단위 테스트에 대한 경험이 없다면 이해하는데 어려움이 있을 수 있습니다. 테스트가 필요한가? 장바구니 주문 미션 2단계 제출할 때까지 Presenter 테스트 의 필요성을 인지하지 못했다. 리팩터링 할 때마다 테스트 리팩터링이 계속해서 필요했다. 또한, 기능을 다 구현했는데 하나하나 테스트를 짜야한다는 것이 그저 숙제로 느껴졌다. 시간이 부족하다는 이유로 기존에 작성했던 테스트를 전부 주석 처리하고 제출하는 만행을 저질렀다. 리뷰어님이 다음과 같은 메세지 를 남겨주셨다. 도메인 관련 클래스를 잘 분리하고 테스트 코드까지 잘 작성해주셨습니다. 다만 안드로이드와 관련된 코드들은 테스트가 작성되지 않은게 아쉬웠습니다. 그러자 내가 테스트를 잘 못짜서 필요성을 인지하..
오목 미션을 진행하면서 렌주룰의 금수를 처음 알게 되었다. 렌주룰의 금수 : 먼저 시작하는 흑돌이 무조건 유리하기 때문에 흑목은 3-3, 4-4, 장목 등을 금지한다. 예를 들어 다음과 같은 경우가 3-3 이고 가운데에 흑돌을 놓을 수 없다. 3-3, 4-4 는 다른 사람의 코드를 사용했고 장목은 직접 만들어 사용했다. override fun isForbidden(location: Location) = OmokForbiddenRuleAdapter(board, stone).isForbidden(location) || OmokLongForbidden.isForbidden(board, location, stone) 그러다보니 위와 같이 코드를 작성했다. 가독성도 떨어지고 확장성이 떨어져서 좋지 못한 구조이다...
step1 에서 블랙잭 미션을 진행하면서 코드가 점점 복잡해지고 마음에 들지 않았다! step1 미션 PR https://github.com/woowacourse/kotlin-blackjack/pull/16 [베르] 1단계 블랙잭 제출합니다. by SeongHoonC · Pull Request #16 · woowacourse/kotlin-blackjack 안녕하세요! 우테코 5기 베르입니다! 리뷰 잘부탁드립니다! github.com step2 에서 상태 패턴을 알게 되었고 적용해 보았다. 상태 패턴 : 객체지향 관점으로 유한 상태 기계를 구현하는 디자인 패턴 그럼 유한 상태 기계는 뭘까? 유한 상태 기계는 유한한 개수의 상태를 가질 수 있는 기계이다. 한 번에 오로지 하나의 상태만을 가지게 되며, 어떠한..
리뷰 1 Rank 의 convertToGrade 메서드는 matchCount 와 bonusMatch 를 입력받아 해당하는 Rank 를 반환한다. 해당 코드에 대한 리뷰 현재 요구사항에서 2, 3등에서만 bonusMatch 가 필요하다. 하지만 요구사항이 추가되어 bonusMatch 가 다른 등수에서도 필요해 진다면 위의 로직에서 if 문이 계속 추가되거나 when 을 사용하여 조건을 추가해 줘야한다. 그렇다면 해당 메서드 로직은 변경하지 않으면서 다른 등수를 추가할 수 있게 만드는 방법은 무엇일까? 해결 방법 내가 사용한 방법은 enum class 추가이다. 각 등수는 bonus 에 대해 3 가지 분기를 갖는다. 1. bonus 가 맞아야한다. (BONUS_MATCH) 2. bonus 가 맞지 않아야 한..
베르_최성훈
'우아한테크코스' 카테고리의 글 목록