728x90
반응형
SMALL

전체 글 215

외부 설정과 프로필 관리 Part.2

외부로부터 설정값들을 가져오는 방법엔 크게 4가지가 있다고 했다. OS 환경 변수자바 시스템 속성커맨드 라인 인수외부 설정 파일Part.1에서는 세가지를 배웠다. OS 환경 변수, 자바 시스템 속성, 커맨드 라인 인수.근데 배우고 보니 저 세가지 방법 모두가 코드에서 가져오는 방식이 다 다르다는 것을 깨달았다. 그럼 여기서 스프링은 이를 두고보지 않는다. 우리에게 추상화 기능을 제공해서 아주 편리하게 어떻게 설정값을 지정했던 상관없이 한 가지 방법으로 모든 방법을 사용할 수 있도록 한다. 다음 그림을 보자.스프링에서는 커맨드 라인 옵션 인수이던, 자바 시스템 속성이던, OS 환경변수이던, 설정 데이터(파일)이던 상관없이 딱 하나 `Environment` 객체를 통해서 원하는 값을 가져올 수 있다. 이 E..

외부 설정과 프로필 관리 Part.1

하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때가 있다. 대표적으로 개발이 잘 진행되고 있는지 내부에서 확인하는 용도의 개발 환경, 그리고 실제 고객에게 서비스하는 운영 환경이 있다. 이렇게 두 환경에서는 서로 다른 데이터와 서로 다른 환경을 사용한다.개발 환경: 개발 서버, 개발 DB운영 환경: 운영 서버, 운영 DB문제는 각각의 환경에 따라서 서로 다른 설정값이 존재한다는 점인데, 대표적으로 DB만 하더라도 개발 환경에서는 개발DB를 사용하고 개발DB에 접근하려면 dev.db.com 이라는 URL 정보가 필요하고 운영 환경에서 운영DB에 접근하려면 prod.db.com 이라는 URL을 사용해야 한다. 이 문제를 해결하는 가장 단순한 방법은 다음과 같이 각각의 환경에 맞게 애플리케이션을 빌드하..

라이브러리 직접 만들고 다른 프로젝트에 자동 구성으로 적용해보기

이번 포스팅에서 해 볼 내용은 라이브러리를 직접 만들고 만든 라이브러리를 스프링 부트 프로젝트에 적용하는데 자동 구성으로 적용해보는 방법을 작성해 보고자 한다. 왜 라이브러리를 직접 만들어보냐면, 이 라이브러리를 직접 만들고 제공하는 제공자 입장이 되어야 왜 스프링 부트의 자동구성이 필요하고 얼마나 효율적인지를 알게 되기 때문이다. 가정을 해보자:스프링 부트를 사용하는 프로젝트를 진행중인 회사에서 누군가가 라이브러리를 만들었는데 그 라이브러리가 너무 좋아서 이팀 저팀에서 모두 그 라이브러리를 가져다가 사용하고 싶다는 요청이 들어왔다고 가정해보자.  우선 라이브러리를 간단하게 만들어보자. 이 라이브러리는 현재 시스템의 메모리 상태를 알려주는 라이브러리다.나만의 라이브러리 만들기build.gradleplug..

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`이라는 애노테이션으로 간단하게 할 수 있다. 그리고 이건? 컴포넌트 스캔을 위해 필수적으로 필요한 애노테이션이다.  "네? 저는 스프링부트에서 저 애노테이션 안쓰고도 잘 되던데..

728x90
반응형
LIST