본문 바로가기

전체 글120

스프링 - 싱글톤 1. 웹 애플리케이션과 싱글톤 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다! 메모리 낭비가 심하다. 해결방안은 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하면 된다. 싱글톤 패턴 참고로 전에 만들었던 스프링 없는 순수한 DI 컨테이너인 AppConfig는 요청을 할 때 마다 객체를 새로 생성한다. public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") public void pureContainer() throws Exception { AppConfig appConfig = new AppConfig(); //1. 조회: 호출할 때 마다 객체를 생.. 2022. 4. 28.
스프링 - 스프링 컨테이너와 스프링 빈(2) 5. 스프링 빈 조회 - 상속관계 부모 타입으로 조회하면, 자식 타입도 함께 조회한다. 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다. 실무에서 Beans을 조회하는 일은 거의없다. 구현보다는 이해에 포커스를 맞추면 된다. public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); @Test @DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.") void findBeanByParentTypeDuplicate().. 2022. 4. 21.
JAVA - LocalDate, LocalTime, LocalDateTime 3개의 클래스 모두 타임존 개념을 가지고 있지 않기 때문에 타임존에 따른 시간 변환이 불가능하다. 3개의 클래스 모두 immutable 타입이다. 자바8 이전의 날짜와 시간 관련 API인 Date, Calender 클래스들은 더이상 사용하지 않습니다. LocalDate (yyyy-MM-dd) //날짜 출력 LocalDate date1 = LocalDate.now(); System.out.println(date1); //2022-04-14 System.out.println(date1.getYear()); //2022 System.out.println(date1.getMonthValue()); //4 System.out.println(date1.getMonth()); //APRIL System.out.pri.. 2022. 4. 18.
스프링 - 스프링 컨테이너와 스프링 빈(1) 1. 스프링 컨테이너 생성 스프링 컨테이너 생성 //스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext 를 스프링 컨테이너라 한다. ApplicationContext 는 인터페이스이다. 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다. new AnnotationConfigApplicationContext(AppConfig.class); 이 클래스는 ApplicationContext 인터페이스의 구현체이다. 스프링 컨테이너를 부를 때 BeanFactory , Applicatio.. 2022. 4. 16.
스프링 - IoC, DI, (IoC, DI) 컨테이너 제어의 역전 IoC(Inversion of Control) 기존 프로그램은 클라이언트 객체가 스스로 필요한 객체를 생성했다. 반면에 AppConfig 등장이후 구현 객체는 자신의 로직을 실행하는 역할만 담당한다. 반면 프로그램의 제어 흐름은 이제 AppConfig가 가져간다. OrderServiceImpl 객체는 필요한 인터페이스들을 호출하지만 어떤 구현 객체들이 실행될지 모른다. 어떤 구현 객체들이 실행될지 아무것도 모른체 OrderServiceImpl은 묵묵히 자신의 로직을 실행할 뿐이다. 이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)이라 한다. 의존관계 주입 DI(Dependency Injection) OrderServiceImpl 은 Disc.. 2022. 4. 14.
스프링 - 관심사의 분리 feat. DI, AppConfig, SOLID 애플리케이션을 하나의 공연이라 생각해보자. 각각의 인터페이스를 배역이라 생각하자. 그런데! 실제 배역 맞는 배우를 선택하는 것은 누가 하는가? 로미오와 줄리엣 공연을 하면 로미오 역할을 누가 할지 줄리엣 역할을 누가 할지는 배우들이 정하는게 아니다. 로미오 역할(인터페이스)을 하는 레오나르도 디카프리오(구현체)가 줄리엣 역할을 하는 여자 주인공(구현체)을 직접 초빙하는건 DIP원칙에서 벗어난다. public class OrderServiceImpl implements OrderService{ /*인터페이스*/ /*구현체*/ private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); ... } /* 로미오 역할을 디카프리오는 (OrderS.. 2022. 4. 14.