본문 바로가기

분류 전체보기46

영속성 컨텍스트 JPA 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑하기 (Object Relational Mapping) 영속성 컨텍스트 - 실제 JPA 가 어떻게 동작하는지 Entity Manager 와 EntityManagerFactory 고객의 요청마다 EntityManagerFactory 를 통하여 EntityManager 생성하여 영속성 컨텍스트를 관리한다. 영속성 컨텍스트 JPA 를 이해하는데 가장 중요한 용어 "엔티티를 영구 저장하는 환경" 이라는 뜻 EntityManager.persist(entity); (실제 디비 저장이 아니다) 영속성 컨텍스트는 논리적인 개념 눈에 보이지 않는다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 엔티티의 생명주기 비영속 (new / transient) : 영속성 .. 2021. 1. 10.
빈 스코프 빈 스코프란? 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다양한 스코프를 지원한다. 싱글톤 - 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 프로토타입 - 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. (생성과 초기화까지만 관여하고 끝낸다.) 웹 관련 스코프 request - 웹 요청이 들어오고 나갈 때까지 유지되는 스코프이다. session - 웹 세션이 생성되고 종료될 때까지 유지되는 스코프.. 2020. 12. 26.
빈 생명주기 콜백 빈 생명주기 콜백 시작 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 스프링을 통해 이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 알아보자 스프링 빈은 간단하게 다음과 같은 라이프사이클을 가진다. 객체 생성 → 의존관계 주입 (생성자 주입 제외) 스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다. 그런데 개발자가 의존관계 주입이 모두 완료된 시점을 어떻게 알 수 있을까? 스프링은 의존관계 주입이 완료되면.. 2020. 12. 23.
Spring 의존관계 자동 주입 다양한 의존관계 주입 방법 의존관계 주입은 크게 다음과 같이 4가지가 있다. 생성자 주입 수정자 주입 (Setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존관계를 주입 받는 방식이다. 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존 관계에 사용된다. 참고 ✓ 생성자가 딱 1개만 있으면 @Autowired 를 생략해도 자동 주입이 된다. (스프링 빈에만 해당) ✓ 생성자에선 null 값을 허용하지 않기 때문에 불변 및 필수 관계에 있어 사용한다. (자바 컨벤션) ✓ 생성자 주입은 해당 빈을 등록(생성)하는 단계에서 생성자가 호출되기에 해당 과정에서 의존 관계 주입이 된다. (자바 코드 생성자 호출) 수정자 주입 Setter 라 불리는 필드의.. 2020. 12. 21.
Spring Component Scan Component Scan 과 의존관계 자동 주입 현재까지 알아본(Spring Container, Bean 편) Spring Bean 을 등록할 때는 자바 코드의 @Bean 이나 XML 의 등을 통해서 설정 정보에 직접 등록할 Spring Bean 을 나열했다. 예제 속 등록해야할 빈의 개수는 몇개 되지 않아 문제가 없었지만, 실제 등록해야할 빈의 개수가 수십, 수백개가 되면 등록하기 굉장히 불편하고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 따라서, Spring 은 설정 정보가 없어도 자동으로 Spring Bean 을 등록하는 Component Scan 이라는 기능을 제공한다. 또한, 각 Component 에 필요한 의존관계도 자동으로 주입해주는 @Autowired 기능도 제공한다. Compon.. 2020. 12. 13.
@Configuration 과 Singleton 위 코드는 설정 정보를 자바 코드로 작성한 AppConfig 클래스 이다 memberService 빈을 만드는 코드를 보면 'memberService()' 를 호출한다. 해당 메서드를 호출하면 'new MemoryMemberRepository()' 를 호출한다. orderService 빈을 만든느 코드도 동일하게 'memberRepository()' 를 호출한다. 해당 메서드 역시 호출 시에 'new MemoryMemberRepository()' 를 호출한다. 결과적으로 각각 다른 2개의 'MemoryMemberRepository' 가 생성되면서 싱글톤 보장이 깨지는 것 처럼 보인다. 그렇다면 스프링 컨테이너는 이 문제를 어떻게 해결할까? AppConfig 의 자바 코드를 보면 분명히 각각 2번의 호출에.. 2020. 12. 7.
Spring Container - 싱글톤 컨테이너 Spring Container 는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 1개만 생성하고 관리한다. 지금까지 학습하고 사용한 Spring Bean 이 바로 싱글톤으로 관리되는 Bean 이다. Spring Container Spring Container 는 싱글턴 패턴을 따로 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다. Spring Container 는 싱글턴 컨테이너 역할을 한다. 이렇게 싱글턴 객체를 생성하고 관리하는 기능을 Singleton Registry 라고 한다. Spring Container 의 이런 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글턴(단 1개의 인스턴스)으로 유지할 수 있다. 싱글턴 패턴을 위한 지저분한 코드가 들어가지 않아도 된다. (st.. 2020. 12. 4.
Singleton Container - 웹 애플리케이션과 Singleton Spring 은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생된 기술이었다. 대부분의 Spring Application 은 Web Application 이다. (물론 웹이 아닌 다른 애플리케이션(배치, 데몬) 개발도 얼마든지 개발할 수 있다.) 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 스프링이 아닌 순수한 DI 컨테이너인 AppConfig 는(싱글톤 구현이 아닌 경우) 위와 같이 여러 요청이 생길 때 마다 해당 서비스를 책임지는 객체 인스턴스를 매번 생성하는 문제가 발생한다. 만약 고객의 트래픽이 초당 100이 나온다면 초당 최소 100개의 객체가 생성되고 소멸된다. (의존 관계가 있는 경우 더 많을 수 있다.) 이는 곧 메모리 낭비로 이어지게 된다. (초당 요청 개수가 그렇게 .. 2020. 12. 2.
Spring Bean 설정 메타 정보 - BeanDefinition 지난 게시글 "Spring 의 다양한 설정 형식 지원 편" 에서는 Spring 이 단순 자바 코드 뿐만 아니라, XML, Groovy 등 다양한 설정 형식을 지원하는 것을 알아보았다. 이번 게시글에선 어떻게 Spring 이 유연하게 다양한 설정 형식들을 지원할 수 있는지에 대해 알아볼 것이다. 먼저, 그 결론부터 말하자면 핵심은 "BeanDefinition" 라는 추상화 이다. 쉽게 이야기하면, Spring AOP 나 관심사의 분리 에서 말했 듯이 역할과 구현을 개념적으로 나눈 것을 의미한다. Spring 은 설정 파일 (자바, XML, Groovy 등)을 읽어 BeanDefinition 을 만들기만 하면 된다. 그리고 Spring Container 는 이것이 자바 코드로 만든 것인지, 아니면 XML 로.. 2020. 12. 1.
Spring 의 다양한 설정 형식 지원 - 자바 코드, XML Spring Container 는 다양한 형식의 설정 정보를 받아드릴 수 있게 유연하게 설계되어 있다. 대표적인 예시로는 다음 아래와 같다. Java code XML Groovy Annotation 기반 자바 코드 설정 사용 AppConfig 파일을 생성하여 자바 문법을 활용한 설정 방식이다. new AnnotationConfigApplicationContext(AppConfig.class) AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다. XML 설정 사용 최근 스프링 부트를 사용하면서 XML 기반의 설정은 잘 사용하지 않는다. 그렇지만, 많은 Legacy 프로젝트들이 XML 로 되어있는 경우가 많다. XML 사용하면 컴파일 없이.. 2020. 11. 30.