스프링/1. 스프링 핵심 원리 47

42강. 빈 사용 전, 빈 소멸 전 콜백

지금은 쓰지 않는 인터페이스 public class NetworkClient implements InitializingBean, DisposableBean { private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); } public void setUrl(String url){ this.url = url; } //서비스 시작 시 호출. public void connect(){ System.out.println("connetc: " + url); //임시로 출력만. } public void call(String message){ System.out.println("call : " + url + "messag..

41강. 빈 생명주기

컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 빈 사용 -> 소멸 전 콜백 -> 스프링 종료 객체의 생성과 초기화는 분리하는 게 좋다고 함. 생성은 그냥 딱 생성만, 필수정보(파라미터) 받고, 생성, 초기화는 생성된 값을 활용해 외부 커넥션 연결 등 무거운 작업을 하기 위한 준비. 무거운 초기화 작업은 따로 분리시켜 두는 게 좋음.

40강. 자동, 수동 선택 기준

업무로직 빈 컨트롤러, 서비스, 리포지토리 등, 정형화된 패턴은 자동 기능을 사용하는 게 좋다. 문제가 발생해도 정형화 되어있기 때문에 어디서 발생했는지 파악하기 쉽다. 기술지원 빈 기술적 문제, AOP처리할 때 사용. 업무로직을 지원하기 위한 하부 기술 업무 로직은 숫자가 많고, 졍형화된 패턴이기에 자동기능 적극 활용. 기술지원은 수가 비교적 적고, 애플리케이션 전반에 영향을 미치기에 문제 발생시 파악하기 어려움. 그래서 수동 빈으로 명확하게. 비즈니스 로직 중에서도 다형성 활용이 필요할 때 수동 빈 사용 예를 들어 DiscountPolicy, rate, fixed가 있다. 이럴 경우 따로 DiscountPolicyAppConfig 등을 만들어 같이 추가해 주는게 좋다. @Configuration pu..

39강. 모든 빈 조회

빈이 여러개 필요한 순간이 있다. 예를 들어 rate DiscountPolicy를 선택할 지 fixed를 선택할 지 그럴 경우, 특정 Bean들의 조회가 필요하다. static class DiscountService{ private final Map policyMap; private final List policyList; public DiscountService(Map policyMap, List policyList) { this.policyMap = policyMap; this.policyList = policyList; System.out.println("policyMap = " + policyMap); System.out.println("policyList = " + policyList); } p..

38강. 어노테이션 만들기

@Qualifier("mainDiscountPolicy") 문제가 이런 문자열은 컴파일 시 타입체크가 안됨. 어노테이션 딱 만들어 두면 명확함 package com.example.core.annotation; public @interface MainDiscountPolicy { } new 자바클래스 하면 annotation 선택할 수 있다. 아니면 저런 식으로 자바 클래스에다 쓰면 된다. @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @..

37강. 자동주입 똑같은 빈이 2개 이상일 시

일단 보통은 우리가 자동주입 할 때, 역할을 DiscountPolicy 이렇게 해서 받는다. 근데 빈이 조회할 때는 타입으로 조회한다. getBean(type) 이런 식으로 저건 인터페이스고, 우리는 두개의 구현체 (rate, fixed) 만들었었다. 둘다 같은 타입이니 오류 @Autowired @Qualifier @Primary 세 솔루션이 있음. 일단, @Autowired는 같은 타입일 시 필드 명, 혹은 생성자의 파라미터 명으로 다시 찾음. public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.dis..

36강. 롬복, 최신 트렌드

사실 상 개발의 99% 불변, final도 많이 씀. 롬복은 라이브러리, 스프링 부트 할 때 라이브러리에 아예 추가해서 쓰는 것도 좋음. 롬복 추가법은 검색하면 나옴. lombok 플러그인 다운받고, 설정에서도 뭐 만져줘야 함. 참고로 lombok 플러그인은 인텔리제이 버전에 따라 자동으로 깔려 있음. @Getter @Setter @RequiredArgsConstructor 자동으로 getter 만들어 주고, setter 만들어 주고, 저거는 final 붙은 필드들 자동으로 생성자 만들어 줌. @Component @RequiredArgsConstructor public class OrderServiceImpl implements OrderService{ private final MemberReposito..

35강. 생성자 주입을 사용하라.

수정자 주입은 setter를 public으로 열어 둬야 한다. 설계 자체를 불변으로 하는 게 좋다. final을 쓰는 것도 좋다. final은 생성자를 쓰거나 혹은 바로 값을 넣을 때만 사용이 가능하다. 필수 값이 아닌 경우 수정자 주입을 사용해도 괜찮다. 생성자 주입과 수정자 주입 동시에 사용할 수 있다. 항상 생성자 주입을 선택해라! 그리고 가끔 옵션이 필요하면 수정자 주입을 선택해라. 필드 주입은 사용하지 않는게 좋다.

34강. 의존관계 주입 옵션

@SpringBootTest class CoreApplicationTests { @Test void contextLoads() { } } 이게 스프링 빈 띄워주고 테스트 통합해주는 거 여기서는 @Autowired private MemberService memberService 이런 거 해서 여기다가 바로바로 테스트 만들어서 하기도 함. public class AutowiredTest { @Test public void autowiredOption(){ ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class); } static class TestBean{ @Autowired(required = false) public vo..

33강. 의존자 주입 방법들

생성자 주입 수정자 주입(setter 활용) 필드 주입 일반 메서드 주입 @Component public class MemoryMemberRepository implements MemberRepository{ @Autowired private static Map store = new HashMap(); //Map, id랑 Member 객체 간이적으로 메모리에 저장 @Override public void save(Member member) { store.put(member.getId(), member); } @Override public Member findById(Long memberId) { return store.get(memberId); } } 이렇게 생성자 주입해줌. @Autowired 자동으로,..