Spring Core/02. Spring Container와 DI
-
이번 포스트에서는 Spring이 관리하는 빈의 생명주기(Life Cycle)에 대해 살펴보자. 빈의 생명 주기 빈의 생명 주기 스프링의 빈은 다음과 같은 생명 주기를 갖는다. 생성자를 호출하여 객체를 생성한다. 1의 과정을 통해 생성자 주입을 하거나 별도의 setter 메서드를 이용해서 의존성을 주입한다. 아직 빈을 활용하기 이전에 초기화 메서드를 실행한다. 빈을 사용한다. 빈을 다 사용한 후 소멸 메서드를 실행한다. 초기화 및 소멸 메서드 초기화 메서드와 소멸 메서드에 대해 살펴보자. 초기화 메서드 소멸 메서드 주요 용도 빈에서 사용하려는 자원의 초기화 빈에서 사용한 자원의 정리 호출 시점 의존성 주입 후 비지니스 로직이 호출되기 전 모든 비지니스 로직이 종료된 후 작성 방법 명시적 빈 등록: @Pos..
07. 빈의 생명주기이번 포스트에서는 Spring이 관리하는 빈의 생명주기(Life Cycle)에 대해 살펴보자. 빈의 생명 주기 빈의 생명 주기 스프링의 빈은 다음과 같은 생명 주기를 갖는다. 생성자를 호출하여 객체를 생성한다. 1의 과정을 통해 생성자 주입을 하거나 별도의 setter 메서드를 이용해서 의존성을 주입한다. 아직 빈을 활용하기 이전에 초기화 메서드를 실행한다. 빈을 사용한다. 빈을 다 사용한 후 소멸 메서드를 실행한다. 초기화 및 소멸 메서드 초기화 메서드와 소멸 메서드에 대해 살펴보자. 초기화 메서드 소멸 메서드 주요 용도 빈에서 사용하려는 자원의 초기화 빈에서 사용한 자원의 정리 호출 시점 의존성 주입 후 비지니스 로직이 호출되기 전 모든 비지니스 로직이 종료된 후 작성 방법 명시적 빈 등록: @Pos..
2024.02.23 -
이번 포스트에서는 빈의 스코프에 대해 살펴보자. 빈의 스코프(Scope) 축 개업! 새롭게 하나의 CoffeeShop을 개업한다고 생각해보자. CoffeeShop에는 Barista가 근무할텐데 이 Barista는 손이 엄청 빠르기 때문에 아무리 많은 주문이 들어와도 순식간에 처리할 수 있다. 즉 맛있게 커피를 만들 수 있는 단 한 명만 필요하다. 그리고 CoffeeShop은 인기가 많아서 엄청나게 많은 Coffee가 팔리고 있다. 일단 이 일과 관련된 3개의 클래스를 작성해보자. @Data public class Coffee { private final String client; private final String name; } public class Barista { public Coffee make..
06. 빈의 스코프이번 포스트에서는 빈의 스코프에 대해 살펴보자. 빈의 스코프(Scope) 축 개업! 새롭게 하나의 CoffeeShop을 개업한다고 생각해보자. CoffeeShop에는 Barista가 근무할텐데 이 Barista는 손이 엄청 빠르기 때문에 아무리 많은 주문이 들어와도 순식간에 처리할 수 있다. 즉 맛있게 커피를 만들 수 있는 단 한 명만 필요하다. 그리고 CoffeeShop은 인기가 많아서 엄청나게 많은 Coffee가 팔리고 있다. 일단 이 일과 관련된 3개의 클래스를 작성해보자. @Data public class Coffee { private final String client; private final String name; } public class Barista { public Coffee make..
2024.02.22 -
이번 포스트에서는 Profile에 대해 살펴보자. 환경의 분리와 프로파일 실제 프로젝트를 진행하다보면 다양한 개발 환경의 복잡성을 경험하는 것은 불가피하다. 일반적으로 DB를 이용해서 개발할 때 개발자들은 자신의 로컬 DB에서 작업을 시작해서 테스트 서버에서 기능을 검증하고 최종적으로 운영 환경에서 애플리케이션을 서비스한다. 이 과정에서 비지니스 로직 자체는 거의 변하지 않지만 DB 주소, 비밀번호등 인프라 관련 설정은 각 단계(환경)마다 크게 달라질 수 있다. 이런 상황에서 각 환경에 맞춰 설정 파일을 수시로 수정하는 작업은 상당히 번거롭다. 이런 문제를 해결하기 위해 환경에 따른 설정을 미리 준비해두고, 필요에 따라 적절한 설정으로 손쉽게 교체할 수 있다면 개발 및 배포 과정이 훨씬 간결하고 효율적으..
05. Profile이번 포스트에서는 Profile에 대해 살펴보자. 환경의 분리와 프로파일 실제 프로젝트를 진행하다보면 다양한 개발 환경의 복잡성을 경험하는 것은 불가피하다. 일반적으로 DB를 이용해서 개발할 때 개발자들은 자신의 로컬 DB에서 작업을 시작해서 테스트 서버에서 기능을 검증하고 최종적으로 운영 환경에서 애플리케이션을 서비스한다. 이 과정에서 비지니스 로직 자체는 거의 변하지 않지만 DB 주소, 비밀번호등 인프라 관련 설정은 각 단계(환경)마다 크게 달라질 수 있다. 이런 상황에서 각 환경에 맞춰 설정 파일을 수시로 수정하는 작업은 상당히 번거롭다. 이런 문제를 해결하기 위해 환경에 따른 설정을 미리 준비해두고, 필요에 따라 적절한 설정으로 손쉽게 교체할 수 있다면 개발 및 배포 과정이 훨씬 간결하고 효율적으..
2020.06.17 -
묵시적 DI 앞선 포스트에서 @Configuration과 @Bean을 이용해서 명시적으로 빈을 선언하는 방법에 대해 알아보았다. 이 방식은 빈 설정이 빈 클래스 외부 즉 @Configuration 클래스에 존재하는 형태로 비지니스 로직과 빈 관리 로직이 잘 분리되어 관심사의 분리라는 주제에 아주 이상적이다. 단 이 방식은 빈을 만들 때 마다 설정 파일에 명시적으로 빈을 선언해주어야 한다. 묵시적 빈 설정 묵시적인 빈 설정 방식은 빈으로 사용할 클래스에 @Component 라고 선언한다. 즉 빈에 대한 설정이 빈 클래스 내부에 존재하기 때문에 관심 사항의 분리라는 부분에서는 일보 후퇴하는 복합적인 관심사를 다루게 된다. @Component라고 선언된 클래스는 바로 빈이 되는것은 아니고 뒤에서 언급할 @Co..
04. DI 처리 - 묵시적 DI묵시적 DI 앞선 포스트에서 @Configuration과 @Bean을 이용해서 명시적으로 빈을 선언하는 방법에 대해 알아보았다. 이 방식은 빈 설정이 빈 클래스 외부 즉 @Configuration 클래스에 존재하는 형태로 비지니스 로직과 빈 관리 로직이 잘 분리되어 관심사의 분리라는 주제에 아주 이상적이다. 단 이 방식은 빈을 만들 때 마다 설정 파일에 명시적으로 빈을 선언해주어야 한다. 묵시적 빈 설정 묵시적인 빈 설정 방식은 빈으로 사용할 클래스에 @Component 라고 선언한다. 즉 빈에 대한 설정이 빈 클래스 내부에 존재하기 때문에 관심 사항의 분리라는 부분에서는 일보 후퇴하는 복합적인 관심사를 다루게 된다. @Component라고 선언된 클래스는 바로 빈이 되는것은 아니고 뒤에서 언급할 @Co..
2020.06.17 -
스프링은 DI를 어떻게 처리할까? 다음의 그림을 살펴보자. 개발자는 비즈니스 로직을 담은 빈(Bean)들을 POJO 형태로 작성한다. 개발자는 각 빈들을 어떻게 생성하고 has-a 관계를 맺어줄지에 대한 설명서인 메타정보를 작성해서 스프링 컨테이너에게 전달한다. 스프링 컨테이너는 메타정보에 근거해 빈 객체를 만들고 setter/생성자를 호출해서 의존성을 주입한다. 클라이언트 코드에서 컨테이너에게 빈을 요청하면 컨테이너는 관리하고 있던 빈 객체를 반환해 준다. 이런 DI를 처리하는 방식은 메타정보를 만드는 방식에 따라 명시적 DI와 묵시적 DI로 나뉜다. Java Config를 활용한 명시적 DI 명시적 DI 명시적 DI란 빈을 생성하고 의존성을 주입하는 코드를 별도의 파일에 "이것은 빈입니다." 라고 작..
03. DI 처리 - 명시적 DI스프링은 DI를 어떻게 처리할까? 다음의 그림을 살펴보자. 개발자는 비즈니스 로직을 담은 빈(Bean)들을 POJO 형태로 작성한다. 개발자는 각 빈들을 어떻게 생성하고 has-a 관계를 맺어줄지에 대한 설명서인 메타정보를 작성해서 스프링 컨테이너에게 전달한다. 스프링 컨테이너는 메타정보에 근거해 빈 객체를 만들고 setter/생성자를 호출해서 의존성을 주입한다. 클라이언트 코드에서 컨테이너에게 빈을 요청하면 컨테이너는 관리하고 있던 빈 객체를 반환해 준다. 이런 DI를 처리하는 방식은 메타정보를 만드는 방식에 따라 명시적 DI와 묵시적 DI로 나뉜다. Java Config를 활용한 명시적 DI 명시적 DI 명시적 DI란 빈을 생성하고 의존성을 주입하는 코드를 별도의 파일에 "이것은 빈입니다." 라고 작..
2020.06.16 -
이번 포스트에서는 스프링의 가장 큰 특징 중 하나인 DI(Dependency Injection)의 개념과 필요성에 대해 알아보자. 참고로 pom.xml에 설정했던 와는 무관하다. 생활에서의 의존성과 의존성 주입 그리고 Ioc Container 의존성 우리는 멀리 떨어져있는 사람들과 통화(business logic)를 위해 전화기를 사용한다. 통화를 위해서는 당연히 전화기를 가져야(has a) 한다. 이처럼 통화를 위해 반드시 전화기를 사용하는 것을 '전화기에 의존하고 있다'라고 하고 이때 '전화기는 우리의 의존성'이 된다. 의존성인 전화기를 갖기 위해서 전통적으로는 직접 구매를 했지만 요즘은 렌탈이나 구독 서비스가 등장하고 있다. "아이폰13, 매달 4만원에 쓴다"…윤곽 드러난 애플의 구독서비스 "아이폰..
02. Dependency와 Dependency Injection이번 포스트에서는 스프링의 가장 큰 특징 중 하나인 DI(Dependency Injection)의 개념과 필요성에 대해 알아보자. 참고로 pom.xml에 설정했던 와는 무관하다. 생활에서의 의존성과 의존성 주입 그리고 Ioc Container 의존성 우리는 멀리 떨어져있는 사람들과 통화(business logic)를 위해 전화기를 사용한다. 통화를 위해서는 당연히 전화기를 가져야(has a) 한다. 이처럼 통화를 위해 반드시 전화기를 사용하는 것을 '전화기에 의존하고 있다'라고 하고 이때 '전화기는 우리의 의존성'이 된다. 의존성인 전화기를 갖기 위해서 전통적으로는 직접 구매를 했지만 요즘은 렌탈이나 구독 서비스가 등장하고 있다. "아이폰13, 매달 4만원에 쓴다"…윤곽 드러난 애플의 구독서비스 "아이폰..
2020.06.15 -
이번 포스트에서는 스프링 애플리케이션의 구성 요소에 대해서 살펴보자. Spring Application의 구성 요소 기본적인 구조 Spring 애플리케이션은 POJO + 메타 정보 + 스프링 프레임워크(IoC Container) 3 가지로 구성된다. 비즈니스 로직을 가지고 있는 POJO와 애플리케이션 구성 정보를 가지는 메타정보를 IoC Container인 스프링 프레임워크가 조합해서 스프링 애플리케이션을 구성하게 된다. 이 요소들에 대해서 좀 더 상세하게 알아보자. POJO POJO란 Plain Old Java Object의 약자로 말 그대로 이전부터 사용하던 평범한 자바 객체를 의미하는데 객체를 만들 때 특별히 무언가를 상속받아서 확장 할 필요가 없다는 것을 강조하기 위한 말이다. 스프링 이전의 프레..
01. Spring Application의 구성 요소이번 포스트에서는 스프링 애플리케이션의 구성 요소에 대해서 살펴보자. Spring Application의 구성 요소 기본적인 구조 Spring 애플리케이션은 POJO + 메타 정보 + 스프링 프레임워크(IoC Container) 3 가지로 구성된다. 비즈니스 로직을 가지고 있는 POJO와 애플리케이션 구성 정보를 가지는 메타정보를 IoC Container인 스프링 프레임워크가 조합해서 스프링 애플리케이션을 구성하게 된다. 이 요소들에 대해서 좀 더 상세하게 알아보자. POJO POJO란 Plain Old Java Object의 약자로 말 그대로 이전부터 사용하던 평범한 자바 객체를 의미하는데 객체를 만들 때 특별히 무언가를 상속받아서 확장 할 필요가 없다는 것을 강조하기 위한 말이다. 스프링 이전의 프레..
2020.06.15