본문 바로가기

spring19

[SpringCore 핵심원리] @Configuration 1. @Configuration - 싱글톤을 위해서 존재하는 놈이다 - Appconfig에서 MemoryMemberRepository는 new 생성자로 두번 호출이 될 수 밖에 없는데 - 테스트를 해보면, - @Configuration 이 붙으면 바이트코드 라이브러리를 사용해서 다른 클래스를 만들어서 조작한 그 놈을 스프링 빈으로 등록한다. - 스프링 빈이 있으면 그대로 반환, 없으면 생성해서 등록하는 로직이 있을 것이다. 어쨌든 싱글톤을 만족하게 해준다. - @Bean 만 적용하면 @Configuration 이 적용이 안된다. 스프링 빈은 등록이 되지만, 여러번 중복 호출한다. (싱글톤 깨진다) - 설정파일에는 무조건 넣으세요 2024. 2. 17.
[SpringCore 핵심원리] 빈 설정과 싱글톤 1. 스프링 빈 설정 메타정보 : BeanDefinition - XML 이던, 뭐든간에 결국 BeanDefinition을 만들어버리면 스프링컨테이너는 이거만 알면 된다. - 즉, 스프링컨테이너는 BeanDefinition 에만 의존한다. (BeanDefinition 추상화에만 의존하도록 설계한거당) - 직접 스프링컨테이너에 등록할 수도 있다. 하지만 실무에선 안씀 2. 웹앱과 Singleton - 고객요청이 많은 웹앱에서 순수Java로된 DI컨테이너를 만들게되면 객체를 미친듯이 많이 생성하게 됨(메모리 낭비) - 해당 객체가 1개만 생성되고, 공유하도록 설계하면 된다. (싱글톤) - 싱글톤은 클래스 인스턴스가 딱 1개만 생성되도록 보장하는 패턴이다. - private 생성자를 이용해서 외부에서 임의로 n.. 2024. 2. 17.
[SpringCore 핵심원리] IoC, DI, Container 1. IoC(제어의 역전) - 프로그램흐름의 제어를 구현객체가 아닌 외부에서 담당한다. - AppConfig에서 @Configuration 애너테이션 밑에 @Bean 애너테이션을 달면 스프링Bean으로 등록이 가능하다. - 아래처럼 ApplicationContext를 이용하면 스프링컨테이너에 빈으로 등록이 가능하다 - ApplicationContext 는 스프링컨테이너다. (인터페이스다) - 스프링컨테이너는 @Configuration이 붙은 애를 설정(구성) 정보로 사용한다. @Bean이라 적인 메서드를 모두 호출해서 반환된 객체를 스프링컨테이너에 스프링빈으로 등록한다. - @Bean 이름이 붙은 메서드의 이름을 사용한다(변경 가능하긴함) - applicationContext.getBean()으로 스프링.. 2024. 2. 17.
[SpringCore 핵심원리] Config 1. OrderApp 실행 보면서 역할과 책임의 분리 확인하기 - MemberService에서는 Member관리 - OrderService에서는 Order관리를 해야지 - OrderService에서 할인 관련한건 createOrder할 때 할인정책을 정하는 객체한테 가서 해달라고 하면 됨 2. 만약 할인정책을 업데이트하게되면 ? - DiscountPolicy Interface의 구현체를 바꾸면 되는군! - DiscountPolicy의 구현체 생성 - 근데 할인정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야한다(OCP 위반) - 클라이언트가 직접 구현체의 선택까지 해야하는가 ? - 실제 클라이언트는 구현체 또한 의존을 하고있다!(DIP 위반) - 이러면 안되는딩! 3. 해결 방안.. 2024. 2. 16.
[SpringCore 핵심원리] 설계 1. 비즈니스 요구사항 - 회원 : 회원을 가입하고 조회할 수 있따. : 회원에는 일반과 VIP 두가지 등급이 있다. : 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다(TBD) - 주문과 할인 정책 : 회원은 상품을 주문할 수 있다. : 회원 등급에 따라 할인 정책을 적용할 수 있다. : VIP는 1000원 할인해주는 고정 금액 할인을 적용(TBD) : 할인정책은 변경 가능성이 높다. 2. 설계 - 회원 도메인 : 클라이언트 -> 회원서비스 -> 회원저장소(interface) - 인터페이스 설계가 핵심 - Service에서 MemberRepository memberRepository = new MemoryMemberRepository(); - new ~ 부분이 DIP 위반이다.. 2024. 2. 16.
[SpringCore 핵심원리] 시작 1. 스프링의 탄생 - 기술의 핵심 컨셉 : 객체지향언어 Java의 특징을 살려낸다. : 객체 지향 프로그래밍의 적용 - 다형성 : 역할(interface)과 구현(클래스/인스턴스)으로 분리 : 단순해지고 유연해지며, 변경이 편리해짐 : 사용자는 interface만 알면 됨. : 구현 대상의 내부 구조를 몰라도 된다 : 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다. : 인터페이스만 동일하다면 대상 자체를 변경해도 영향을 받지 않는다. : 구현보다 인터페이스가 중요하다. - 객체의 협력과 관계 : 수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 가지게 된다. : 클라이언트에 영향을 주지 않는 변경이 가능 : 덕분에 확장이 가능한 설계가 가능 : 핵심은 interface의 안정적 설계 .. 2024. 2. 14.
[Spring 김영한] 기본예제 만들어보기 (서비스) 1. 서비스 만들기 - 디렉토리를 자주 만들어야하는 특성 상 나는 shift + command + P 를 사용해서 만들어야지! - /service/MemberService 를 만들어준다 - 참고 : command + option + V 누르면 알아서 리턴으로 바꿔준다 개꿀 - 위와같이 작성해준 후 이런 경우 method로 뽑아내는 것이 좋다 - 참고 : Command + Option + M 누르면 메서드 추출이 가능하다. - MemberService 전체를 다음과 같이 정리한다. 2. 회원 서비스 테스트 - 클래스에서 커맨드 + . 누르고 테스트 생성을 통해 편하게 생성할 수 있다. - 꿀팁 : 테스트케이스는 그냥 한글로 해도 상관 없다. 이거 좋네 - given - when - then 문법 사용하기 .. 2023. 11. 21.
[Spring 김영한] 기본예제 만들어보기 (리포지토리) 1. 비즈니스 요구사항 정리 - 데이터 : 회원ID, 이름 - 기능 : 회원 등록, 조회 - 가상의 시나리오 (DB 선정되지 않음) 2. 웹앱의 계층구조 - 컨트롤러 : 웹MVC의 컨트롤러 - 서비스 : 핵심 비즈니스 로직을 구현한 계층 - 리포지토리 : DB에 접근, 도메인 객체를 DB에 저장하고 관리 - 도메인 : 비즈니스 도메인 객체 3. 클래스의 의존관계 - MemberService : 서비스 구현 - MemberRepository : 인터페이스 - MemoryMemberRepository : 메모리모드로 메모리에 저장해서 DB를 대신하는 구현체 4. 회원 도메인과 리포지토리 만들기 - /domain/Member.class 에 멤버객체를 만들어줌 - /repository/MemberReposito.. 2023. 11. 21.