Flamme Dev
  • IntroduceMyself
  • GOAL
    • 2021년 목표
    • 회고록
      • 2020년
  • COMMON
    • 자료구조
      • 시간복잡도
      • 스택/큐
    • 코드리뷰/스터디/세미나
      • Semina
        • Version control -1 (SVN/GIT)
        • Version control - 2 (GIT)
        • PostMan
        • JMeter
      • 스터디
        • 2021년
          • EffectiveKotlin
          • 이펙티브자바
        • 2020년
          • JPA Study
            • Chap1
            • Chap3
            • Chap4
            • Chap5
            • Chap6
            • Chap7
            • Chap8
            • Chap9
            • Chap10 -1
            • Chap10-2
            • Chap10-3
            • Chap12
            • Chap 13. 웹 애플리케이션과 영속성 관리
            • Chap14
      • 코드리뷰
        • Page 1
        • 개발 생각
        • APNs 라이브러리 교체
        • 파일 삭제 분투기
        • 신입 코드리뷰
          • 2020-09-02
          • 2020-09-03
          • 2020-09-10
        • Repository
          • Repositroy(20201124)
          • Repositroy(20201123)
          • Repositroy(20201120)
          • Repositroy(20201119)
          • Repositroy(20201117)
    • 개발 서적 / 동영상 강의
      • 동영상 강의
        • 진행 중
        • 완주한 것
      • 개발 서적
        • 읽은 것
          • 손에 잡히는 10분 SQL
            • 인덱스
            • 정리 본
        • 진행 중
          • 폴리글랏 프로그래밍
          • DDD-START
            • Chapter5 리포지터리의 조회 기능
            • Chapter4 리포지터리와 모델 구현
            • Chapter3 애그리거트
            • Chapter2 아키텍쳐 개요
            • Chapter1 도메인 모델의 시작
  • INFO
    • 유스콘 준비
    • intellij
      • Command line is too long.
    • 프로그래밍의 종류
      • Async Await
      • Reactive Programming
      • Imperative Programming
      • Functional Programming
        • Naver D2 함수형 프로그래밍 강의
      • Object Oriented Programing
        • 객체지향에 대해서 알아보는 영상
      • ProcedureOriented Programming
      • RX(ReactiveX)
      • OOP VS FP
      • Declarative Programming
    • Language
      • Kotlin
        • 박재성님 강의
        • Kotlin Spring CGLIB Error
        • Kotlin의 사용
        • coroutine
        • Kotlin JVM
      • JavaScript
      • JAVA
        • DefaultNonnull
        • effective78
        • Exception
        • JsonUnWrappers
        • 명명짓기
        • @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
        • Enc Key
        • ServiceLoader
        • Annotation
        • JVM(Java Virtual Machine)
        • Java8
          • Functional 사용
          • Optional
          • Invalid Key size
        • Java13
          • Text Block
        • Basic
          • Generic
          • JVM
          • Interface, Implements
    • Framework
      • NodeJs
      • Xamarin
      • Vert.x
        • vert.x in action
        • eventbus
      • blockedthreadchecker
      • Why.. not root run..
      • Spring
        • Spring Test
        • Kotlin
        • ControllerAdvice 정리
        • JsonAnnotation
        • Spring Data R2DBC
        • SpringWebFlux
          • login
          • SpringWebFlux란?
        • JPA
          • QueryDSL 객체 주소값 확인할 것
          • SpringData-JPA에서 Save, SaveAll
          • @CompositeKey에 ManyToOne JoinColumn이 있을 경우
          • QueryDSL N+1 문제(@OneToOne)
          • QueryDSL설정
          • CreationTimestamp
          • Enum(@enumerated vs @convert)
        • SpringSecurity
          • aopAlliance
          • csrf 방어
          • antMatcher vs mvcMatcher
          • SpringSecurity를 왜 써야할까?
          • CoreSpringSecurity
            • AuthenticationProvider
            • AuthenticationManager
            • Authentication Flow
            • SecurityContextPersistenceFilter
            • SecurityContextHolder, SecurityContext
            • Authentication
            • 필터 초기화와 다중 보안 설정
            • DelegatingProxyChain, FilterChainProxy
            • 사이트 간 요청 위조 - CSRF, CsrfFilter
            • 예외 처리 및 요청 캐시 필터 : ExceptionTranslationFilter, RequestCacheAwareFilter
            • 인가 API - 권한 설정 및 표현식
            • SessionManagementFilter, ConcurrentSessionFilter
            • 동시 세션 제어 / 세션고정보호/ 세션 정책
            • AnonymousAuthenticationFilter
            • RememberMeAutheticationFilter
            • Logout,LogoutFilter
            • UsernamePasswordAuthenticationFilter
            • Form인증
            • 인증 API - 사용자 정의 보안 기능 구현
            • 인증 API - 스프링 시큐리티 의존성 추가
        • SpringMVC
          • Spring Bean Q&A
          • HttpServletRequest
          • @ControllerAdvice
          • Service와 ServiceImpl은 꼭 있어야할까?
          • SpringMVC-1
          • SpringMVC - validator와 Errors
          • SpringMVC - DispatcherServlet의 URL
          • Spring MVC - 기본설정(2) 및 HandlerInterceptor
          • SpringMVC-3
          • Spring MVC - ViewResolver
          • Spring MVC - XML/JSON
          • Spring MVC - Field Injection & Constructor Injection
        • SpringEtc
          • Transactional
          • @Atowired NullPointer
          • CircleReference
          • Mybatis
            • IBatis - sql에 Map
            • 1:1 Mapping시 Null
            • auto_Increment, selectKey
          • @Transactional
          • JacksonAnnotation
        • SpringAOP
        • SpringDI
    • Server
      • PM2
      • Tomcat
        • jks
        • Virtual Host(Port)
    • OS
      • Window
        • Active directory
      • IOS
      • Linux
        • samba/keroberos
        • Linux
          • unlimit / socket backLog
          • nohup
          • ; , & , &&, {}
          • 쉘
          • rc.local
          • ps aux | grep 프로세스이름
          • Vim
          • Su, Sudo
          • File Directory
        • IdConfig
        • 유용한 커맨드
        • 리눅스 대소문자
        • 소프트링크와 하드링크의 차이
        • ln -Tfs
        • //와 / 의 차이
        • Linux(202003)
          • rm
          • diff
          • cp
          • mv
          • tar 압축 시 어떻게 심볼릭 링크도 같이 압축할까?
          • tar 명령어
          • ln -s 심볼릭 링크
    • Network
      • API Architectural Styles
      • 포트 확인
      • HeartBeat Protocol
      • SSO(Single Sign On)
      • Cookie and Session
      • Tcp HandShake
      • WireShark
        • WireShark 옵션
        • WireShark 패킷분석
    • DataBase
      • DB락에 대해서 알아보기
      • Redis
      • MYSQL
        • Mysql TimeOut 설정
        • MysqlLog
        • SlowQuery Analyzing
        • PushNotification Stress Test
      • MSSQL
      • 데이터베이스 식별자 선택 전략
    • ETC
      • 이름 짓기
      • FFProbe
      • Talk
      • Untitled
Powered by GitBook
On this page

Was this helpful?

  1. INFO
  2. Framework
  3. Spring

SpringDI

최범균님의 스프링 4.0 책을 쓰고 정리한 글입니다.

대전 D 개발원을 나오고 나서 다시 한번 스프링에 대한 기초를 잡아보려 회사에 굴러다니는 스프링 4.0 책을 펼쳐보았다.

오늘은 이 책의 두번째 챕터인 Spring DI에 대해서 포스팅을 하려고 한다.

DI란 Dependecy Injection의 약자이고 우리말로는 '의존 주입'이라고 한다.

Spring FrameWork는 DI기반으로 돌아가기 때문에 DI에 대한 개념이 일단 필요하다.

JAVA를 공부했을 때 필자는 'NEW 뭐시기뭐시기' 를 많이 썼을 것이다.

맞다. 우리는 NEW를 붙이면서 의존하는 타입의 객체를 직접 생성을 했던 것이다.

이것이 바로 의존 주입이라는 것이다.

이렇게 의존 주입을 직접 생성하면서 해주면 뭐가 안 좋을까?

이렇게 직접 생성하는 것에는 단점이 있다. 필자는 두 가지만 적겠다.

만약에 더 다른 단점이 있고 이러한 장점을 Spring DI가 해결해주는 게 있다면 덧글을 달아주길 바란다.

1. 코드량이 늘어날 것이다.

2. 다른 클래스를 완성하기 전까지는 우리는 이 클래스에 해당되는 테스트는 사용하지 못한다.

이 둘을 어떻게 해결할까?

1번은 java class를 이용한 의존 주입, xml을 이용한 의존주입 마지막으로 annotation을 이용한 의존 주입으로

코드를 짧게 만들어주고 정리도 해준다.

2번은 완성하기 전에 더미 데이터를 넣어서 테스트할 수 있도록 도와준다.

그럼 DI설정은 어떻게 해줄까?

Spring을 처음 접하면 bean이라는 용어를 Spring이라는 단어 다음으로 많이 들을 것이다. 그리고 많이 보았을 것이다.

그렇다. Bean을 이용하여 의존성 주입을 할 수도 있고, 의존성 주입을 제안할 수도 있다.

또한 의존성 주입으로 API 사용 그리고 SpringFrameWork의 기능들을 대부분 쓸 수가 있다.

그리고 아무도 이런 짓은 하지 않겠지만, 한 XML 파일이나 Class파일에 절대 의존성 주입을 다 모아놓지 않았으면 한다.

필자는 개발할 때 가장 필요한 것은 바로 정리라고 생각한다. 즉 의존성을 한 곳에다가 모아놓지 말고, 연관된 것끼리

모아서 정리해놓길 바란다.

이제 DI를 공부하면서 다시 한번 알게 된 정보들이다.

1. xml에서 DI를 설정한 java class를 주입하려면 <context:annotation-config>를 사용해야 된다는 것

그리고 configuration이 적용된 빈을 또한 등록해야 된다는 것이다.

그러면 반대로 java class에 xml을 등록시키려면 어떻게 해야 하냐면 class위에 @ImportResource("classPath:xml이름")을 써야 된다는 것이었다

즉 @Configuration @Import~가 된다는 점이다.

두 개 일 때는 객체 형태로 쓰면 된다.

2. 어노테이션 기반 의존 자동연결 설정

<context:annotation-config/> 설정하기이다.

ex) @Autowired, @Resource, @PostConstruct, @Qualifier 어노테이션을 쓸 수 있게 된다.

그럼 @Inject는요?

Inject는 pom.xml을 이용하여 추가해주면 된다.

3. 컴포넌트(@Component) 설정하기

컴포넌트(@Component)란?

스프링 빈으로 자동으로 등록하고 의존을 자동 설정함으로써 각 빈 간의 의존 처리가 가능하게 한다.

컴포넌트를 사용하려면?

기본적으로 컴포넌트 어노테이션을 사용하면 <context:component-scan> 태그를 이용하여 빈을 등록한다.

ex) xml : <context-component-scan base-package="클래스 주소">

java : @ComponentScan(basePackages = "클래스 주소")

Component의 종류는 Component, Service, Repository, Controller가 있다.

나는 지금까지 Component를 xml에 설정했지 클래스 위에 어노테이션을 써본 적이 없었다.

다음 프로젝트부터 적용해봐야 되겠다.

그 외 현재 나는 Service는 서비스단, Repository는 dao, Controller는 jsp를 연결해주기 위해서 사용하고 있다.

스캔 대상 클래스 범위 지정

항상 전자정부 프레임워크, 그리고 스프링 Component설정을 보면 아래와 같은 설정이 있다.

<context:component-scan base-package="egovframework">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
 </context:component-scan>

이 설정은 바로 Controller, Service, Repository를 어느 정도 범위 내에서 자동 스캔할 것인지에 대한 설정이다.

type값에 들어갈 수 있는 것들 종류가 꽤 있다.

annotation, assignable, regex, aspectj가 있다고 한다.

글 쓰면서 느낀 점은 빈을 사용하면 클린 한 코드를 사용할 수 있을 뿐 아니라 비즈니스 로직을 절차적으로 구현할 수 있을 것 같다.

4. 스프링 컨테이너의 생명 주기

컨테이너 생성 -> 빈 메타 정보를 이용한 빈 객체 생성 -> 컨테이너 사용 -> 컨테이너 종료

5. 스프링 컨테이너의 계층 구조

컨테이너는 부모-자식 관계의 계층 구조를 가질 수 있다.

즉, 자식에 속하는 컨테이너는 부모 컨테이너에 속한 빈을 참조할 수 있다. 반대로 부모 컨테이너는 자식 컨테이너를 참조할 수 없다.

부모/자식 구조를 만들고 싶다면 set을 이용하자.

이상이다.

PreviousSpringAOPNextServer

Last updated 4 years ago

Was this helpful?