전체 글

책/Effective Kotlin

[이펙티브 코틀린] 아이템16: 프로퍼티는 동작이 아니라 상태를 나타내야 한다

본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다. 1. 코틀린의 프로퍼티 vs 자바의 필드 둘 다 데이터를 저장한다는 공통점이 있지만, 다음과 같은 차이가 있다. 1) 자바 필드는 "데이터" 자체를 의미한다. 데이터를 실제로 저장하거나 접근하기 위해선 getter와 setter를 추가적으로 선언해줘야 한다. 2) 프로퍼티는 개념적으로 접근자를 나타낸다. 추가적으로 프로퍼티는 필드보다 확장된 개념, 즉 프로퍼티 = 필드(Optional) + 접근자이다. val의 경우 getter, var의 경우 getter와 setter를 나타낸다. 이러한 이유로 인터페이스에서도 다음과 같이 프로퍼티를 정의할 수 있다..

Spring/Spring

[Spring] 로컬 캐시의 영향 없이 테스트 환경 구축하기

1. 개요 Spring에서 제공하는 로컬 캐시를 사용하면 간단하게 성능을 향상시킬 수 있다. 그러나 로컬 캐시의 특성상 메모리에 데이터를 저장하므로 테스트 수행 시엔 예상치 못한 결과를 얻을 수 있고, 이는 테스트의 멱등성을 깨뜨리게 된다. 다음과 같이 상품의 재고 소진 여부를 체크하는 코드가 있다. 재고가 한 번 소진되면 다시 복구되는 일은 잘 없으므로 로컬 캐시를 적용했다고 가정해보자. (실제로는 서버가 한 대가 아니고서야 로컬 캐시 대신 글로벌 캐시를 적용하는 편이 좋을 것이다) @Cacheable(value = ["item"], key = "#itemId") fun isSoldOut(itemId: String): Boolean { return itemRepository.existsInventory..

Spring/Spring

[Spring] 스프링의 테스트 컨텍스트 캐싱(Spring TestContext Caching)에 대해 알아보자

1. 개요 Spring은 테스트에 사용되는 애플리케이션 컨텍스트를 생성/관리/적용해주는 기능을 가진 테스트 프레임워크를 제공하며, 이를 Spring TestContext Framework라고 한다. Spring TestContext Framework는 다양한 기능들을 제공하는데, 이 중 대표적인 것이 바로 테스트 컨텍스트 캐싱(TestContext Caching)이다. 본격적으로 알아보기에 앞서 테스트 컨텍스트의 의미에 대해 한 번 짚어보자. 사실 정확히 말하자면 '테스트 컨텍스트'는 테스트에서 사용되는 애플리케이션 컨텍스트(= ApplicationContext or WebApplicationContext)를 생성하고 관리해주는 오브젝트를 가리키는 용어다. 그러나 테스트가 사용하는 애플리케이션 컨텍스트도..

Spring/Spring

[Spring] @ContextConfiguration이란?

1. 개요 @ContextConfiguration은 통합 테스트 환경에서 ApplicationContext를 어떻게 로드하고 설정할지를 결정하는 데 사용되는 클레스 레벨의 애너테이션이다. 주로 테스트 환경에서 @SpringBootTest를 이용해 전체 빈을 로딩하는 대신 가벼운 컨텍스트 환경을 구성하기 위해 사용된다. 이 애너테이션을 사용하면 일부 클래스만을 빈으로 등록하여 단일 클래스에 대한 테스트 실행 속도를 향상시킬 수 있다. 추후 다른 포스팅에서 다룰 예정인데, 이렇게 @ContextConfiguration을 사용하여 임의의 컨텍스트를 지정하면 여러 개의 컨텍스트가 생성되어 Test Context Caching의 효율이 떨어질 수 있으므로 단일 테스트 클래스의 실행속도는 빨라진다 하더라도 전체 테..

책/Effective Kotlin

[이펙티브 코틀린] 아이템9: use를 사용하여 리소스를 닫아라

본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다. 1. use를 사용하여 Closeable 리소스 닫기 close 메서드를 사용해서 명시적으로 닫아야 하는 리소스들이 있다. InputStream / OutputStream java.sql.Connection java.io.Reader(FileReader, BufferedReader, CSSParser) java.new.Socket과 java.util.Scanner 위 친구들은 AutoCloseable을 상속받는 Closeable 인터페이스를 구현하고 있다. Closeable의 구현체들은 반드시 close()를 호출해서 리소스를 반납해줘야 하는데, 이는..

코택
TaxFree