반응형
웹 애플리케이션은 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이 싱글톤을 고집하는가? 이 이유는 바로 웹 애플리케이션은 보통 여러 고객들이 동시에 요청을 보내기 때문이다. 싱글톤이란? 단 하나의 유일한 객체를 만들기 위한 코드 패턴이다. 똑같은 인스턴스가 필요할 때, 똑같은 인스턴스를 새로 만들지 않고..
SOLID 원칙 중에서 OCP와 DIP에 대해 많이 들어봤을 것이다.OCP와 DIP를 모르는 사람을 위해 간단히 설명해보자면 OCP (Open Closed Principle) - 개방 폐쇠 원칙변경에는 닫혀 있고, 확장에는 열려 있어야 한다.즉, 확장은 가능하지만 이 확장으로 변경사항이 생겨선 안된다는 말이다.(이 내용에 대해 헷갈릴 수 있다. 아래에서 자세히 설명한다.) DIP (Dependency Inversion Principle) - 의존 역전 원칙추상화에 의존하되, 구체화에 의존해선 안된다.즉, 구현 클래스를 의존하지 말고, 추상체 (인터페이스, 추상 클래스)를 의존하라는 뜻이다. DI를 설명하기 전에 OCP와 DIP를 위반하는 상황이 뭘까?OCP와 DIP를 위반하는 경..