인프런145 12)BeanFactory, ApplicationContext ,다양한 설정 형식 지원(자바코드, XML) , 스프링 빈 설정 메타정보(BeanDefinition) 상속받은 인터페이스를 구현하는 AnnotationConfigApplicationContext(구현 클래스,구현체) BeanFactory (빈 팩토리) - 스프링 컨테이너 최상위 인터페이스 - 스프링빈을 관리하고 조회하는 역할 담당 - 이전 시간에 썼던 getBean()과 같이 사용했던 대부분의 기능은 빈팩토리에서 제공하는 기능이였다. ApplicationContext - 빈팩토리를 상속하는 인터페이스이므로 빈팩토리의 기능을 모두 상속받아서 제공한다. - 빈팩토리와 차이는 뭘까? -> 빈을 관리하고 조회하는 기능(빈팩토리)은 물론이고 수많은 부가기능이 필요하기 때문에 다른 인터페이스도 상속하고있다. 다양한 설정 형식 지원 (자바코드 , XML) 이전에 AppConfig.class로 설정정보를 줘서 스프링컨.. 인프런/스프링핵심원리(기본) 2022. 12. 27. 11)컨테이너에 등록된 모든 빈 조회,내가 등록한 빈 조회, 스프링 빈 조회(기본), 스프링 빈 조회(동일한 타입이 둘 이상), 스프링 빈 조회(상속 관계) 테스트 코드를 생성해서 등록된 빈 조회해보기 ApplicationContextInfoTest.java class ApplicationContextInfoTest { // junit5부터는 public이 없어도 된다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("모든 빈 출력하기") void findAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); //컨테이너에 등록된 빈 이름들 배열을 가져온다. for (String beanDefinitionName : beanDe.. 인프런/스프링핵심원리(기본) 2022. 12. 27. ★★10) 스프링으로 전환하기, ApplicationContext ,@Configuration,@Bean , 스프링 컨테이너, 스프링 빈 , 스프링컨테이너 생성과정 AppConfig.java 수정 @Configuration을 클래스 앞에 붙여서 앱의 구성정보,설정정보 파일임을 명시해준다. @Bean 어노테이션을 각 메서드에 붙여준다. -> 각 객체들이 스프링컨테이너에 등록된다. @Configuration public class AppConfig { //프로젝트의 객체 생성,구성,주입 환경설정을 하는 중요 역할 @Bean public MemberService memberService() { return new MemberServiceImpl(MemberRepository()); } @Bean public MemberRepository MemberRepository() { return new MemoryMemberRepository(); } @Bean public Or.. 인프런/스프링핵심원리(기본) 2022. 12. 15. 9) 좋은 객체지향 설계의 5가지 원칙의 적용 , IoC(Inversion of Control == 제어의 역전), DI(의존관계주입,의존성주입) , 컨테이너(IoC 컨테이너, DI 컨테이너) 지금까지 공부한 코드에서는 SRP, DIP, OCP가 적용되어있다. SRP 단일 책임 원칙 클라이언트 객체 == 구현 객체 초기에 멤버서비스임플과 같은 구현 객체(클라이언트 객체) 에서 직접 구현 객체(메모리멤버리포지토리객체)를 생성하고 ,연결하는 등 다양한 책임을 가지고 있었다. 하지만 AppConfig를 생성하면서 클라이언트 객체는 실행하는 책임만 담당한다. DIP 의존관계 역전 원칙 OCP 다형성을 사용하고 클라이언트가 DIP를 잘 지키면 OCP가 적용될 가능성이 열린다. IoC( Inversion of Control, 제어의 역전) 보통은 개발자가 원하는 객체를 생성하고 그 객체안에서 다른 객체도 생성하면서 직접 컨트롤하면서 개발을 하는데 -> ex) 멤버서비스임플 구현체의 코드를 짜면서 그 안에.. 인프런/스프링핵심원리(기본) 2022. 12. 9. 8)★ AppConfig 리팩토링 , 할인정책 변경(구현클래스 변경) , DIP 준수 , OCP 준수 , 배웠던거 전체 흐름 정리 AppConfig 리팩토링 기대하는그림 수정전 AppConfig public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } public OrderService orderService() { return new OrderServiceImpl(new MemoryMemberRepository(), new RateDiscountPolicy()); } } 구현이 잘 안보이고(메모리멤버리포지토리) 오더서비스 구현체 만들때, 멤버서비스 구현체 만들때 메모리멤버리포지토리 생성이 중복이 된다. 그리고 만약 멤버리포지토리 구현체가 바뀌게 된다면 멤버리포지토리.. 인프런/스프링핵심원리(기본) 2022. 12. 9. 7) ★ 관심사의 분리, AppConfig(리팩토링 전) , 생성자 주입,의존성 주입(의존관계 주입) AppConfig.class 어플리케이션의 전체 동작 방식을 구성(config -> configuration -> 구성,환경설정)하기 위해 , 구현 객체를 생성하고, 연결하는 책임을 가지는 클래스 이전에는 오더서비스구현체클래스 안에서 public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); 다음과 같이 구현체를 생성하고 적용해줬는데 이것은 구현체를 의존하는것이므로 위의 배우 예시를 들면 배우(오.. 인프런/스프링핵심원리(기본) 2022. 12. 9. 6)새로운 할인 정책 개발 , 적용과 문제점 , 문제점 해결 (의존성 주입) 할인정책을 바꾼다고 했을때? 할인에 대한 역할과 구현을 나눠서 개발하지않았다면 기획의 대한 변화는 골치가 아팠을것이다. 하지만 할인에 대한 역할(인터페이스)를 만들어놓았고, 그것에 대한 구현(구현체)를 지금 FixDiscountPolicy로 구현해놓은상태이고 기획자가 원하는대로 새로운 할인정책인 RateDiscountPolicy 라는 구현체를 만들어서 적용해주자. RateDiscountPolicy.java (구현체) public class RateDiscountPolicy implements DiscountPolicy { private int discountPercent = 10; @Override public int discount(Member member, int price) { //할인금액이 얼마인.. 인프런/스프링핵심원리(기본) 2022. 12. 9. 5)주문과 할인 도메인 설계와 개발 1. 주문 생성: 클라이언트는 주문 서비스에 주문 생성을 요청한다. (클라이언트는 controller 같은거라 생각하면됨) -> 회원아이디,상품명,상품가격을 같이 넘긴다. 2. 회원 조회: 할인을 위해서는 회원 등급이 필요하다. 그래서 주문 서비스는 회원 저장소에서 회원을 조회한다. (등급을 받아와서 할인을 해야하는지 판단해야해서) 3. 할인 적용: 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임한다. (할인 정책한테 할인 해도되는건지 확인하는 부분) 4. 주문 결과 반환: 주문 서비스는 할인 결과를 포함한 주문 결과를 반환한다. 역할과 구현을 분리해서 구현하려고 설계 (중요) 역할과 구현을 분리해서 자유롭게 구현 객체를 조립할 수 있게 설계했다. 덕분에 회원 저장소는 물론이고, 할인 정책.. 인프런/스프링핵심원리(기본) 2022. 12. 7. 4)회원 도메인 설계,회원 도메인 개발 이전에 들은 요구사항에 대해 듣고 개발자가 설계해야하는 부분이다. 기획자가 원하는 회원관련 요구사항 설계할때 플로우를 생각해본다. 1. 클라이언트가 회원서비스를 호출한다. (회원서비스는 회원가입,회원조회 기능을 가지고 있다) 2. 회원저장소 인터페이스를 만든다 ( 어떤 저장소로 바꿔끼울수 있게끔) 도메인 레벨의 큰 그림 (기획자도 볼수 있는 그림) 각각 클라이언트 역할 ,회원서비스 역할, 회원 저장소 역할이고 메모리회원저장소,DB 회원 저장소, 외부 시스템 연동 회원저장소는 구현이다. 구현중 하나를 회원저장소 역할에 꼽아쓰면된다. 아직 회원저장소에 대해 기획이 안나왔지만 개발을 해야한다. 그래서 메모리 회원 저장소를 만들어서 개발을 시작한다. 메모리를 이용한 저장소는 로컬에서 개발할때도 쓰이고, 테스트할.. 인프런/스프링핵심원리(기본) 2022. 12. 1. 3)예제프로젝트 시작, 비즈니스 요구사항과 설계 예제만들기 프로젝트의 시작은 https://start.spring.io/ 에서 시작한다. 어떤 프로젝트인지(gradle,maven) 스프링부트 어떤버전을 사용할것인지 등 초기설정을 하고 설정된 프로젝트파일을 받을 수 있다. 이번프로젝트는 Gradle 프로젝트이고, 다른설정 및 Dependencies 추가없이 해당 설정을 Generate 해준다. 받은 압축파일을 풀고 인텔리제이에서 file -> new -> project from exisiting sources로 압축푼 폴더를 선택해준다. Build.gradle build.gradle을 보면 스프링부트 버전과, 자바버전을 확인가능하고 spring initialize에서 dependencies추가한게 없기때문에 디펜던시를 보면 기본적인 starter와 테스.. 인프런/스프링핵심원리(기본) 2022. 12. 1. 2)좋은 객체 지향설계의 5가지 원칙(SOLID), 객체지향 설계와 스프링 SRP (단일 책임 원칙 , Single responsibility principle) 하나의 책임이라는게 정하기 모호하다. 하나의 책임의 중요한 기준은 변경이다. 변경이 있을때 파급효과가 적으면 단일 책임 원칙을 잘 따른것이라고 한다. ex)만약 ui를 고치려고하는데 sql문부터 시작해서 다른 변경이 많이 생길때 -> 단일 책임 원칙을 잘 따르지 못했다. OCP 개방-폐쇄 원칙 가장중요한 원칙 리포지토리를 메모리리포지토리,jpa리포지토리 등등으로 바꿔도 기존의 코드는 바꾸지않았던점, (새로 리포지토리 구현체만 생성했을뿐 기존 코드는 건들지않음.) 이전 게시글에서 운전자 예시중 자동차가 바뀌어도 운전자는 운전이 가능했다는점 이런 다형성의 예시로 설명이 가능하다. 메모리리포지토리에서 jdbc리포지토리로 바.. 인프런/스프링핵심원리(기본) 2022. 12. 1. 1)스프링이란?, 좋은 객체 지향 프로그래밍? 스프링 생태계 스프링은 어떤 특정한 하나가 아니라 여러가지 기술들의 모음이라고 볼수 있다. 먼저 스프링의 핵심인 스프링 프레임워크 여러 스프링 기술들을 편리하게 사용할 수 있게끔해주는 스프링부트 그리고 나머지 선택사항들 https://moolgogiheart.tistory.com/87 프레임워크(Framework)란? 개념, 장단점, 종류 프레임워크라는 개념을 접하기 전에 '부트스트랩(Bootstrap)'이란 용어를 먼저 알게 되었습니다. 웹 프로젝트를 개발하기 위한 좋은 툴이라는 것을 듣게 되었죠.그래서 부트스트랩이 무엇인지 자 moolgogiheart.tistory.com 스프링 프레임워크 스프링프레임워크만 쓰는게 아니고 스프링 프레임워크를 편리하게 사용할 수 있는 스프링 부트 라는것을 통해서 스프링.. 인프런/스프링핵심원리(기본) 2022. 11. 30. 이전 1 ··· 8 9 10 11 12 13 다음