분류 전체보기

다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 1. 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 지금까지 진행했던 방법이 바로 생성자 주입이다. 특징 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에 사용 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(M..
중복 등록과 충돌 컴포넌트 스캔에서 같은 빈 이름을 등록하면 어떻게 될까? 다음 두가지 상황이 있다. 자동 빈 등록 vs 자동 빈 등록 수동 빈 등록 vs 자동 빈 등록 경우1. 자동 빈 등록 vs 자동 빈 등록 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생시킨다. ConflictingBeanDefinitionException 예외 발생 경우 2. 수동 빈 등록 vs 자동 빈 등록 만약 수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌되면 어떻게 될까? 이 경우 수동 빈 등록이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩 해버린다.) @Component public class MemoryMemberRepository implements Membe..
includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다. excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다. 예제 확인 테스트 코드에 추가 Annotation 만들기 컴포넌트 스캔 대상에 추가할 애노테이션 (@MyIncludeComponent 만들기) package hello.core.scan.filter; import java.lang.annotation.*; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyIncludeComponent { } 컴포넌트 스캔 대상에서 제외할 애노테이션 (@MyExcludeComponent 만들기) package hel..
탐색할 패키지의 시작 위치 지정 모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지 정할 수 있다. basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다. basePackages = {"hello.core", "hello.service"} 이렇게 여러 시작 위치를 지정할 수도 있다. basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다. 만약 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.("hello.core") package hello.core; // 만약 지정하지 않으면 여기서 시작! /..
컴포넌트 스캔과 의존관계 자동 주입 시작하기 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등 록할 스프링 빈을 나열했다. (이전 게시글 : 빈 등록) 더보기 xml로 빈등록 자바 코드로 빈등록 @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl( memberRepository(), discountPolicy()); } @Bean pub..
문제 풀이 📌 SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH DATE_FORMAT : DATE형식 정해주기 AS DATE_OF_BIRTH : 열이름은 DATE_OF_BIRTH로 지정 ➕ DATE_FORMAT 참고 링크 📌 FROM MEMBER_PROFILE MEMBER_PROFILE 테이블에서 📌 WHERE TLNO IS NOT NULL AND GENDER = 'W' AND MONTH(DATE_OF_BIRTH)=3 TLNO IS NOT NULL : TLNO 은 NULL이 아닌 것만 MONTH(DATE_OF_BIRTH)=3 : 3월 인것만 📌 ORDER BY MEMBER_ID; MEM..
문제 풀이 📌 SELECT TRUNCATE(PRICE, -4) AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS PRICE에서 -4(4자리까지는 모두 0)으로 값을 만든다. 이 값의 열의 이름은 PRICE_GROUP이다. #1 PRODUCT_ID의 개수를 센다. 이 값의 열의 이름은 PRODUCTS이다. TRUNCATE(값, 자릿수) '자릿수'까지 숫자를 아래로 버린다(0이 된다). 반드시 버릴 자릿수를 명시해줘야 한다. TRUNCATE(1234.5678, 3) // 1234.567 TRUNCATE(1234.5678, 1) // 1234.5 TRUNCATE(1234.5678, -1) // 1230 TRUNCATE(1234.5678, -3) // 1000 TRUNCATE(1..
문제 풀이 📌 SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE ANIMAL_ID, NAME, SEX_UPON_INTAKE열을 보겠다. 📌 FROM ANIMAL_INS ANIMAL_INS테이블에서 📌 WHERE NAME IN('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty') NAME열에서 'Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty'와 같은 것만 보겠다. WHERE IN WHERE IN 절은 주어진 값 집합 중 하나와 일치하는 레코드를 검색하고, 여러 값을 검색할 때 유용 SELECT column1, column2, ... FROM table_name WHERE column_name I..
memberService → memberRepository() → MemoryMemberRepository() memberService 빈을 만드는 코드를 보면 memberRepository() 를 호출한다. 이 메서드를 호출하면 new MemoryMemberRepository() 를 호출한다. orderService → memberRepository() → MemoryMemberRepository() orderService 빈을 만드는 코드도 동일하게 memberRepository() 를 호출한다. 이 메서드를 호출하면 new MemoryMemberRepository() 를 호출한다. @Configuration public class AppConfig { @Bean public MemberService..
싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하 게 설계하면 안된다. ⭕ ⭐무상태(stateless) ⭐ 로 설계해야 한다!! ❌ 특정 클라이언트에 의존적인 필드가 있으면 안된다. ❌ 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다. → 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!! 가급적 읽기만 가능해야 한다. 필드 대신 자바에서 공유되지 않는, 지역변수, 파라미터, TreadLocal 등을 사용해야 한다. 상태를 유지할 경우 발생하는 문제점 예시 테스트 코드로 진행하겠다. Statefu..
sesam
'분류 전체보기' 카테고리의 글 목록 (12 Page)