▣ Framework/Spring🍃

    [Spring] @Autowired 옵션 처리 방법 [주입할 스프링 빈이 없어도 동작해야 할 때]

    - 주입할 스프링 빈이 없어도 동작해야 할 때 주입할 스프링 빈이 없어도 동작해야 할 때가 있다. 자동 주입 대상이 없는 상태로 @Autowired만 사용하면 required의 기본값이 true라 오류가 발생한다. - @Autowired 옵션 처리 방법 @Autowired(required=false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨 @Nullable : 자동 주입할 대상이 없으면 null이 입력됨 Optional : 자동 주입할 대상이 없으면 Optional.empty 가 입력됨 //호출 안됨 @Autowired(required = false) public void setNoBean1(Member member) { System.out.println("setNoBean1 = ..

    [Spring] 싱글톤, 무상태(stateless)로 설계하라! [Singleton 패턴 주의사항]

    - 싱글톤, 무상태(stateless)로 설계하라! 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. - 잘못된 설계 : 상태가 유지되는 경우 - StateFulService.java public class StateFulService { private int price; // 상태를 유지하는 필드 public void order(String name, int price) { System.out.println("name = " + name + " price = " + price); this.price = price; // 여기가 문제! } public int getPric..

    [Spring] Object 타입으로 Bean을 조회하면 어떻게 될까? [스프링 빈 조회 시 상속 관계]

    - Object 타입으로 Bean을 조회하면 어떻게 될까? 스프링에서는 부모 타입으로 빈을 조회하면, 자식 타입도 함께 조회한다. 즉, 모든 자바 객체의 최고 부모인 Object 타입으로 빈을 조회하면 모든 스프링 빈을 조회한다. - ApplicationContextExtendsFindTest.java import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.spri..

    [Spring] 컨테이너에 등록된 스프링 Bean 조회하기 [getBean() 메서드를 활용한 스프링 빈 조회]

    - 컨테이너에 등록된 스프링 Bean 조회하기 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); // 스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법 ac.getBean("memberService", MemberService.class); // 타입만으로도 빈 조회가 가능하다. ac.getBean(MemberService.class); // 스프링에 등록된 모든 빈 이름을 조회한다. ac.getBeanDefinitionNames(); // 해당 타입의 모든 빈을 조회한다. Map 형태로 반환 ac.getBeansOfType(); - ApplicationContextIn..

    [Spring] SOLID : 객체지향 설계의 5가지 원칙(5) [DIP(Dependency Inversion Principle) : 의존 역전 원칙]

    - DIP(Dependency Inversion Principle) : 의존 역전 원칙 의존 역전 원칙은 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 되며, 추상화된 것은 구체적인 것에 의존해서도 안 된다는 원칙이다. 이 원칙을 지키면서 코드를 작성하면, 모듈간의 결합도를 낮출 수 있다. 아래는 의존 역전 원칙이 위배된 코드이다. public class UserService { private Database database = new Database(); public void createUser(String username, String password) { // DB에 사용자 생성 database.insertUser(username, password); } public void deleteUs..