💡 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하고 작성한 후기입니다. 목차배경친구의 추천으로 지난 5주간 넥스트스탭의 TDD, 클린 코드 with Kotlin 8기를 수강했다. 일반적인 강의보다 수강료가 비싼만큼 가격 부담이 돼서 고민을 했지만, 결과적으로 유의미한 시간이였고 많은 성장도 했다. (강의 수강 기간: 2024년 11월 12일 ~ 12월 23일) 강의 내용은 코틀린의 언어적 특징과 함께 TDD에 대한 설명으로 이루어졌고 주 1회 온라인 강의를 수강하는 방식이였다. 이외 시간은 4개의 미션을 주차별로 구현하고 리뷰어에게 코드리뷰를 받는 방식으로 구성됐다. 온라인 강의보다는 미션 구현과 코드리뷰가 강의의 주 내용이다. 미션의 구현 난이도는 기술적으로 엄청난 역량을..
목차배경최근 회사가 속한 그룹사 차원에서 진행중인 프로젝트에 참여중이다. 프로젝트 일정은 굉장히 타이트하다. 담당하고 있는 모든 영역에 대해 한달 내로 분석과 개발, 테스트까지 완료하고 배포가 나가야했다. 프로젝트 초반, 영향 범위가 별로 많지 않을 것이라는 기대와 달리 분석을 하면 할수록 영향 범위가 늘어났다. 처음 예상과 달리 모든 영역(화면과 배치 시스템)에 수정이 가해져야했다. 한 달내로 분석과 개발을 마무리하고 테스트까지 완료하기에는 불가능할 것이라는 판단을 내리고, 팀과 기획자에게 이슈잉을 했다.내용프로젝트 진입 초기에는 수정 범위가 적을 것이라는 예상을 하고 참여하게 되었다. 하지만 프로젝트 배경에 대한 설명을 듣고, 담당하는 프로젝트의 소스코드를 분석하다보니, 모든 프로젝트가 영향 범위에 ..
💡 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하며 정리한 내용입니다. 목차배경TDD, 클린 코드 미션을 진행하며 객체지향 설계에 대한 많은 고민을 하고 있다. 이번에는 잘못된 설계로 인해 발생한 양방향 의존성 사례를 살펴보고, 양방향 의존성으로 인해 발생하는 문제와 해결 방법에 대해 정리하였다. 내용미션을 진행하며, 양방향 의존관계가 발생하고 있다는 피드백을 받았다. 기능 구현에만 신경쓰다보니, 설계를 놓쳤는데 이번 기회에 양방향 의존성에 대한 문제점과 해결 방안을 알아볼 수 있었다. 기존 코드와 문제점양방향 의존성이 발생한 코드는 다음과 같다.Rows.ktclass Rows( val rows: List,) { fun updateMineCounts(): Rows..
💡 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하며 정리한 내용입니다. 목차Wrapping Class객체 지향 설계를 따르다보면, 때로는 도메인별 특정 유형을 만들기 위해 값을 클래스로 래핑하는 것이 유용하다. 예를 들어 영화 제목과 티켓 가격을 나타내는 Movie 클래스를 가정해보자.class Movie( val name: String, val ticketPrice: Long,)이 때 도메인에 특화된 설계를 위해서 영화 표 가격 타이블 Long으로 두는 것 대신 이를 래핑(Wrapping)하는 Price 클래스를 둘 수 있다.class Movie( val name: String, val ticketPrice: Price,)class Price( val price: Long..
목차배경최근 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기를 수강하며, 가능한 함수형 프로그래밍을 따르고 불변 객체로 설계하며 과제를 수행하고 있다. 최근 몇 년간, Java 8부터 도입된 Stream API와 코틀린의 일급 시민, 람다 표현식 등 등 함수형 프로그래밍은 새로운 패러다임으로 떠오르고 있는데, 그 중 불변 객체는 함수형 프로그래밍의 패러다임과 잘 맞는 중요한 구현 방안 중 하나이다. 이번 글에서는 불변 객체 설계와 그 예시, 장점과 단점을 살펴본다.예시value 값을 갖는 Element 인터페이스를 작성해보자. 이 인터페이스를 구현하는 방안은 가변과 불변에 따라 두 가지로 나뉜다. 먼저 가변 객체로 설계하고 구현하는 방안은 다음과 같다. updateValue() 메서드를 호출..
💡 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하며 정리한 내용입니다. 목차배경최근 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기를 수강하면서 단위 테스트와 테스트 코드 작성에 새로운 관점을 얻어가고 있다. 덕분에 평소 고민해보지 못했던 주제에 대해서 생각해볼 기회를 얻고 있다. 이번에는 그 중 단위 테스트 작성을 위한 테스트 코드의 가독성에 대한 리뷰 내용이다. 내용4주차 미션을 진행하면서 테스트 코드와 가독성에 대한 피드백을 받았다. 테스트 코드에 일련의 로직이 들어가면 가독성과 유지보수에 어려움이 발생하고, 다른 개발자가 봤을때 정책과 로직 파악에 어렵다는 것이다.테스트 코드는 한번에 내려가며 읽고 끝낼 수 있는 것이 좋습니다. 테스트 코드에 일련의 로직..
목차배경코틀린은 개발자의 편의를 위해 자주 쓰이는 로직(단순 조건 체크과 예외 throw 등)을 매번 구현할 필요없이 손쉽게 사용할 수 있는 간편한 많은 기능을 제공한다. 이번에는 그 중 구문에 대한 체크와 예외 처리를 간편하게 할 수 있는 check(), require(), checkNotNull(), requireNotNull()를 살펴본다.check()안에 있는 구문이 false라면 IllegalStateException를 던진다. 해당 메서드의 구현을 살펴보면 다음과 같다. Boolean 타입의 체크할 조건을 value를 매개변수로 받고 조건을 만족하지 않으면 전달받은 함수 lazyMessage를 실행하여 예외 메시지(message)를 생성한다. 생성한 예외 메시지를 통해 IllegalState..
목차배경최근 많은 국내 IT 회사에서는 점차 JVM 기반 언어인 Kotlin을 도입하고 있다. 이번에는 Java가 처음 등장한 배경을 빌드 과정과 실행 방식을 통해 살펴보고, JVM 기반 언어란 무엇인지, 이를 배경으로 Kotlin의 동작 방식과 실행 원리는 어떠한지 살펴본다. C++의 빌드 과정Java의 빌드과정과 실행 원리를 살펴보기 위해서, C++의 빌드 과정을 먼저 살펴보자.Java가 등장하기 전, C++는 각 환경별로 실행되는 컴파일러가 각각 존재했다. 운영 체제별로 서로 다른 컴파일러가 소스 코드를 읽어들이고, 운영체제에 최적화된 바이너리를 만들어 냈다. 즉, 윈도우에서는 윈도우 C++ 컴파일러인 MSVC 컴파일러가 윈도우에 최적화된 바이너리를 만든다. 리눅스에서는 리눅스 C++ 컴파일러인 G..
💡 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하며 정리한 내용입니다. 목차배경TDD, 클린 코드 미션을 진행하며 TDD와 클린 코드, 객체지향 설계에 대한 인상 깊은 많은 피드백을 받을 수 있었다. 이번에는 그 중 하나인 객체지향 설계 중 클래스 네이밍에 대한 얘기이다. 클래스클래스가 객체를 인스턴스화한다. 클래스는 객체의 팩토리이다. (객체가 살아있는 생명체라면 클래스는 객체의 어머니) 클래스 네이밍클래스의 이름은 무엇을 하는지에 대한게 아닌 무엇인지에 기반을 두고 지어야 한다. 즉, 올바른 클래스 이름을 짓기 위해선 클래스의 객체가 무엇을 캡슐화할 것인지 관찰하고 적절한 이름을 지어야한다. 즉 이를 통해, 외부에서 객체에게 무엇을 하도록 메시지를 던지면 객체 스스로 무..
💡 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하며 정리한 내용입니다. 목차배경최근 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하고 있다. 아직 1주차 밖에 지나지 않았지만, 1주차 과제 중 테스트 코드 작성과 관련되어 리뷰어분께 좋은 내용을 전달받았고, 덕분에 많은 생각을 할 수 있게 되었다. 먼저, 당시 나는 콘솔 출력을 포함하는 로직은 테스트 코드로 어떻게 검증할 수 있을지, 테스트 코드 작성을 어떻게 해야할지 헤맸고 리뷰어분에게 도움을 요청했다. 리뷰어분은 해결 방법을 알려주기에 앞서 '왜 테스트 코드를 작성해야하는가?'에 대한 애기를 해주었다. 테스트 코드가 무엇을 확인하기 위함이고, 그게 테스트 코드로 확인이 필요할만큼 복잡하고 중요한..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차SELECT FOR UPDATE읽기 작업(Read) 중 조회하는 레코드(Row)에 잠금(Lock)을 걸기 위해서 이 구문을 사용할 수 있다. 이 SELECT FOR UPDATE 구문을 사용하면 다른 트랜잭션에서 Lock을 건 Row에 대한 변경(Exclusive Lock)과 FOR UPDATE 조회를 방지할 수 있다. 하지만 변경과 조회에 대해 Lock을 걸기 때문에 함부로 사용하면 DeadLock이 발생할 수 있다. 반면 동시성 이슈가 발생하는 상황에서 유용하게 사용될 수 있다. 예를 들어 티켓팅을 하면 사용자가 동시에 접근한다. 이때 티켓 판매 상태에 대해 유용하게 샤..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차배경데이터베이스를 다루는데 가장 중요하고 핵심 개념인 Lock과 DeadLock에 대해서 알아본다. Lock은 데이터 정합성을 보장하고 동시성 이슈를 해결할 수 있는 방식 중 하나이며 서버 개발에서 가장 중요한 부분이다. 또한 Lock을 다루면서 DeadLock이 발생하는 케이스와 이를 예방하는 방법을 알아본다. MySQL Lock일반적으로 하나의 DB 서버에는 여러대의 애플리케이션이 붙어서 동작하게 된다. 이러한 상황에서는 Race Condition(경합상태)와 같은 동시성 이슈가 발생할 수 있는데, MySQL을 비롯한 관계형 데이터베이스는 이러한 상황에서 애플리케이션의..