• 기간 9월 30일(금)~10월 06일(목)
  • 스프링 기본 문법 및 기본적인 API 설계

 

DI 란?

의존성 주입(Dependency Injection, DI)

  • 설정 파일(XML)이나 어노테이션을 통해 객체 간 의존 관계를 설정하여, 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.
  • 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되어 있기 때문에, 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며, 모듈간의 결합도도 낮출 수 있다.계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜준다.
  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야 한다.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

        - 이일민, 토비의 스프링 3.1, 에이콘(2012), p114

DI 장점!

1. 의존성이 줄어든다.

앞서 설명했듯이, 의존한다는 것은 그 의존대상의 변화에 취약하다는 것이다.(대상이 변화하였을 때, 이에 맞게 수정해야함) DI로 구현하게 되었을 때, 주입받는 대상이 변하더라도 그 구현 자체를 수정할 일이 없거나 줄어들게됨.

2. 재사용성이 높은 코드가 된다.

 있다.

3. 테스트하기 좋은 코드가 된다.

4. 가독성이 높아진다.

 

IOC란?

제어 역전(Inversion of Control, IoC)

  • 기존에는 객체의 의존관계를 개발자가 직접 처리해 주곤 했다. 하지만 스프링에서는 객체 생성과 의존 관계를 자바코드로 직접 처리하는 것이 아니라 컨테이너가 라이프사이클, 클래스 등을 직접 처리한다. 즉, 개발자가 직접 제어하는 부분을 프레임워크가 대신 제어하게 되어 제어권을 가지게 되었다. 그래서 제어의 역전이라고 한다.
  • 스프링에서는  '오브젝트' '빈(Bean)'이라고 칭한다.
  • @Autowired 어노테이션을 사용함으로써 개발자가 직접 의존관계를 설정해주는 코드가 사라지고 프레임워크에 오브젝트 의존관계의 제어권을 맡길 수 있게 된다.

스프링 빈(Spring Bean)이란?

Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다.

 

빈이란?

  • Bean은 Spring IoC Container가 관리하는 자바 객체, Spring Bean Container에 존재하는 객체를 말한다.
  • Spring IoC(Inversion of Control) Contatiner에 의해 인스턴스화, 관리, 생성된다.
  • Bean Container는 의존성 주입을 통해 Bean 객체를 사용할 수 있도록 해준다.
  • Spring에서 Bean은 보통 Singleton으로 존재한다.
    Singleton : 어떤 Class가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 객체를 만들어 사용하는 디자인 패턴

Bean 생성 방식

Component Scanning

Spring IoC Container가 IoC Container를 만들고 그 안에 Bean을 등록할때 사용하는 Interface들을 Life Cycle Callback이라고 부른다.

Life Cycle Callback 중에는 @Component이 붙어있는 모든 Class의 Instance를 생성해 Bean으로 등록하는 작업을 수행하는 Annotation Processor가 등록 돼있다.
Instance : 일반적으로 실행 중인 임의의 프로세스, 해당 클래스의 구조로 컴퓨터 저장공간에서 할당되어 현재 생성된 Object를 의미.

이때, @ComonentScan Annotation이 붙어있는 Class가 이에 해당한다.

 

즉, @ComponentScan, @Component Anotation을 사용해서 Bean을 등록하는 방법이다.

 

@ComponentScan은 어느 지점부터 Component를 찾으라고 알려주는 역할을 하고,

@Component는 실제로 찾아서 Bean으로 등록할 Class를 의미한다.

 

@ComponentScan @Component이 부여된 Class를 찾아 자동으로 Bean으로 등록해주는 역할을 한다.

@ComponentScan이 붙어있는 Class가 있는 package에서부터 모든 하위 package의 모든 Class를 찾아 다니며,

@Component나 @Component를 사용하는 다른 Annotation을 사용하는 Class를 찾는다.
[EX] Stereotype Annotation(@Controller, @Service, @Repository 등)
Stereotype Annotation들은 내부적으로 @Component Annotation을 사용한다.

Configuration

Configuration을 이용한 Bean 등록 방법은, XML에 설정하는 방법과 Java Class에 설정하는 방법이 있다.
Bean 설정파일은 XML과 자바 설정파일로 작성할 수 있는데 일반적으로는 XML에 설정하지만, 최근 추세는 자바 설정파일을 좀 더 많이 사용한다.

 

@Configuration 사용, @Bean 정의

먼저 Java class에서 @Configuration Annotation을 사용해서 직접 @Bean을 등록해주는 방법이다.
일반적으로 xxxxConfiguration와 같이 명명한다.

@Bean Annotation을 사용해 직접 Bean을 정의하면 자동으로 Bean으로 등록된다.

이렇게 Bean을 직접 정의해서 등록하면 @Component Annotation을 붙이지 않아도 된다.

 

Bean Scope

Spring은 기본적으로 모든 Bean을 Singleton으로 생성하여 관리한다.
Singleton Bean은 Spring Container에서 한 번 생성 후, Container가 사라질 때 Bean도 제거.
생성된 하나의 Instance는 Single Beans Cache에 저장되고, 해당 Bean에 대한 요청과 참조가 있으면 캐시된 객체를 반환.
하나만 생성되기 때문에 동일한 것을 참조, 기본적으로 모든 Bean은 Scope가 명시적으로 지정되지 않으면 Singleton.

구체적으로는 Application 구동 시 JVM 안에서 스프링이 Bean마다 하나의 객체를 생성하는 것을 의미한다.

그래서 Spring을 통해서 Bean을 주입 받으면 언제나 주입받은 Bean은 동일한 객체라는 가정하에서 개발 한다.

 

 

배운 것

전반적인 스프링 부트에대한 기동원리와 거기서 사용하는 언어테이션 등 자바의 기본적인 문법들을 배운 뒤 그것을 활용하는 방법에 익수해지는 시간이였다.

 

아쉬웠던 점/느낀점

처음 배우는 언어인 만큼 여러가지 프레임워크들을 사용해야 했다. JPA를 사용하면서 기존의 사용하던 쿼리문을 사용하지 않아 처음에는 불편한 감이 있었지만 JPA에서 자동으로 쿼리문을 만들어주고 처음에는 이걸 왜 사용하지? 이런 생각을 했지만 조금씩 코드가 복잡해지면서 가독성? 코드 길이 등 처리속도가 빨라지는 것을 느꼈다.

스프링 부트에서 쓰는 어노테이션 아예 새로운 언어로 느껴졌고 그것에 대한 기능들을 알지 못해 사용하은 하지만 이게 왜 되는지는 생각해보지 않고 했었던 것 같다. 기본적인 셋팅과정등 붙여넣기만 하는게 아니라 그거를 실행 시켜보고 이게 왜 작동하는지는 공식 문서 밑 구글링을 하면서 좀 더 자세하게 알아보아야 할 것 같다.

 

'항해 99(9기) > WIL' 카테고리의 다른 글

항해 99 (9기) 7주차 WIL  (0) 2022.11.06
항해 (9기) 6주차 WLI 회고  (0) 2022.10.30
항해 99 주차 4WIL  (0) 2022.10.16
항해 99(9기) 2주차 회고  (0) 2022.10.02
항해 99 (9기) 1주차 회고  (1) 2022.09.25

+ Recent posts