본문 바로가기

분류 전체보기58

[Spring] ATDD 가독성 개선기 우아한 테크코스 레벨 2의 핵심 미션인 지하철 미션은 인수 테스트 주도 개발(atdd)로 진행됩니다. 인수 테스트 주도 개발은 시나리오 형태의 요구사항을 먼저 테스트 코드로 작성하여 개발하는 방법론으로 사용자가 특정 api를 호출하는 과정에서 발생하는 모든 시나리오를 테스트 코드로 작성하여 테스트 코드가 성공하면 기능 구현이 종료되는 식의 테스트 방법입니다. 정상적인 시나리오, 예외 발생 시나리오 등 모든 시나리오를 테스트한다면 직접 애플리케이션을 구동하여 일일히 테스트하는 방법보다 그 비용이 훨씬 저렴하겠죠? 하지만 인수테스트를 작성하다 보면 웹 요청을 보내는 코드가 굉장히 길고 테스트를 실행하기위해 미리 준비해야하는 다른 협력객체들로 인해 실제 테스트하고자 하는 내용이 무엇인지 헷갈리는 경우가 있습니.. 2022. 5. 23.
[Spring] 로그백을 사용하여 로그를 남겨보자 ExceptionHandler를 이용하여 에러를 핸들링할 때 에러가 어디서 발생한지 알 수 없는 이슈를 겪은 적이 있습니다. 이 문제를 해결하기 위해 모든 ExceptionHandler 메서드에 e.printStackTrace()를 사용했는데요. 개발 과정에서는 충분히 사용할 수 있지만 실제 프로그램을 운영할 때 해당 메서드를 이용해서 로깅을 하는 것은 적절하지 않다고 생각했습니다. 서버가 종료되면 어디서, 어떤 이유로 에러가 발생하는지 알 수 없기 때문입니다. 이 문제를 해결하기 위해 spring-boot-starter-web dependency에서 제공하는 logback 라이브러리를 이용하여 로깅을 남기고 로컬에 저장하는 과정을 학습해보았습니다. AS-IS @RestControllerAdvice pu.. 2022. 5. 13.
[Spring] 스프링의 일관된 예외처리 스프링에서 제공하는 데이터 접근 객체는 데이터 접근 기술을 쉽고 일관된 방법으로 사용하게 만들고자 하는 목적을 갖고 있습니다. 덕분에 데이터 접근 기술을 변경이 쉽죠. 그 중에서도 각 기술이 변경되더라도 에러 처리에 대한 걱정을 하지 않아도 되는 부분이 발군입니다. 이번 포스팅에서는 스프링이 어떤 방식으로 일관된 예외처리를 제공하는지 살펴보고자 합니다. 일관된 예외 계층 구조 스프링은 데이터 접근 기술 중심적인 예외를 일관된 방법으로 처리하는 것을 지원합니다. 아래 코드를 통해 간단히 살펴보겠습니다. jdbcTemplate에서 update 메서드를 이용하면 JdbcOperation에서 상속한 update를 이용하여 쿼리를 날립니다. JDBC api의 executeUpdate를 써서 만약 에러가 발생하면 .. 2022. 5. 12.
[SQL] 페이징 구현하기 만약 수백만건의 데이터가 있는 상태로 아래 쿼리를 호출하면 어떨까요? SELECT * FROM table; 데이터를 조회하는 시간이 굉장히 오래걸릴 뿐 아니라, 해당 데이터를 처리하는 것 또한 어려움을 느낄 것입니다. 이 문제를 해결하기 위해 데이터를 조회할 때 페이지에 따라 해당 페이지에 출력할 데이터만 조회하는 페이징을 사용합니다. 이번 포스팅에서는 가장 대중적인 방식의 페이징을 소개하고자 합니다. Offset Pagination offset Pagination은 offset과 limit를 지정하여 DB에서 출력하고자 하는 데이터 범위만큼의 데이터만 조회하는 방식입니다. 위 사진처럼 search.page=4를 지정해두고 해당 요청을 기반으로 offset을 설정해 페이지네이션을 할 수 있는 것이죠. s.. 2022. 5. 7.
[Kotlin] Kotest 사용해보기 코틀린에는 kotest라는 테스트 프레임워크가 존재합니다. 코틀린을 사용한다면 자바에서 사용하던 assertj대신 한 번쯤 kotest를 사용해보는 것도 좋다고 생각합니다. 간단히 java에서 사용하던 방식의 테스트를 작성하고 해당 코드를 kotest로 변경하는 과정을 소개해보겠습니다. Quick Start kotest는 JUnitPlatform gradle plugin을 사용합니다. 최소 4.6 버전 이상의 Gradle이 필요하기 때문에 버전을 꼭 확인해야 합니다. (최근에는 gradle 7.x 버전이 나오고 있기 때문에 새 프로젝트라면 큰 문제는 없습니다.) // gradle + groovy test { useJUnitPlatform() } // dependency testImplementation .. 2022. 5. 4.
[Spring] Transaction 추상화, 동기화 스프링은 트랜잭션을 시작(가져오기)하고, 커밋하고, 롤백하는 기능을 추상화하였습니다. 추상화 덕분에 우리는 스프링 트랜잭션을 쉽게 관리할 수 있는데요. 오늘은 스프링 트랜잭션 추상화에 대해 간단히 알아보겠습니다. public interface PlatformTransactionManager extends TransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) thr.. 2022. 4. 27.