728x90
반응형

Spring/Spring Core Basic 18

조회 빈이 2개 이상 존재할 때 해결법

@Autowired는 타입(Type)으로 조회한다. @Autowired private DiscountPolicy discountpolicy; 타입으로 조회하기 때문에, 마치 다음 코드와 유사하게 동작한다. ac.getBean(DiscountPolicy.class) 스프링 빈 조회에서 배웠듯이 타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 발생한다. (조회했을 때 존재하지 않는 타입이면 그 때도 문제 발생, 이를 피하기 위해서 "required = false"를 넣어주어야 한다.) DiscountPolicy의 하위 타입인 FixDiscountPolicy, RateDiscountPolicy 둘다 스프링 빈으로 선언해보자. @Component public class FixDiscountPolicy im..

생성자 주입을 선택하라

과거에는 수정자 주입과 필드 주입을 많이 사용했지만, 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다. 그 이유는 다음과 같다. 불변 대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 오히려 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다. (불변해야한다) 수정자 주입을 사용하면, set__ 메서드를 public으로 열어두어야한다. public으로 열어둘 경우 누군가 변경할 수도 있고, 변경하면 안되는 메서드를 열어두는 것 자체가 좋은 설계 방법이 아니다. 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일이 없다. 따라서 불변하게 설계할 수 있다. 누락 프레임워크 없이 순수한 자바 코드를 단위 테스트..

다양한 의존관계 주입 방법

의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 지금까지 우리가 진행했던 방법이 생성자 주입이다. 특징 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에 사용한다. package com.example.demo.service; import com.example.demo.discount.DiscountPolicy; import com.example.demo.discount.FIxDiscountPolicy; import com.example.demo.member.Member; import com.example.demo.order.Order; ..

컴포넌트 스캔

지금까지는 스프링 컨테이너를 생성할 때 설정할 때 설정 클래스에 @Configuration을 선언하고 그 안에 매서드를 통해 우리가 필요한 클래스들을 @Bean으로 스프링에 등록하였다. 하지만 이렇게 @Bean으로 설정하게 되는 경우 등록해야할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 힘들고, 누락하는 문제가 발생할 수도 있다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. package com.example.demo; import org.springframework.context.annotation.ComponentScan; import org.springfram..

싱글톤 방식의 주의점

싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 무상태(stateless)로 설계해야한다. 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다. 가급적 읽기만 가능해야 한다. 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다. 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다. package com.example.demo.singleto..

스프링 컨테이너에 등록된 빈 출력하기

@Configuration 애노테이션을 이용하여 스프링 컨테이너를 생성하고 @Bean등록을 통해 스프링에 빈으로 등록할 클래스를 지정할 수 있다. 그리고 또 다른 클래스에서는 AnnotationConfigApplicationContext를 통해 스프링 컨테이너를 가져올 수 있다. 이거에 대한 글은 아래 글에 게시했었다. https://wonsjung.tistory.com/359?category=1001976 오브젝트와 의존관계 - 5. 제어의 역전(IoC) / Spring's IoC IoC라는 약자로 많이 사용되는 제어의 역전(Inversion of Control)이라는 용어가 있다. 제어권의 이전을 통한 제어관계 역전 제어의 역전이라는 건, 간단히 프로그램의 제어 흐름 구조가 뒤바뀌는 것이 wonsju..

Intellij 수정사항 재실행 없이 확인하기

Intellij로 개발을 하다보면 새롭게 추가하거나 수정한 것을 확인해야할 때가 있다. 이 때 실행 중인 서버를 다운시켰다가 다시 On하게 되면 시간도 더 걸리고 귀찮은 경우가 종종 발생한다. 이를 간단하게 해결할 수 있는 방법이 존재한다. 1. Intellij - build.gradle로 들어간다. 2. depandencies에 - implementation 'org.spingframework.boot:spring-boot-devtools' 를 추가한다. 3. 수정 또는 추가하고자 하는 코드 작성 4. 실행 중인 서버를 재시작 하는 것이 아닌 상단에 Build - recompile '수정클래스 또는 파일'을 클릭 5. 웹 페이지 새로고침 위 방법으로 해결 가능하다

주문과 할인 도메인 설계

주문과 할인 정책 ▶ 회원은 상품을 주문할 수 있다. ▶ 회원 등급에 따라 할인 정책을 적용할 수 있다. ▶ 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있다.) ▶ 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정) 할인 정책에 대한 인터페이스 package spring.core.discount; import spring.core.member.Member; public interface DiscountPolicy { /* @return 할인 대상 금액 */ int discount(Member member, int price)..

회원 도메인 실행과 테스트

이전에 만들었던 회원 도메인이 잘 동작하는지 테스트해봐야한다. main 디렉토리 밑에 test디렉토리 안에 새로운 member Package를 생성해준다. 그리고 그 안에 memberServiceTest 클래스를 만들어준 후 우리가 만든 코드가 잘 동작하는지 확인해준다. // 회원 도메인 코드가 잘 동작하는지 확인하는 Test Code package spring.core.member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; public class MemberServiceTest { MemberService memberService = new MemberServiceImpl(); @Test void join(){..

회원 도메인 개발

회원 도메인 개발은 위 그림에 맞춰 역할과 구현을 나눠 개발할 것이다. 가장 첫 번째로, 회원 도메인을 개발할 것이므로 member라는 패키지를 생성해주자 그리고 그 안에 회원의 등급을 나눠줄 enum을 생성해준다 라는 이름으로 생성하였다. package spring.core.member; public enum Grade { BASIC, VIP } 그리고 회원 정보와 관련된 Member라는 클래스를 하나 생성해주고 그 안에는 id와 name, grade 정보를 선언해준다. 기본적으로 선언한 3개 파라미터에 대한 생성자와 getter/setter를 만들어준다 (윈도우의 경우 단축키 Alt + insert) package spring.core.member; public class Member..

728x90
반응형