Spring (53) 썸네일형 리스트형 [Spring] 컴포넌트 스캔 목차컴포넌트 스캔과 의존관계 자동 주입탐색 위치와 기본 스캔 대상필터중복 등록과 충돌 컴포넌트 스캔과 의존관계 자동 주입지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등 록할 스프링 빈을 나열했다.예제에서는 몇개가 안되었지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다.코드로 컴포넌트 스캔과 의존관계 자동 주입을 알아보자. AutoAppConfig.javapackage hello.core;i.. [Spring] 싱글톤 컨테이너 목차웹 어플리케이션과 싱글톤싱글톤 패턴싱글톤 컨테이너싱글톤 방식의 주의점@Configuration과 싱글톤@Configuration과 바이트코드 조작@Configuration을 사용하지 않으면? 웹 애플리케이션과 싱글톤스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다.대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있다.웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.계속 요청이 올 때마다 객체가 생성된다. => 메모리 낭비 스프링 없는 순수한 DI 컨테이너 테스트package hello.core.singleton;import hello.core.AppConfig;import hello.core.member.Member.. [Spring] 스프링 빈 설정 메타 정보(feat. XML) 목차XML로 빈 설정해보기스프링 빈 설정 메타 정보BeanDefinition 살펴보기 다양한 설정 형식 지원 - 자바 코드, XML 스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있게 유연하게 설계되어 있다.자바 코드, XML, Groovy 등등 애노테이션 기반 자바 코드 설정 사용지금까지 했던 것이다.new AnnotationConfigApplicationContext(AppConfig.class)AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다. XML 설정 사용최근에는 스프링 부트를 많이 사용하면서 XML기반의 설정은 잘 사용하지 않는다.아직 많은 레거시 프로젝트 들이 XML로 되어 있고, 또 XML을 사용하면 컴파.. [Spring] 스프링 빈 조회 목차컨테이너에 등록된 모든 빈 조회스프링 빈 조회스프링 빈 조회 - 동일한 타입 둘 이상스프링 빈 조회 - 상속 관계 컨테이너에 등록된 모든 빈 조회 스프링 컨테이너에 실제 스프링 빈들이 잘 등록 되었는지 확인해보자.package hello.core.beanfind;import hello.core.AppConfig;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.context.annotation.AnnotationConfigApplicationContext;pu.. [Spring] 스프링 컨테이너 목차스프링 컨테이너스프링 생성 과정BeanFactory와 ApplicationContext 스프링으로 전환하기지금까지 순수한 자바 코드만으로 DI를 적용했다. 이제 스프링을 사용해보자.package hello.core;import hello.core.discount.DiscountPolicy;import hello.core.discount.FixDiscountPolicy;import hello.core.discount.RateDiscountPolicy;import hello.core.member.MemberRepository;import hello.core.member.MemberService;import hello.core.member.MemberServiceImpl;import hello.core.m.. [Spring] IoC, DI 컨테이너 제어의 역전 IoC (Inversion of Control)기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 개발자 입장에서는 자연스러운 흐름이다.반면에 AppConfig가 등장한 이후에 구현 객체는 자신의 로직을 실행하는 역할만 담당한다. 프로그램의 제어 흐름은 이제 AppConfig가 가져간다. 예를 들어서 OrderServiceImpl 은 필요한 인터페이스들을 호출하지만 어떤 구현 객체들이 실행될지 모른다. 프로그램에 대한 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다. 심지어 OrderServiceImpl 도 AppConfig가 생성한다. 그리고 AppConfig는.. [Spring] OCP, DIP 원칙을 지켜주는 AppConfig 새로운 할인 정책 적용과 문제점할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 한다.private final MemberRepository memberRepository = new MemoryMemberRepository();// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();// 할인 정책 변경, OCP 원칙 위반, DIP 원칙 위반(추상화 뿐만 아니라 구체화 의존)private final DiscountPolicy discountPolicy = new RateDiscountPolicy() 문제점 발견우리는 역할과 구현을 충실하게 분리했나? => OK다형성도 활용하고, 인터페이스와 구현 객체를.. [Spring] 객체 지향 설계 SOLID 원칙 SOLID클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리SRP: 단일 책임 원칙(single responsibility principle)OCP: 개방-폐쇄 원칙 (Open/closed principle)LSP: 리스코프 치환 원칙 (Liskov substitution principle)ISP: 인터페이스 분리 원칙 (Interface segregation principle)DIP: 의존관계 역전 원칙 (Dependency inversion principle) SRP 단일 책임 원칙single responsibility principle한 클래스는 하나의 책임만 가져야 한다. 하나의 책임이라는 것은 모호하다.클 수 있고, 작을 수 있다.너무 잘게 잘라서도 안되고 너무 크게 잘라.. [Spring] AOP AOP가 필요한 상황모든 메소드의 호출 시간을 측정하고 싶다면?공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)회원 가입 시간, 회원 조회 시간을 측정하고 싶다면? MemberService 회원 조회 시간 측정 추가package com.example.hello_spring.service;import com.example.hello_spring.domain.Member;import com.example.hello_spring.repository.MemberRepository;import com.example.hello_spring.repository.MemoryMemberRepository;import org.springframework.beans.f.. [Spring] 스프링 DB 접근 기술 목차순수 JDBCJdbcTemplateJPAJPA DATA 순수 JDBC 환경 설정build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가implementation ("org.springframework.boot:spring-boot-starter-jdbc")runtimeOnly ("com.h2database:h2") 스프링 부트 데이터베이스 연결 설정 추가spring.datasource.url= jdbc:h2:tcp://localhost/~/testspring.datasource.driver-class-name=org.h2.Driverspring.datasource.username=sa JDBC 리포지토리 구현MemberRepositorypackage com.example... 이전 1 2 3 4 5 6 다음