자바 표준 기술로 EJB(Enterprise Java Beans)가 있었다.기술 영업을 할 때 EJB 표준으로 서버를 판매했었음.트랜잭션 관리, 분산 기술 등 고급기술도 편하게 할 수 있었음.Entity Bean이라는 ORM 기술도 있었음.한 대당 수천만원씩 하는 어마
추상화캡슐화상속다형성 (Polymorphism)컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 “객체”들의 모임으로 파악하고자 하는 것이다.각각의 객체는 메시지를 구조받고 데이터를 처리할 수 있다. (협력)객체지향 프로그래밍은 프로
프로젝트 선택Project: Gradle ProjectSpring Boot: 2.7.3Language: JavaPackaging: JarJava: 11Project MetadatagroupId: helloartifactId: coreDependencies: 미선택회원을
회원은 상품을 주문할 수 있다.회원 등급에 따라 할인 정책을 적용할 수 있다.할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 가능)할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 못정했고, 오픈 직전까지 고
악덕기획자서비스 오픈 직전에 할인 정책을 지금처럼 고정 금액 할인이 아니라 좀 더 합리적인 주문 금액당 할인하는 정률% 할인으로 변경하고 싶어요.예를 들어서 기존 정책은 VIP가 10000원을 구문하든 20000원을 주문하든 항상 1000워을 할인했는데, 이번에 새로
미쳤다 미쳤어 김영한 그는 신인가?실제 배역을 맡은 배우를 선택하는 것은 누구지?각 배역을 선택하는 것은 배우가 아니다.이전 코드는 배역(인터페이스)을 맡은 배우(구현체)가 다른 배역(인터페이스)의 배우(구현체)를 직접 초빙하는 것과 같음.배우가 공연을 하는 동시에 다
처음으로 돌아가서 정액 할인 정책을 정률 할인 정책으로 변경해보자.FixDiscountPolicy → RateDiscountPolicyAppConfig의 등장으로 애플리케이션이 사용 영역과 객체를 생성하고 구성(Configuration)하는 영역으로 분리되었다.사용-구
여기서 3가지. SRP, DIP, OCP 적용한 클래스는 하나의 책임만 가져야 한다.클라이언트 객체는 직접 구현 객체를 생성하고, 연결하고, 실행하는 다양한 책임을 가지고 있음.SRP 단일 책임 원칙을 따르면서 관심사를 분리함.구현 객체를 생성하고 연결하는 책임은 Ap
스프링 컨테이너가 생성되는 과정을 알아보자.ApplicationContext를 스프링 컨테이너라 한다.ApplicationContext는 인터페이스이다.스프링 컨테이너는 XML을 기반으로 만들 수 있고, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다.직전에 App
스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법ad.getBean(빈 이름, 타입)ac.getBean(타입)조회 대상 스프링 빈이 없으면 예외 발생NoSuchBeanDefinitionException: No bean named 'xxxx' availabl
스프링 컨테이너의 최상위 인터페이스다.스프링 빈을 관리하고 조회하는 역할을 담당한다.getBean()을 제공한다.지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다.BeanFactory 기능을 모두 상속받아서 제공한다.빈을 관리하고 검색하
스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다.대부분의 스프링 애플리케이션은 웹 애플리케이션이다.물론 웹이 아닌 애플리케이션 개발도 얼마든지 할 수 있다.웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.각각의 클라이언트에 서로 다른 인스턴스
@Bean memberService → new MemoryMemberRepository()@Bean orderService → new MemoryMemberRepository()결과적으로 각각 다른 2개의 MemoryMemberRepository가 생성되면서 싱글톤이
지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다.예제에서는 몇 개 되지 않지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락
모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다.그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다.basePackages: 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.basePackages =
의존관계 주입은 크게 4가지 방법이 있다.생성자 주입수정자 주입 (setter 주입)필드 주입일반 메서드 주입이름 그대로 생성자를 통해서 의존 관계를 주입받는 방법지금까지 우리가 진행했던 방법이 바로 생성자 주입이다.특징생성자 호출 시점에 딱 1번만 호출되는 것이 보장
주입할 스프링 빈이 없어도 동작해야 할 때가 있다.그런데 @Autowired만 사용하면 required 옵션의 기본값이 true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다.@Autowired(required = false): 자동 주입할 대상이 없으면 수정
과거에는 수정자 주입과 필드 주입을 많이 사용했지만, 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다. 그 이유는 다음과 같다.대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료 시점까지 의존관계를 변경할 일이 없다.오히려 대부분의 의존
생성자 주입을 최적화 해보자.build.gradle 세팅Plugin 설치Annotation Processing Enable@Getter, @Setter, @XxxArgsContructor, @ToString 등 다양한 롬복 어노테이션으로 코드를 줄일 수 있음.생성자가
@Autowired는 타입(Type)으로 조회한다.타입으로 조회하기 때문에 마치 다음 코드와 유사하게 동작한다.ac.getBean(DiscountPolicy.class)실제로는 더 많은 기능을 제공한다.“스프링 빈 조회”에서 학습했듯이 타입으로 조회하면 선택된 빈이 2
의도적으로 정말 해당 타입의 스프링 빈이 다 필요한 경우도 있다.예를 들어서 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정해보자.스프링을 사용하면 소위 말하는 전략 패턴을 간단하게 구현할 수 있다.DiscountServ
데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가
InitializingBean은 afterPropertiesSet()메서드로 초기화를 지원한다.DisposableBean은 destroy() 메서드로 소멸을 지원한다.출력 결과를 보면 초기화 메서드가 주입 완료 후에 적절하게 호출된 것을 확인할 수 있다.그리고 스프링
이 방법을 쓰면 된다!@PostConstruct, @PreDestroy 이 두 어노테이션을 사용하면 가장 편리하게 초기화와 종료를 실행할 수 있다.최신 스프링에서 가장 권장하는 방법이다.어노테이션 하나만 붙이면 되므로 매우 편리하다.패키지를 잘 보면 javax.anno