Spring/스프링 핵심 원리 - 기본편 18

싱글톤 컨테이너 - 싱글톤 방식의 주의 점

1) 싱글톤 패턴의 주의할 점 싱글톤 패턴은 객체 인스턴스를 하나만 생성해서 공유하는 방식으로 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 상태를 유지하게 설계해야 된다. 무상태(stateless)로 설계해야 된다. 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!. 2) 객체 생성 package hello.core.singleton; public class StatefulService { private int price; //상태를 유지하는 필드 public void order(String name, int price) { System.out.println("name = " + name + " price = " + price); this.price = price; ..

싱글톤 컨테이너 - 웹 애플리케이션을 싱글톤 방식으로 변경

1) AppConfig의 문제점 현재 AppConfig는 사용하고 싶을 때마다 new 생성자를 통해서 메모리를 할당받고 있다. 이렇게 될 시 웹에서 사용자들이 많아질수록 메모리 부담이 심해진다. 이를 해결하고자 Singleton 방식을 사용하려고 한다. 아래 예제를 보자. 2) SingletonService 구현 package hello.core.singleton; public class SingletonService { //1. static 영억에서 객체를 딱 1개만 생성한다. private static final SingletonService instance = new SingletonService(); //2. public으로 열어 객체인스턴스가 필요히면 이 static 메서드를 통해 조회하도록 한..

스프링 컨테이너와 스프링 빈 - 다양한 설정 형식 지원 - XML로 AppConfig 설정하기

현재는 많이 사용하지 않지만 과거에는 XML로 Config설정을 하였었다. 나도 xml 빈 설정을 하는 것을 보고 예전에 학원에서 배웠던 xml 파일이 생각났었다. Config.java에서 Config.xml로 어떻게 변경하였는지 보자. 1) appConfig.xml의 경로 2) appConfig.xml의 소스 구성 3) appConfig.xml 단위 테스트 package hello.core.xml; import hello.core.member.MemberService; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support..

스프링 컨테이너와 스프링 빈 - BeanFacotry와 ApplicationContext

1) BeanFactory 스프링 컨테이너의 최상이 인터페이스이다. 스프링 빈을 관리하고 조회하는 역할을 담당한다. getBean()을 제공한다. 지금 까지 우리가 사용했던 대부분의 기능은 BeanFacotry가 제공한다. 하지만 직접적으로 우리가 사용하지는 않는다. 우리가 사용하는 영역은 ApplicationContext 2) ApplicationContext BeanFacotry 기능을 모두 상속받아서 제공한다. 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수많은 부가기능이 필요하다. ApplicationContext 제공하는 부가기능 메시지 소스를 활용한 구제화 기능 -> 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력 환경변수 ->로컬, 개발, 운영 등을 구분해..

스프링 빈 으로 전환하기

지금까지 순수한 자바 코드만으로 DI를 적용했으며, 스프링으로 전환을 해보자.! 1) AppConfig.java 수정 @Configuration : 스프링에게 설정 정보를 제공해 주자. @Bean : 스프링 컨테이너에 해당하는 빈을 등록해주자. package hello.core; import hello.core.discout.DiscountPolicy; import hello.core.discout.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.M..

AppConfig 리팩터링

1) AppConfig 리팩터링 설명 현재 AppConfig를 보면 "중복"이 있고, "역할"에 따른 "구현"이 잘 안 보인다. 한눈에 보일 수 있도록 수정해 보자.! 2) AppConfig 코드 리팩터링 package hello.core; import hello.core.discout.DiscountPolicy; import hello.core.discout.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository;..

스프링 핵심 원리 이해 - 예제 만들

비즈니스 요구사항과 설계 1) 회원 회원을 가입하고 조회할 수 있다. 회원은 일반과 VIP 두 가지 등급이 있다 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정) 2) 주문과 할인 정책 회원은 상품을 주문 할 수 있다. 회원 등급에 따라 할인 정책을 적용할 수 있다. 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정) 소스코드는 아래 확인 가능 https://github.com/qkrxodud/spring_basic GitHub - qkrxodud/spring_bas..

스프링 핵심 원리 - 기본편 - 객체 지향 설계와 스프링

스프링의 진짜 핵심 스프링은 자바 언어 기반의 프레임 워크이다. 자바 언어의 가증 큰 특징 - 객체 지향 언어 스프링은 좋은 객체 지향 애프리케이션을 개발할 수 있게 도와주는 프레임워크 다형성의 실세계 비유 운전자는 자동차가 변경이 되도, 운전이 가능하다. 운전자는 자동차 인터페이스 즉 역할만 알 뿐, 구조는 몰라도 된다. -> 클라이언트에 영향을 주지 않고 새로운 기능을 제공하며, 무한하게 확장 할 수 있다. 로미오 역할은 장동건이 해도되고 원빈이 해도된다. 로미오 역할은 줄리엣 역할을 누가 하는지 몰라도 된다. -> 변경이 유연하고 자유롭다. 역할과 구현을 분리 역할과 구현으로 구분하면 세상이 다순해지고, 유연해지며 변경도 편리해진다. 장점 클라이언트는 대상의 역할(인터페이스)만 알면 된다. 클라이언..