웹 애플리케이션은 Controller, Service, Repository 계층이 있고 각 계층 별로 역할이 있다.스프링 테스트는 일전에 작성했던 경험이 없어 @SpringBootTest 어노테이션 밖에 몰랐는데Controller, Service, Repository 계층을 테스트하는 상황에 매번 사용하지 모든 빈들을 등록하고 내장된 톰캣까지 실행해야 할까?라는 생각이 들었고 이러한 문제를 해결할 수 있는 방법을 찾아 봤다.그 결과 스프링은 이러한 문제를 해결할 수 있도록 도와주는"레이어 별로 잘라서 특정 레이어에 대해서 Bean을 최소한으로 등록해 사용할 수 있는 테스트" 어노테이션을 제공하고 있었다.그리고 이러한 테스트를 슬라이스 테스트라고 한다. 스프링이 지원해주는 테스트 어노테이션을 알아보고 각 ..
설명에 사용할 예시 코드 온라인 쇼핑몰에서 정률 할인과 정액 할인이 있다고 가정해보자. 그렇다면 다음과 같이 할인 정책 인터페이스와 각각의 구현체가 있을 것이다. 아래는 결제를 도와주는 결제 서비스 레이어이다. PaymentService에서 DiscountPolicy 인터페이스를 Autowired로 의존성 주입 받고 있다. (참고로 생성자가 하나면 @Autowired를 생략가능하다.) 이 때 @Autowired는 의존성 주입을 하기 위해 내부적으로 해당 객체의 타입 DiscountPolicy로 스프링 컨테이너에서 Bean을 조회한다. 그런데 DiscountPolicy를 구현한 Bean 등록된 구현체는 FlatDiscountPolicy와 RateDiscountPolicy 2개가 있다. (이미 인텔리제이가 ..
스프링 컨테이너는 객체를 Bean으로 등록해 싱글톤으로 관리한다. 동일한 객체가 매번 생성되지 않고 하나만 생성해 공유해 사용하는 이 싱글톤 방식은 메모리를 효율적으로 관리할 수 있다 하지만 주의할 점이 있다. 이번 포스팅에서는 스프링 싱글톤 방식에서 주의해야할 점에 대해 다뤄보려한다. 싱글톤 방식에서 주의할 점 싱글톤 방식은 하나의 객체를 여러 스레드가 공유한다. 이 공유한다는 점에서 주의할 점이 있다. 하나의 객체를 여러 스레드가 공유하기 때문에 객체의 필드 (상태)까지 공유 될 수 있다. 즉, 스프링 컨테이너에 Bean으로 등록되는 객체(Bean)은 무상태(stateless)로 설계해야한다. 만약 상태를 갖게 설계하면 어떤일이 벌어질까? 글만 보는 것보다 예시를 보는 것이 더 쉽게 이해될 것이다. ..
위 코드를 보면 new 키워드로 객체를 반환하고 있다. 그렇다면 orderService()를 2번 호출하면 OrderService와 OrderRepository가 2번씩 생성되지 않을까? 결론부터 말하면 아니다. orderService()와 orderRepository()가 호출될 때 위 처럼 메시지가 출력되도록 했다. 어떻게 나올까? 2번씩 호출되는 것이 아니라 1번 씩 호출된다. 즉 싱글톤이 보장되었다. @Configuration 어노테이션 @Configuration 클래스 내에 정의된 메소드들 중 @Bean 어노테이션이 붙은 메소드들은 스프링 컨테이너에 의해 빈(bean)으로 등록되고 이러한 빈들은 스프링 컨테이너에 의해 관리된다. 또한 @Configuration 어노테이션이 붙은 클래스는 스프링 ..
Spring은 왜 싱글톤을 고집할까? Spring은 온라인 서비스 기술을 지원하기 위해 생겨났다. 대부분의 온라인 서비스는 웹 애플리케이션으로 이루어져있다. 요즘은 웹이 아닌 어플이 대세 아니야? 라고 할 수 있다. 하지만 대부분의 회사들은 회사를 소개하거나 문의를 받는 웹 페이지가 꼭 하나씩 있다. 그렇다고 앱을 만들지 못하는 것은 아니다. 필자가 앱을 개발해보진 않았지만 Kotlin + Spring을 사용하면 앱 서비스를 개발할 수 있다. 그렇다면 왜 Spring이 싱글톤을 고집하는가? 이 이유는 바로 웹 애플리케이션은 보통 여러 고객들이 동시에 요청을 보내기 때문이다. 싱글톤이란? 단 하나의 유일한 객체를 만들기 위한 코드 패턴이다. 똑같은 인스턴스가 필요할 때, 똑같은 인스턴스를 새로 만들지 않고..
ELK 도입 이유 ELK가 무엇인지에 대해 알아보고 싶다면 아래 포스팅을 참고. [ELK] ElasticSearch란? ELK란? 내부 구조, 장단점, RDB와 차이 ElasticSearch란? Elasticsearch는 Apache Lucene기반의 Java 오픈 소스 분산 검색 엔진이다. Elasticsearch를 통해 방대한 양의 데이터를 신속하게(거의 실시간) 저장, 검색, 분석을 수행할 수 있다. Elasticsearch는 hstory0208.tistory.com ELK를 적용한 이유 필자의 쇼핑몰 서비스는 아래 처럼 사용자 서버와 관리자 서버가 분리되어 있다. 이렇게 분리된 서버를 관리하기 위해서 ELK를 적용하기전에는 어디서 어느 시점에 장애가 발생했는지 확인하려면 실행되는 서비스의 로그를 ..