본문 바로가기

우아한테크코스 4기/레벨125

[레벨 1 돌아보기] 테스트 코드 작성을 위한 규칙 레벨 1 미션의 주요 학습 목표는 TDD입니다. 그 이후 모든 과제를 TDD로 수행하다보니, 좋은 테스트 코드를 작성하기 위한 규칙을 만들어야 했는데요. 레벨 1을 돌아보며 좋은 테스트 코드를 작성하기 위한 규칙을 재정립하고자 이 포스팅을 작성하게 됐습니다. 먼저 좋은 테스트 코드라는 정의를 내리기 전에 테스트 코드를 왜 작성해야 하는지가 중요합니다. 저도 지금 생각해보니 학습목표이기 때문에 관성적으로 작성했다 라는 답변이 가장 먼저 떠올랐습니다. 이건 이유가 되지 않는 것 같고 다른 이유를 좀 더 고민해보았습니다. 테스트는 왜 작성하는가? 저는 아래 3가지 이유로 테스트 코드를 작성해왔습니다. 1. 시간 단축 하나의 기능을 구현할 때마다 실제 애플리케이션을 실행한다면 얼마나 불편할까요? 특히 나중에 여.. 2022. 4. 17.
[레벨 1 돌아보기] dao 테스트 중 lock wait? 레벨 1에서의 학습목표와는 조금 동떨어진 이야기지만.. Dao를 테스트 하는 과정에서 어떤 에러를 만났습니다. com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction 에러를 확인해보니 락을 획득하기 위한 시간이 초과되어 트랜잭션을 다시 시작하라 라고 말합니다. 어떤 상황이기에 이 에러가 발생했고, 이 문제를 어떻게 해결하는지 적어보고자 합니다. 락 발생 db의 커밋 모드 설정을 수동 커밋 모드로 전환하면 특정 쿼리가 실행되는 순간 해당 세션에서 트랜잭션이 열립니다. 이를 트랜잭션 a라고 칭하겠습니다. 트랜잭션 a는 다른 트랜잭션으로 부터 격리하고 트.. 2022. 4. 15.
[레벨 1 돌아보기] 정적 팩터리 메서드 사용에 대한 고민 지난 학습로그의 말미에 아래와 같은 글을 남겼습니다. 저는 객체지향 원칙을 지키기 위해 정적 메서드 사용 자체를 줄이려고 합니다. 하지만 정적 팩터리 메서드처럼 정적 메서드의 장점을 잘 이용할 수 있는 순간에는 어김없이 static 키워드를 사용하려 합니다! 이 내용을 본 크루들이라면 정적 팩터리 메서드가 어떤 장점이 존재하는지에 대한 궁금증이 생길 것 같습니다. 저도 그렇고요. 그래서 이번 학습로그에는 레벨 1에서 제가 갖게된 정적 팩터리 메서드를 사용하는 순간에 대한 제 생각을 적어보고자 합니다. 생성자처럼 쓰는데 이름이 있다고? 자동차 경주에 만약 아래와 같은 요구사항이 있었다면 어땠을까요? 처음으로 게임에 등록한 차량은 시작 지점이 1이다. 나머지 차량은 시작지점이 0이다. 시작지점이 0인 차량과.. 2022. 4. 12.
[레벨 1 돌아보기] OOP에서의 정적 메서드 사용 레벨 1 레이싱 카 미션을 수행할 때 저는 아래와 같은 질문을 리뷰어에게 남겼습니다. static 메서드가 메모리를 일반 메서드보다 과하게 사용할 수 있을 것 같은데 static을 최소화하는 것이 좋을까요? 나름대로 좋은 질문이라고 생각했습니다. 정적 메서드는 객체를 생성하지 않고 클래스를 참조하여 메서드를 호출합니다. 그래서 정적 메서드는 사용하는 시점에 메서드 메모리 영역에 올라가는 것이 아니라 컴파일 시점에 정적 할당되어 GC의 대상이 되지 않아 프로그램에 끝날 때 까지 메모리에 유지됩니다. 저는 위와 같은 개념을 갖고 질문을 던졌던 것이죠. 하지만 일반 메서드 또한 메서드 메모리 영역에 할당 되기 때문에 정말 많은 정적 메서드가 존재하지 않는 한 메모리에 큰 차이는 없다고 생각합니다. 하지만 정적.. 2022. 4. 11.
[Java] @BeforeEach와 독립적인 단위 테스트 테스트 코드를 작성하다보면 공통적으로 갖는 상태를 필드 변수로 선언하고 @BeforeEach 애노테이션을 사용하여 각 테스트가 실행 되기 전 필드 변수를 초기화 해줍니다. 테스트 메서드마다 상태를 초기화할 수 있어 독립적으로 테스트를 유지할 수 있고 테스트가 돌아가는 지점의 코드가 간결해져 많이 이용하곤 하는데요. 정말 BeforeEach를 사용하는 것이 좋은 점만 있을까요? @BeforeEach의 사용으로 인해 발생하는 문제점을 알아보고 이 문제를 해결할 수 있는 방안에 대해 포스팅해보려합니다. BeforeEach를 사용한 테스트코드 먼저 @BeforeEach를 사용하여 테스트 픽스처를 초기화하는 테스트를 간단하게 만들어봅시다. class WalletTest { private Wallet wallet;.. 2022. 4. 6.
[Java] db 테스트 체스 5단계는 JDBC api를 사용해서 mysql db와 연동하는 미션입니다. 미션을 수행하면서 가장 핵심적인 고민이 두가지 있었는데요. Dao 레이어를 어떻게 테스트할까? Service 레이어도 결국 Dao를 사용하는데 여기는 어떻게 테스트 하지? 과거 Spring Boot에 ORM으로 JPA를 사용하는 환경에서는 aop인 @Transactional 애노테이션이 테스트 코드에서는 데이터를 롤백해줬기 때문에 데이터베이스에 테스트용 값이 무차별적으로 들어가는 것을 막을 수 있었습니다. 하지만 JDBC는 그렇지 않죠. 그렇다면 위 두 가지 고민을 왜 하는지 먼저 생각해보겠습니다. 운영 db에 무차별적으로 데이터가 들어가는게 싫음 제어할 수 없는 상황에 대한 Test를 해야함 제어할 수 없는 상황에 대한 T.. 2022. 4. 2.