728x90
반응형
SMALL

2024/05 20

Spring Boot를 사용하는 이유

가장 중요한 건 Spring Boot는 Spring Framework와 다른게 아니다. 그저 Spring Framework를 편리하게 사용할 수 있게 기본셋과 자동화 된 작업들이 매우 많이 있을 뿐이다.  Spring Boot가 어떤걸 대신 해줄까? 대표적인 것들은 다음과 같다. 톰캣 내장 서버최적의 라이브러리 버전 관리손쉬운 빌드 구성을 위한 스타터 종속성 제공스프링과 외부 라이브러리의 버전을 자동으로 관리 (예를 들어, 스프링 부트 3.0은 A라는 외부 라이브러리의 이 버전과 잘 어울려요! 하고 알아서 맞춰 준다)자동 구성: 프로젝트 시작에 필요한 스프링과 외부 라이브러리의 빈을 자동 등록해준다.프로덕션 준비: 모니터링을 위한 메트릭, 상태 확인 기능 제공정말 여러모로 개발자 대신 많은 것들을 해준다..

Bean Scope

빈 스코프란?"스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다"고 배웠다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 말 그대로 빈이 존재할 수 있는 범위를 뜻한다. 근데 스프링은 싱글톤 스코프 외에 더 많은 범위를 제공한다.싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.웹 관련 스코프request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프application: 웹의 서블릿 ..

Bean LifeCycle Callback

스프링 컨테이너에 등록하는 빈은 생명주기를 가진다. 생각해보자. 스프링이 나 대신 빈으로 등록하고 관리해주면 등록하는 과정이나 삭제하는 과정이 분명 있는게 어찌보면 당연하다. 그리고, 스프링 빈으로 등록하고 관리하는 과정중엔 초기화 하거나 삭제할때 꼭 해줘야하는 작업이 있을수도 있다.예를 들면 데이터베이스를 사용할 때 스프링을 띄우면서 동시에 커넥션 풀에 커넥션들을 확보한다던지 스프링 서버를 내릴때 썼던 자원을 다시 반납하는 작업이라던지 이런 필수적으로 시작과 끝에 해줘야하는 작업들이 종종있다. 스프링에 내가 빈을 등록할 때 그런 작업이 필요하다면 어떻게 해야 적절하게 할 수 있을까? 스프링이 제공하는 대표적인 방법이 3가지 정도 있다.InitializingBean, DisposableBean빈 등록 초..

타입으로 조회한 빈 여러개가 모두 필요할 때 (List, Map)

이전 포스팅에 이어, 타입 하나에 여러 빈이 등록이 될 수 있는데 그 빈이 모두 필요할땐 어떻게 다뤄야 하는지를 작성하려고 한다.예를 들면 이런 경우를 보자.유저가 선택한 할인 정책에 따라, 고정 할인과 비율 할인을 둘 다 사용할 경우가 있을 수 있다. 그러니까 서비스 자체적으로 정책을 결정하는게 아니고 유저가 선택한 할인 정책에 따라 할인을 해주는 서비스가 있을 수 있다. 그땐 둘 다 필요하다. 이런 경우에는 List, Map을 사용할 수 있다. DiscountServicestatic class DiscountService { private final Map policyMap; private final List policies; public DiscountService(Map polic..

@Autowired로 자동 주입을 할 때 빈이 2개 이상 조회된 경우

인터페이스를 구현하는 구현체를 빈으로 등록할 때 2개 이상 등록하는 경우가 있을 수 있다.예를 들어, OrderService에서 사용하는 DiscountPolicy를 구현한 구현체가 fixDiscountPolicy, rateDiscountPolicy 이렇게 두개가 존재하고 이 두개가 모두 빈으로 등록되는 경우는 생각보다 많다. 그럼 자동 주입을 하는 경우 타입을 통해 빈을 조회한다. 즉, 구체클래스인 fixDiscountPolicy, rateDiscountPolicy로 조회하는게 아니라 타입인 DiscountPolicy로 조회한다는 뜻이다. 이 경우 유니크하지 않다는 에러가 발생한다. 해결하는 방법은 가장 심플하게 구체 클래스로 빈을 조회하면 되는데 이는 DIP(Dependency Inversion Pr..

스프링에서 의존관계 자동 주입하는 방법들

우선 DI가 무엇인지 어떤 장점이 있는지 왜 스프링에서 핵심 중 하나인지는 이해했다.그럼 스프링에서 이 의존관계를 주입하는 방법에 대해서 알아보려고 하는데 다음과 같은 방법들이 있다.생성자 주입setter 주입필드 주입일반 메서드 주입생성자 주입생성자를 통해서 주입하는 방법이다. 가장 중요하고 가장 많이 사용되며 가장 안전한 주입 방식이다. OrderServiceImpl@Componentpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public..

@ComponentScan

스프링을 사용할 때 스프링 빈으로 등록하는 가장 편리한 방법은 컴포넌트 스캔이다.스프링 빈으로 등록하고 싶은 타입(클래스, 인터페이스)에 그저 `@Service`, `@Controller`, `@Repository`, `@Component` 이런 애노테이션을 붙이기만 하면 스프링이 자동으로 빈으로 등록해주기 때문에. 근데, 스프링에 용빼는 재주가 있는게 아니다. 결국 스프링이 컴포넌트 스캔을 하기 위해선 어디서부터 컴포넌트 스캔을 하고 어떤것들을 제외하고 등등의 설정을 다 해줘야한다. 그리고 그것을 이 `@ComponentScan`이라는 애노테이션으로 간단하게 할 수 있다. 그리고 이건? 컴포넌트 스캔을 위해 필수적으로 필요한 애노테이션이다.  "네? 저는 스프링부트에서 저 애노테이션 안쓰고도 잘 되던데..

스프링 빈은 무상태로 설계해야 한다 ❗️

정답은 아닌데 개인적으로 맞다고 본다. 스프링은 기본적으로 스프링 빈을 싱글톤으로 등록한다.싱글톤이 안티패턴이라고까지 불릴 정도로 싱글톤은 여러 문제점이 있는데 스프링은 그 문제들을 전부 해결해준 상태로 싱글톤으로 등록해준다. 싱글톤의 문제점싱글톤을 만들어내야 하는 코드 자체가 번거롭다.의존관계상 클라이언트가 구체 클래스에 의존한다. (싱글톤클래스.getInstance())구체 클래스에 의존한다는것은 DIP(의존관계 역전 법칙)를 위반한다는 뜻이고 그 뜻은 OCP원칙을 위반할 가능성이 높다.테스트하기 어렵다자식 클래스를 만들기 어렵거나 불가능하다 싱글톤은 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든 인스턴스가 하나이고 그걸 공유하는 방식이라면 상태를 유지하게 설계하면 안된다.  무상태로 설계하거나,..

SOLID - 좋은 객체 지향 설계의 5가지 원칙

클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리했다.SRP: 단일 책임 원칙 (Single Responsibility Principle)OCP: 확장에는 열려있고 변경에는 닫혀있는 원칙 (Open/Closed Principle)LSP: 리스코프 치환 원칙 (Liskov Substitution Principle)ISP: 인터페이스 분리 원칙 (Interface Segregation Principle)DIP: 의존관계 역전 원칙 (Dependency Inversion Principle)하나씩 알아보자. SRP (Single Responsibility Principle)단일 책임 원칙이라는 뜻의 SRP. 무슨 말일까? 한 클래스는 하나의 책임만 가져야 한다.하나의 책임이라는 것은 모..

컬렉션 프레임워크 - 정렬 (Comparable, Comparator)

참고자료: 김영한의 실전 자바 - 중급 2편 | 김영한 - 인프런김영한 | 자바 제네릭과 컬렉션 프레임워크를 실무 중심으로 깊이있게 학습합니다. 자료 구조에 대한 기본기도 함께 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전www.inflearn.com 정렬자료 구조에 저장된 데이터를 정렬하는 방법을 알아보자.바로 예제를 살펴보자. SortMain1package org.example.collection.compare;import java.util.Arrays;import java.util.Comparator;public class SortMain1 { public static void main(String[] args) { Integer[] array = {..

728x90
반응형
LIST