일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- scroll 맨 밑 이동
- MySQL update delete
- jQuery EventListener
- SWEA 11315 python
- ReactMediaRecorder
- GitHub
- SWEA 1954 java
- scroll 맨 밑
- CSS
- js canvas
- $.ajax 사용
- dispatcherservlet 오류
- sw8931
- java
- tabs switch
- SWEA 6190 python
- js 객체생성
- MySQL
- SWEA 1228 python
- Git
- 페이지 내 탭
- request property
- scanner bufferedreader
- 탭 활용해 내용바꾸기
- js session
- js XML 읽기
- Canvas
- web recorder
- javascript
- response property
Archives
- Today
- Total
Daily Pogle
[Spring] spring 이란 본문
Spring 이란?
- Spring 은 Java 기반의 Framework
- Java 의 가장 큰 특징인 객체지향의 장점을 극대화한 Framework
- Spring 은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 Framework
Spring 은 Java 진영의 대표적인 웹 프레임워크이다. Spring 은 Java 의 가장 큰 특징인 객체지향 프로그래밍의 장점을 최대로 끌어낸 Framework 이다.
Spring 이 나오기 이전 개발자들이 Java 를 가지고 좋은 객체지향 개발을 하기 위해, 객체지향설계를 위한 5가지 원칙(SOLID)을 모두 지키려 했으나, 코드량이 많아지고 구조가 복잡해지는 문제가 생겼다.
객체지향개발을 위한 환경을 갖추기 위해 많은 준비가 필요하다. 특히 구현하기 까다로운 제어의 역전(IoC), 의존관계 주입(DI) 부분을 개발자가 쉽게 사용할 수 있는 기능을 Spring 에서 제공한다.
Spring 은 Java가 가진 다형성을 극대화할 수 있게 도와준다. Java 에서는 역할을 정의하는 인터페이스와, 역할을 수행하는 구현체(구현클래스) 기능을 제공한다. 이를 통해 가져올 수 있는 장점은 다음과 같다.
- 개발 유연성과 변경용이성을 가진다.
- 확장가능한 설계를 가진다.
- 클라이언트에 영향을 주지않는 변경이 가능하다
스프링 컨테이너(Spring Container)
스프링 컨테이너를 ApplicationContext 인터페이스의 구현체라고 봐도 된다. 세부적으로는 BeanFactory, ApplicationContext 로 구분하지만, BeanFactory 를 직접 사용하는 경우는 적기때문에 일반적으로 ApllicationContext 를 스프링 컨테이너라고 한다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class)
- 스프링 컨테이너 생성
- AppConfig.class 는 사용자가 직접 작성한 설정 클래스, @Configuration 애노테이션을 통해 설정클래스로 지정할 수 있다.
/**
구현객체를 생성하고 연결하는 책임을 가지는 AppConfig
다른 Service 을 이 DIP 와 OCP 를 지킬 수 있도록 대신 구현체를 생성해서 연결해줌
AppConfig 는 애플리케이션 전반에 대한 환경구성 및 설정을 책임진다.
@Configuration : 애플리케이션의 구성정보에 적용
@Bean : Spring container 에 bean 으로 등록함.
AppConfig class 에 있는 환경정보를 가지고 Spring 이 Spring Container에 넣고 관리 해줌
싱글톤이 가지고 있는 많은 문제점들을 모두 해결하여 관리한다.
Spring Container 가 자동으로 객체를 싱글톤패턴으로 관리해준다
*/
@Configuration
public class AppConfig {
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
}
위의 AppConfig 를 설정파일로 스프링 컨테이너를 생성하면, 스프링 컨테이너는 다음과 같이 구성된다.
스프링 컨테이너 - Bean 저장소
bean name | bean object |
---|---|
memberService | MemberServiceImpl@x01 |
orderService | OrderServiceImpl@x02 |
memberRepository | MemberRepository@x03 |
discountPolicy | RateDiscountPolict@x04 |
- @Bean 을 통해 등록한 Bean 의 이름은 기본적으로 메서드 이름을 사용한다
- @Bean(name) 을 통해 Bean 의 이름을 설정할 수 있다.
- @Bean 이 설정된 메서드의 반환값(객체 인스턴스)이 Bean Object 로 등록된다.
스프링 컨테이너 확인하기
테스트코드를 통해 쉽게 스프링 컨테이너에 있는 bean 들을 확인해보자
- AnnotationConfigApplicationContext 를 통해 스프링 컨테이너의 정보를 가져올 수 있다.
- getBeanDefinitionNames 메서드를 통해 등록된 모든 Bean 의 이름을 출력할 수 있다.
- getBeanDefinition("bean name", "type") 메서드를 통해 Bean 정보를 얻을 수 있다.
- BeanDefinition 을 통해 스프링 컨테이너의 Bean 정보를 객체로 담아서 제공하는 메서드를 통해 정보를 가져올 수 있다.
- getRole 메서드를 통해 해당 Bean 이 어떤 역할을 하는지 알 수 있다.
- ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
- ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
- getRole 메서드를 통해 해당 Bean 이 어떤 역할을 하는지 알 수 있다.
/**
* ApplicationContext 는 interface 이므로 구현체인 AnnotationConfigApplicationContext 를 통해서 확인할 수 있음.
*/
class ReadApplicationContextTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("모든 빈 출력하기")
void findAllBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name=" + beanDefinitionName + " object=" + bean);
}
}
@Test
@DisplayName("애플리케이션 빈 출력하기")
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
//Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
//Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name=" + beanDefinitionName + " object=" + bean);
}
}
}
@Test
@DisplayName("빈 이름으로 조회")
void findBeanByName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("이름 없이 타입만으로 조회")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("구체 타입으로 조회")
void findBeanByName2() {
MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("빈 이름으로 조회X")
void findBeanByNameX() {
//ac.getBean("xxxxx", MemberService.class);
Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
ac.getBean("xxxxx", MemberService.class));
}
}
'백엔드 기술 > Spring' 카테고리의 다른 글
[Spring] 싱글톤패턴과 스프링 (0) | 2023.11.07 |
---|---|
[Spring] BeanFactory, ApplicationContext, BeanDefinition (0) | 2023.11.07 |
[Spring] 주요 annotation 정리 (0) | 2023.03.06 |
[Spring] 파일 업로드/다운로드 기능 구현 (0) | 2023.02.28 |