이제 와서 올리는 4주차 회고..
약 한 달 전에 진행한 미션인데 어쩌다보니 다른 일들과 게으름 이슈로 인해 이제야 적게 되었다..
사실은 최종 코딩테스트 회고를 적으려고 했는데 4주차만 빼니까 좀 거슬려서
그때 냈던 소감문을 보면서 문장만 정리해서 적어보려고한다.
한 달 전으로 돌아갔다고 생각하고 보자!
드디어 길고도 짧았던 한달간의 우테코 여정이 끝났다.
하면서 재밌기도 했고, 알고 느끼게 된 것이 많아 뿌듯하기도 했으며, 더 잘하고 싶다는 압박감에 간혹 힘들기도 했다.
그래도 얻어가는 것이 많아 떨어지게 되더라도 프리코스 지원에 후회하지 않는다.
매 미션마다 그랬지만 이번에도 느낀 것이 너무 많았다.
그 중에서 큰 것만 몇 가지만 골라 이야기해보려고 한다!!
테스트 코드와 전략 패턴
나는 인터페이스와 추상화에 아직 능숙하지 않고 디자인패턴은 더더욱 몰랐다. 하지만 이번 과제 덕분에 이들과 조금은 가까워진 것 같아 좋았다.
처음에 다리를 생성하기 위한 랜덤 숫자 생성기가 인터페이스로 추상화 되어있는 것을 보고 의아했다.
여러가지 구현체를 두고 있는 것도 아닌데 왜 인터페이스로 추상화했을까.. 내가 다른 구현체를 더 만들어야하는 걸까? 근데,, 저거 하나만으로도 0과 1을 잘 뽑아내고 있는데 왜..? 라는 생각들이 들었다.
그래서 인터페이스에 대해 조금 더 찾아보았다. 인터페이스는 꼭 여러 구현체를 묶어주는 것이 아니라 서버 개발자가 클라이언트 개발자에게 api 명세서를 작성해주듯 명세서의 역할을 한다는 것을 우선 깨달았다.
거기에 더해 전략 패턴(strategy pattern)이라는 것을 발견하게 되었다.
전략(인터페이스)가 있고 해당 전략이 실제 구현된 여러가지 전략 콘크리트가 있다.
전략 사용자는 실제 구현체인 전략 콘크리트는 모른 채 전략을 받는다.
전략 제공자는 실제 구현체인 전략 콘크리트를 전달한다.
오 신기한데?하며 이해하고 주어진 ApplicationTest 코드를 보고 이해한 이론이 어떻게 적용되는지 너무 확 와 닿았다.
저번 주에도 사용한 멘트 같지만 또 한 번 개안한 느낌이었다. 정말 우테코는 매주 사람을 한 단계씩 성장시키는 것 같다.
아래 코드는 랜덤 숫자를 생성하는 코드이며 위에서 말했던 추상화된 부분이다.
import camp.nextstep.edu.missionutils.Randoms
interface BridgeNumberGenerator {
fun generate(): Int
}
class BridgeRandomNumberGenerator : BridgeNumberGenerator {
override fun generate(): Int {
return Randoms.pickNumberInRange(RANDOM_LOWER_INCLUSIVE, RANDOM_UPPER_INCLUSIVE)
}
companion object {
const val RANDOM_LOWER_INCLUSIVE = 0
const val RANDOM_UPPER_INCLUSIVE = 1
}
}
그리고 아래 코드는 랜덤 숫자 생성이 포함된 코드를 테스트하는 코드이다.
랜덤이 사용되는 경우 테스트가 어려워지므로 보다시피 랜덤 숫자를 생성하는 부분에 대한 새로운 구현체를 만들어 원하는 숫자를 넣어 테스트한다.
class ApplicationTest : NsTest() {
@Test
fun `다리 생성 테스트`() {
val numberGenerator: BridgeNumberGenerator = TestNumberGenerator(listOf(1, 0, 0))
val bridgeMaker = BridgeMaker(numberGenerator)
val bridge: List<String> = bridgeMaker.makeBridge(3)
assertThat(bridge).containsExactly("U", "D", "D")
}
class TestNumberGenerator(numbers: List<Int>) : BridgeNumberGenerator {
private val numbers: MutableList<Int> = numbers.toMutableList()
override fun generate(): Int {
return numbers.removeAt(0)
}
}
}
이렇게 이해를 하고 적용하면서 문득 든 생각은.. 이걸 왜 전략 패턴이라고 부르지? 였다.
처음엔 설명들을 읽으며 아 이런 거구나! 하고 이해했지만 점점 이해되고 사용할수록 어떤 특정 패턴이 아닌 그냥 인터페이스와 추상화를 지극히 활용했을 뿐이라고 생각됐다. 왜 굳이 추상화가 아닌 전략 패턴이라는 특정한 이름으로 부르는지는 아직 잘 모르겠다.
그래도 이 부분이 이번 주차 우테코에서 개인적으로 가장 크게 느낀 충격이자 배움이라고 생각한다.
인터페이스와 한 층 가까워진 느낌이다.
"인터페이스는 명세서다. 받는 사람은 해당 인터페이스만 알고 받으며 주는 사람이 상황에 맞춰 골라서 보내줌으로 유지 보수에 용이해지고, 분기 처리 코드가 줄어들게 된다!"
항상 추상적으로만 들려왔던 말들이 직접 느껴져 좋았다.
View를 완전히 분리 - 아키텍처가 별게 아니구나
우테코를 4주간 진행하면서 느낀 것은 아키텍처가 별 게 아니구나라는 것이다.
우테코를 하기 전에는 관심이 없어도 mvvm이니 클린 아키텍처니 하는 아키텍처에 관한 얘기들이 많이 들려왔다.
너무 많이 들려 조금이라도 알아볼까 하고 찾아 읽어보면 와 닿지 않는 말들과 이해하기 어려운 설명들이 대부분이었다.
그러나 우테코를 하면서 아키텍처는 그냥 객체 지향을 하는 방법 중 하나구나라고 깨달았다.
우리가 4주간 역할과 책임에 따라 메소드와 클래스를 분리했던 것이 곧 아키텍처다라고 느꼈다.
클래스를 분리하고 어떤 역할과 책임들을 주느냐에 대한 기준을 세운 것이 아키텍처고 여러 아키텍처가 있는 것은 사람들마나 기준에 대한 생각이 다르기 때문이라고 생각한다.
그래서 이전까지 마냥 멀고 어렵게만 느껴졌던 단어인 아키텍처가 좀 더 친근하게 다가왔다.
이제는 이전에 와 닿지 않았던 그 설명들을 조금은 와 닿게 이해할 수 있을 것 같고 4주간 우테코에서 공부했던 것들을 앞으로 쭉 심화시켜서 공부해나간다면 아키텍처를 따로 공부하지 않더라도 어느 새 특정 아키텍처에 도달해있을 것 같다는 생각도 든다. 결국 모든 건 객체 지향이었구나!
이번 주차에선 InputView와 OutputView를 완전히 분리하여 입력과 출력은 모두 해당 클래스에서 담당해야했다. 액티비티나 프레그먼트가 아닌 콘솔 창을 뷰라고 인지하는건 사실 처음엔 좀 생소했다.
이번 4주차엔 처음부터 클래스가 나뉘어 주어지고 BridgeGame에서는 InputView와 OutputView를 사용할 수 없다는 요구사항을 지키면서 점차 뷰를 완전히 분리하는데 익숙해졌다.
처음엔 나도 모르게 OutputView가 아닌 곳에서 에러 메시지를 출력하기도 했다. 하지만 나중에 리팩토링하면서 찾을 수 있었고 뷰를 완전히 분리하는데 성공했다.
또한 뷰를 완전히 분리하고 나니 도메인 로직(메인 로직)의 메서드들은 매개변수를 받고 반환하는 방식으로만 이루어져 테스트하기가 더 용이해진다는걸 몸소 깨달을 수 있었다.
이번 4주차에 느낀 것들 중 가장 큰 두 가지에 대해 적어보았다.
이 두 가지가 특히 크게 느껴졌던 것은, 여기서 느낀 것들을 안드로이드 개발에도 적용시켜볼 수 있겠다는 느낌이 들었기 때문이다.
앞으로는 코드를 짜다 보면 분리할만한게 눈에 더 잘 들어올 것 같다. 그래서인지 이전에 짜보았던 코드들을 빨리 리팩토링 해보고 싶다.
이 외에도
- Enum Class 적극 활용
- 메서드 10줄 이내로 작성
- 회고도 refactorinig해야한다
와 같이 하고 싶은 이야기가 많았지만 가장 큰 두 가지만 적어보았다.
그래도 짧게 남겨보자면 Enum Class는 우테코에서 처음 활용해보았는데 점점 사용할 수록 분기처리 코드가 깔끔해져 기분이 좋았다.
메서드 15줄 지키기는 어렵지 않았는데 10줄을 지키는건 생각보다 생각보다 신경쓰였다. 그리고 선언부가 포함되는지 안되는지도 많이 고민되었다.
저번 코수타에서 가장 인상깊었던 말은 회고도 리팩토링해라였다. 미리미리 적고 나중에 리팩토링하며 정리하라는 말이 와닿았고 이번에 많이는 못했지만 조금은 적용해보았다.
정말 4주간의 우테코가 끝이 났다! 배워가는 것이 많아 행복했다. 이런 기회를 주심에 감사하며 앞으로도 우테코에서 배운 것을 잊지 않고 노력해야겠다!
'우아한 테크 코스' 카테고리의 다른 글
[우아한테크코스] 합격 및 온보딩 미션 후기 (0) | 2023.02.27 |
---|---|
우아한 테크 코스 최종 코딩테스트(점심 메뉴 추천) 회고 (0) | 2022.12.21 |
우아한 테크 코스 3주차(로또) 회고 (0) | 2022.11.17 |
우아한 테크 코스 2주차(숫자 야구 게임) 회고 (0) | 2022.11.09 |
우아한 테크 코스 1주차(온보딩) 회고 (0) | 2022.11.01 |