본문 바로가기

Backend - Java Spring/Spring Core21

[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. 스프링 빈을 등록하는 2가지 방법 - 컴포넌트 스캔과 자동 의존관계 설정 (애너테이션 붙이는거) (@Component) - 자바코드로 직접 빈에 등록하기 2. 추가 - 스프링 컨테이너에 빈을 등록할 때 싱글톤으로 등록한다. 즉, 스프링 빈이면 모두 같은 인스턴스다. 3. 자바 코드로 스프링 빈 등록해보기 - Controller에 주입 - 그냥 닥치고 생성자 주입 쓰십쇼 - 정형화된 컨트롤러-서비스-리포지토리 는 컴포넌트 스캔을 사용하고, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다. - @Autowired 를 통한 DI는 스프링이 관리하는 객체에서만 동작한다. 직접 관리하는 객체에서는 동작하지 않음 2024. 2. 12.
[Spring 김영한] 단축키 설정 - 개인적으로 커스터마이징한 단축키이며, 실제 기본 단축키와 매우 다름 1. 메서드 추출 : Option Command M 2. 리팩터링 : Command T 3. return 뽑기 : Option Command V 4. 생성 : Command N 5. import Option : Option Enter - 가끔 업데이트 2024. 2. 12.