본문 바로가기
관리자

Programming-[Backend]/Spring

(76)
[스프링 기초] 16. 빈 스코프 : Prototype Scope와 Provider 1. 기본 스코프 기본적으로 적용되는 스코프는 앞서 배운바와 같이 싱글톤 스코프이다. 메모리의 낭비 방지, Stateless 설계를 위해서 싱글톤이 필요하다는 것을 배웠었다. 싱글톤 스코프 외에 프로토 타입 스코프도 있다. 프로토타입 스코프 빈은 요청 시마다 개별적인 인스턴스를 반환하기 때문에 사용자의 요청에 따라 계속해서 새로운 객체를 반환해야할 때 쓴다(많이 사용되지는 않는다). @Scope("singleton"), @Singleton("prototype") 으로 빈 스코프를 설정해줄 수 있다(default는 싱글톤 빈). 싱글톤 스코프와 프로토타입 스코프를 아래에서 비교해보자. 싱글톤 스코프 기본적으로 적용되며, 컨테이너의 시작과 종료까지 유지된다. 요청 횟수에 관계없이 1개의 인스턴스만 반환한다...
[스프링 기초] 15. 빈 생명주기 콜백 : initMethod, destroyMethod, @PostConstruct, @PreDestroy 1. 기본 개념 빈 생명주기 콜백은 빈이 생성되거나 소멸되는 시점에 설정해둔 메서드가 실행되게 함으로써 초기 설정을 해주거나, 연결을 종료하는 등의 기능을 한다. 스프링 빈은 '객체 생성 -> 의존관계 주입' 의 2단계를 거치게 되는데(생성자 주입의 경우 한번에 처리), 의존관계 주입 후 값을 설정해주는 단계를 초기화 단계라고 한다. 이 초기화 단계를 알리기 위해 스프링 빈은 의존관계 주입 후 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 그리고 스프링은 스프링 컨테이너가 종료되기 전에도 소멸 콜백 메서드를 제공한다. 이렇게 객체의 생성과 초기화가 분리된 이유는 SRP의 원칙을 지키기 위해서이기도 하고, 초기화 작업이 외부와 커넥션을 연결하는 등 무거운 작업을 하기도 하기 때문이다..
[수정중][스프링 기초] 14. 여러 개의 빈이 있을 때 자동주입하기, @Primary, @Qualifier, NoUniqueBeanDefinitionException 1. 여러 개의 빈이 존재할 때 에러 발생 : NoUniqueBeanDefinitionException @Autowired 어노테이션은 빈을 타입을 기준으로 조회한다. 그래서 두 개 이상의 같은 타입의 빈이 존재할 때는 NoUniqueBeanDefinitionException이 발생한다. 아래 코드로 확인해보자. PlanServiceImpl 클래스는 CreatureRepository와 CaringPolicy를 생성자 주입받도록 되어있는 상황이다. 이중 CaringPolicy는 FixedCaringPolicy, RateCaringPolicy의 2개의 구현체를 갖고 있다. 각 구현체는 @Component 어노테이션을 통해 @ComponentScan에 의해 Scan되며, CaringPolicy 인터페이스를 i..
[스프링 기초] 13. 의존관계 주입 : 4가지 방법 의존관계 주입방법은 크게 4가지이다. 생성자 주입 수정자 주입 필드 주입 일반 메서드 주입 1. 생성자 주입 가장 많이 사용하고 효용성이 있는 방법이다. 생성자 호출 시점에 1번만 호출되는 것이 보장된다. 즉 불변, 필수 의존관계에 사용한다. 가장 많이 사용되는 방식이다. 생성자가 1개만 있으면 @Autowired를 생략해도 빈이 자동으로 주입된다. final을 사용하자 필수적이고 불변하는 관계이므로, 주입받는 객체를 final로 선언하는 방식을 주로 적용한다. 이렇게 하는 이유는, final 키워드 없이 선언 시에 생성자부분에서 오타가 발생하거나, 의존관계에 대한 부분을 작성하는 것을 누락하는 경우가 발생할 수 있기 때문이다. 이런 상황에서는 컴파일 이후에야 잘못된 부분을 찾을 수 있는데, final ..
[스프링 기초] 12. 컴포넌트 스캔(Component Scan) 1. 컴포넌트 스캔 개념 @ComponentScan, @Component 이때까지 컨테이너의 설정 정보 작성은 적은 수의 스프링 빈으로 작성하였다. 그러나 실무에서는 수 십, 수 백개의 빈들을 등록하고, 관리해야되는 문제가 발생한다. 스프링은 이런 문제를 해결하기 위해 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다. @ComponentScan은 말그대로 @Component 애노테이션이 붙은 클래스들을 스캔한다. @Configuration 내부에 있는 @Component도 스캔하므로, @Configuration은 filter로 제외한다(예제 코드상 다른 위치에 @Configuration이 붙어있는 클래스가 있기 때문). 이때 스프링 빈의 기본이름은 해당 클래스명을 맨 앞글..
[스프링 기초] 11. 싱글톤(Singleton) 1. 싱글톤 개념 Spring으로 다른 애플리케이션을 개발할 수도 있지만, 보통은 웹 애플리케이션을 개발한다. 그리고 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 요청때마다 계속 객체가 생성되고 소멸되는 형태인데, 이렇게 되면 메모리 낭비가 심하다. 그러나 순수한 자바가 아닌 스프링을 이용하면 클래스의 인스턴스가 1개만 생성되어 그것을 공유해서 사용하게 된다. 이러한 방식을 싱글톤 패턴이라고 한다. 싱글톤 적용 기본 원리 이러한 싱글톤 방식을 구현하기 위해서, 자바의 private 접근 지정자 방식을 활용한다. 어떤 클래스가 호출되었을 때 적용되는 생성자를 private으로 처리해서 외부에서 해당 클래스의 인스턴스가 만들어지는 것을 막는다. 이렇게 해서 new 키워드를 통해서 인스턴스가 만들..
[스프링 기초] 10. Bean Factory와 BeanDefinition 1. BeanFactory와 ApplicationContext BeanFactory는 Spring에서 사용하는 컨테이너들의 최상위 컨테이너이다. ApplicationContext는 BeanFactory의 모든 기능들을 상속받을 뿐 아니라, MessageSource, EnvironmentCapable, ApplicationEventPublisher, ResourceLoader 등의 부가기능들을 상속받는다. 그래서 보통 BeanFactory를 사용하기보단 Application Context를 사용한다. 부가기능 MessageSource : 메시지를 공통화 하고, 다른 국가권에서 접속 시에 언어를 변경해서 출력할 수 있도록 해준다. EnvironmentCapable : 로컬, 개발, 운영 등을 구분해서 처리할..
[TIL] 커스텀 Exception 만들기 : @ExceptionHandler, @ResponseStatus, @RestControllerAdvice, super() 1. 목적과 상황 클라이언트에서 온 HttpRequest에 대해서 Exception을 통해 Http status와 Json 코드를 HttpResponse로 반환하고자 한다. 다음 코드와 같이 특정 엔티티 객체를 찾고자 했는데, 못찾았을 경우 orElseThrow()를 통해 특정 Exception을 반환하는 상황이다. XxxEntity xxxEntity = xxxRepository.findById(id) .orElseThrow(() -> new CustomException("xxx.error.not.found")); CustomException은 여러가지 Exception들을 한 번에 모아놓고 @RestControllerAdvice로 처리하는 클래스 파일 내부에 정의한다. @Slf4j @RestContro..