반응형 Framework & Library/Spring Boot164 [Spring Boot] : 탐색 위치와 기본 스캔 대상 [Spring Boot] : 탐색 위치와 기본 스캔 대상 [Spring Boot] : 탐색 위치와 기본 스캔 대상 @ComponentScan( basePackages = "hello.core", } basePackages를 통해 탐색할 패키지 시작 위치를 지정할 수 있고 이 패키지를 포함한 하위 패키지를 모두 조회하게 된다. basePackages = {"hello.core", "hello.service"}이렇게여러 시작 위치를 지정할 수도 있다. 보통 프로젝트 루트에 AppConfig 같은 메인 설정 정보를 두고 @ComponentScan 어노테이션을 붙여준뒤 basePackages 지정을 생략한다. 컴포넌트 스캔은 @Component, @Controller, @Service, @Repository, .. 2022. 1. 9. [Spring Boot] : 컴포넌트 스캔과 의존관계 자동 주입 [Spring Boot] : 컴포넌트 스캔과 의존관계 자동 주입 [Spring Boot] : 컴포넌트 스캔과 의존관계 자동 주입 스프링 빈을 등록할 때 자바 코드의 @Bean과 XML의 을 통해 설정 정보에 직접 등록할 수 있지만 등록해야 할 빈이 수백개가 넘어가면 하나씩 등록하기가 귀찮고 누락하는 문제도 발생하고 설정 정보도 커진다. 때문에 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan을 지원한다. 이에 맞춰 자동으로 의존관계를 주입해주는 @Autowired 기능도 제공한다. @Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classe.. 2022. 1. 9. [Spring Boot] : @Configuration과 바이트코드 조작 @Configuration과 바이트코드 조작 [Spring Boot] : @Configuration과 바이트코드 조작 @Test void configurationDeep() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); AppConfig bean = ac.getBean(AppConfig.class); System.out.println("been = " + bean.getClass()); } AnnotationConfigApplicationContext에서 파라미터로 넘긴 값은 스프링 빈으로 등록이 되기 때문에 AppConfig도 스프링 빈이 된다. AppConfig 빈을 조회.. 2022. 1. 9. [Spring Boot] : @Configuration과 싱글톤의 관계 @Configuration과 싱글톤의 관계 @Configuration과 싱글톤 @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl( memberRepository(), discountPolicy()); MemberService 와 OrderService 를 보면 new memberRepository() 를 호출한다. → 싱글톤이 지켜지지 않는다고 생각할 수 있다. @Test void con.. 2022. 1. 8. [Spring Boot] : 싱글톤 사용시 주의해야 하는 것 싱글톤 사용시 주의해야 하는 것 싱글톤 방식의 주의점 상태를 유지하게 설계하면 안 된다. 특정 클라이언트에 의존적 필드가 있으면 안되고, 값을 변경할 수 있는 필드가 있으면 안되고, 가능하면 읽기만 가능해야 한다. class StatefulServiceTest { @Test void statefulServiceSingleton() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean(StatefulService.class); StatefulService statefulService2 = ac.getB.. 2022. 1. 8. [Spring Boot] : 싱글톤 패턴 싱글톤 패턴 [Spring Boot] : 싱글톤 패턴 / 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. public class SingletonService { //private로 외부에서 접근을 못 하게 하고 인스턴스를 스태틱 영역에 생성해서 올려둔다. private static final SingletonService instance = new SingletonService(); //public로 getInstance()를 통해서만 호출할 수 있도록 return을 instance로 준다. public static SingletonService getInstance() { return instance; } // 생서자를 private로 선언해서 외부에서 new를 통해 객체를 생.. 2022. 1. 6. [Spring Boot] : 웹 애플리케이션 문제 웹 애플리케이션 문제 [Spring Boot] : 웹 애플리케이션 웹 애플리케이션의 문제? 새로운 요청이 있을 때 마다 객체를 생성한다. → 비효율적이고 메모리의 낭비가 발생한다. 해결 방안 → 객체가 1개만 생성되도록 하고 그것을 공유하도록 설계한다. ⇒ 싱글톤 패턴이다. 출처 : 스프링 핵심 원리 - 기본편 - 인프런 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard (강의 내용을 참고로 개인 공부하여 올린 내용입니다.) 2022. 1. 6. [Spring Boot] : Bean Definition Bean Definition [Spring Boot] : Bean Definition 스프링 컨테이너는 BeanDefinition(빈 설정 메타정보)만 알면 된다. @Bean 당 각각 하나씩 메타 정보가 생성된다. 스프링 컨테이너는 이런 메타 정보를 기반으로 스프링 빈을 생성한다. BeanDefinition 자체가 인터페이스로 정의되어 있다. 때문에 스프링 컨테이너는 추상화에만 의존하는 셈이다. BeanDefinition은 어떻게 생성되나? AnnotationConfigApplicationContext 에 보면 AnnotatedBeanDefinitionReader 리더가 있는데 이 리더가 AppConfig.class를 읽고 BeanDefinition을 생성하게 된다.출처 : 스프링 핵심 원리 - 기본편 .. 2022. 1. 6. [Spring Boot] : Spring Bean 조회 기본 Spring Bean 조회 기본 이름으로 조회가 가능하다. @Test @DisplayName("구체 타입으로 조회") void findBeanByName2() { MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);//Imp로 구체적으로 볼 수도 있는데 좋지 않다. assertThat(memberService).isInstanceOf(MemberServiceImpl.class); } 인터페이스가 아니라 구체 타입으로도 조회가 가능하다. 추상화에 의존해야 하므로 이것은 좋은 코드가 아니나 사용해야 할 때가 있을 수 있다. @Test @DisplayName("이름 없이 타입으로만 조회") void findBean.. 2022. 1. 5. [Spring Boot] : 컨테이너에 등록된 빈 조회하기 컨테이너에 등록된 빈 조회하기 컨테이너에 등록된 모든 빈 조회하기 @Test @DisplayName("모든 빈 출력하기") void findAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + "Object = " + bean); } } 스프링 내부에서 사용하는 빈과 내가 직접 등록한 빈 모두 포함이 된다. 구분하기 위해서는 Role()를 사용한다. @Test.. 2022. 1. 5. [Spring Boot] : 라이브러리, DI컨테이너, 스프링 라이브러리, DI컨테이너, 스프링 라이브러리 내가 작성한 코드가 직접 제어의 흐름을 담당하면 라이브러리이다. 자바 객체를 직접 xml이나 json으로 바꾼다면 이것은 라이브러리이다. AppConfig 객체를 생성하고 관리하면서 의존관계를 연결해 준다. IoC컨테이너, DI컨테이너, 어셈블러, 오브젝트 팩토리 등으로 불린다. 스프링 @Configuration 은 설정, 구성 정보로 스프링에서 어노테이션을 활용하여 사용할 수 있다. 그 안에는 @Bean 을 사용해 스프링 컨테이너에 스프링 빈으로 등록할 수 있다. 2022. 1. 4. [Spring Boot] : 제어의 역전 제어의 역전 제어의 역전 예를 들면 JUnit이 있다. 테스트 코드를 작성하면 JUnit에서 로직은 코딩했지만 실행과 제어에 대한 권한은 JUnit이라는 Test Framework이가져가 이것을 대신 실행해 준다. 자신만의 Life Cycle 속에서 규칙을 통해(@BeforeEach를 먼저 실행하고 @Test를 실행한다. 등) 내가 작성한 코드를 Call back식으로 불러지게 된다. 내가 코드만 개발하면 프레임워크에서 딱 필요에 따라 적절하게 호출하는 것, 호출하는 제어권을 넘기는 것을 제어의 역전이라고 한다. 출처 : 스프링 핵심 원리 - 기본편 - 인프런 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%E.. 2022. 1. 4. [Spring Boot] : DIP 코드를 리팩터링하여 OCP도 만족하게 하기 DIP 코드를 리팩터링하여 OCP도 만족하게 하기 코드 리팩터링 public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } } 이 코드는 객체 안에서 new를 통해 특정 객체를 직접 생성하고 있다. 이러면 문제가 중복이 생긴다. 예를 들면 MemberServiceImpl과 OrderServiceImpl에서 MemoryMemberRepository를 사용하기 위해 각각 위 코드처럼 (new MemoryMemberRepository()); 이렇게 따로 생성해 줘야 하기 때문에 이 자체를 중복이라고 본다. public class AppConfig.. 2022. 1. 4. [Spring Boot] : DIP 의존 관계 역전 원칙 적용 예시 DIP 의존 관계 역전 원칙 적용 예시 public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } MemberServiceImpl을 보면 private final MemberRepository memberRepository = new MemoryMemberRepository(); 를 통해 추상화와 구현체를 관리하고 있다. 만약 요구사.. 2022. 1. 3. [Spring Boot] : 프로젝트 설정 프로젝트 설정 https://start.spring.io/ 위 링크에서 스프링 부트 파일을 받기 위해 간단한 설정을 합니다. 최소한의 스프링의 핵심만을 배우기 때문에 추가사항 없이 이렇게만 설정하고 파일을 받아줍니다. 학교에서 배울 때에는 메이븐으로 했는데 요즘은 메이븐의 단점을 보완해 나온 그래들을 사용한다해서 그래들을 사용하는 쪽으로 진행해 봅니다. 파일을 받고 압축을 풀어준뒤 인텔리제이에서 프로젝트 오픈으로 열어줍니다. plugins { // 부트 버전이 표시되어 있습니다. id 'org.springframework.boot' version '2.6.1' // 의존관계 관련된 부분도 설정이 되어 있습니다. id 'io.spring.dependency-management' version '1.0.11.. 2021. 12. 15. [Spring Boot] : 객체 지향과 다형성 객체 지향 객체 지향은 여러 독립된 단위를 파악하고자 하는 것 입니다. 독립된 단위란 객체로 볼 수 있고 결과적으로는 이런 객체들의 뭉치를 파악하는 것 입니다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 쉽게 만들기 때문에 대규모 프로젝트에서 많이 사용됩니다. 다형성 다형성은 유연하고 변경에 용이합니다. 역할과 구현으로 나누어 표현할 수 있고 강의를 보면서 이해하기 편했던 예시가 자동차입니다. 운전자 역할과 자동차 역할이 있습니다. 운전자 역할과 자동차 역할은 1 대 1로 매칭이 되는데 여기서 자동차를 구현한다면 마티즈, 소울, 티코 등으로 구현할 수 있습니다. 자동차 역할 안에 마티즈 구현, 소울 구현, 티코 구현 이렇게 됐을 때 장점은 유연하고 변경이 쉬워집니다. 예를 들면 운전자 역할과 자동.. 2021. 12. 15. [Spring Boot] : 스프링 부트와 스프링 스프링 부트란? 스프링 부트는 스프링 프레임워크를 도와주는 기능이라고 보면 됩니다. 스프링 부트는 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성할 수 있고 스프링 프레임워크처럼 톰캣 서버를 따로 설치해서 연동할 필요가 없이 웹 서버가 내장되어 있어 더 편리하게 사용이 가능합니다. 또, 스프링 프레임워크와 다르게 스프링과 외부 라이브러리의 버전을 알아서 맞춰주기도 하고 메드릭이나 상태 확인 등 모니터링도 지원합니다. 스프링의 핵심 스프링은 Java기반의 프레임워크입니다. Java는 객체 지향 언어인 만큼 이런 특징을 잘 살려내주는 역할을 하는 게 프레임워크라고 볼 수 있습니다. 즉, 스프링은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크입니다. 2021. 12. 15. 이전 1 ··· 5 6 7 8 다음 반응형