본문 바로가기

구디 아카데미 수료 과정/Spring+SpringBoot

구디아카데미 후기/ 국비지원IT개발자 취업 / 전민균 강사님/클라우드 활용 자바개발자 양성과정/•62일차/01.22

용어(이론) 설명
DI(의존적 주입)  
IoC(제어역전)
->New를 하지 않게 됨 
필요할 때 마다 갖다씀
 
AOP(관점지향프로그램) CC/ CCC구분하여 개발
OCP(개폐의 원칙) Application에서 확장시 열려있어야 하고
수정시에는 닫혀있어야 한다.
( Bean이기 떄문에 갖다 쓸수는 있어도 수정할수는 없어)

 

DI란?

Class Diagram 중 Has a 관계를 가지고, 이 관계중  Use 관계를 나타냄

값이 아닌, 만들어진 객체를 입력받아 사용함

기능과 값을 가진 객체를 필요로 함 -> Bean을 만들어서 사용

 

주입방식 4가지

주입방식 설명
생성자 주입 @Autowired (Spring의 Annotation) 혹은
@Resource (WAS의 javax 혹은 Jakarta)를 통해서 미리 생성되어 있는 bean을 주입하는 방식
          ->javax.servlet-api를 dependency 해야함

@Autowired는 타입->이름 검색(Qualifier)
@Resourve는 이름 -> 타입 검색


public class Test{
private UserVo userVo;

  @Autowired
  public Test(UserVo userVo) {        ->UserVo타입의 객체가 Spring Contatiner에
                                                           미리 Bean으로 생성되어 있음
     this.userVo = userVo;
 }
}
멤버필드 주입  
Setter 주입  
메소드 주입  

 

 

 

Bean 생성 방법과 사용 방법

Bean 사용방법
1) Spring Bean Configuration의 xml 설정을 통해서
<bean> 태그를 사용하는 방법
ApplicationContext 객체를 사용하여 Spring Contatier에 bean을 static final로 생성해줌
2) @Component를 사용하는데
    @Component는 stereotype이기 때문에 등록을 위한 설정필요 (이게 <context:component-scan base-package="">

Class 위에서 Annotation 작성하면 자동으로 bean으로 등록됨

<context:component-scan base-package="">
작성하면

@Component
public class Tset{
}                    자동으로 읽어서 bean으로 등록


ClassPathXMLApplicationContext("spring bean configuration xml")
XXX xxx  =~~~.getBean("test");
xxx.메소드명();
3) @Component가 Class에 작성되면 Calss 내부에서 모든 
Method를 Class 이름의 bean으로 사용할 수 있다면

 @Configuration은 Class 내부에 Method를 bean으로 만들어 낼 수 있다
@Configuration
public class Test{
  @Bean
  public void print(){
  }
}

XXX xxx = ~~~.getBean(Test.class) ->얘는 클래스명적어줘야함
xxx.메소드명();

 


IoC 제어역전

 

프로그램은 제어 흐름 순서대로 작업을 진행

 하지만 제어 역전이 되면 Container가 필요한 시점에 존재하는 객체를 자동으로 선택하여 사용

POJO  vs Life-Cycle

구분 설명
POJO개발 Main 클래스 -> 일반 클래스 생성 -> 메소드를 실행
IoC개발

 

 


AOP

관점지향프로그래밍

-CC(Core Concern) : 주 관심사

-CCC(Cross Cutting Concern) : 관점 외 관심사

CC CCC
쿼리
서블릿
MyBatis
로직
...
값을 확인하기 위한 log
예외처리
트랜잭션
관점을 분리해서
개발자는 CC만을 개발하고 
자동으로 CCC 처리할 수 있도록 만들자!

 

 

 

용어 설 명
Aspect 관점을 두 개로 구분하여 표현한다
CC 주관심사 / CCC 관점 외 관심사
Target Aspect가 적용되는 곳 Expression 문법을 사용함
Weaving 지정된(Expression 문법으로 선택된)객체를  새로운 프록시 객체로 생성하는 과정 (합쳐지는거)
CC + CCC를 만드는 과정 
<여기까진 기술 이름>  
Advice CCC를 가지고 있는 메소드
JoinPoint 메소드가 실행되는 시점
실행 전(before),
실행 후(after),
실행 후 반환타입(afterReturning),
실행 중 예외(afterThrowing),
실행 중 전후(around)
PointCut 실행 대상이 되는 집합체의 위치
Expression 문법으로 작성
Execution(public           void        com.min.edu .       *    .             *  .                   (..))
                접근제한자   반환타입    대상패키지명   클래스명     메소드명         arguments
Proxy weaving을 사용하기 위해서 객체를 연결하도록 하는 설정
<bean class="..DefaultAdvisorAutoProxyCreator"> : bean으로 등록
<aop:aspect-autoproxy> : aop namespace로 사용하는 것

 

 

 

work 메소드를 가지고 있는 IHumanWork 인터페이스를 만들고

이를 구현한 Employee(일반직원은 회사업무 담당합니다 )     ->CC

                   CTO(기술부서는 기술을 연구합니다) 만듦           ->CC

 

CCC_Aspect  클래스  = CC가 실행될 때 CCC를 끼기 위한 클래스  따라서  MethodInterceptor라는 인터페이스를 구현해야 함

 

 

 

bean까지 만들었으니 이제 Main 만들어서 실행하면 되는데

Proxy 된 객체는 Interface로 실행해야하는거 기억하기

 


Annotation으로 AOP설정

 

Spring에서

AfterThrowing 처럼 2개의 단어로 돼있으면 키 , 밸류로 2개 적어줘야하는거 확인  (포인트키, 변수명 a 적어줌)

 

annotation 적었으니

xml에  aop:aspectj-autoproxy 선언해서 읽어야함


메서드는 POJO로 만들고  그 메서드들을 AOP Config로 잡아서 하기

 

CCC_Aspect에  @Aspect만 냅두고   어노테이션, Expression 경로를 다 지움

 

-> 그다음 XML에 선언  (after-throwing에서   throwing 부분이  CCC_Aspect에서 선언한거랑 같아야함

 


인터페이스에 없는 메소드를 만들었을 경우  

->java 의 Proxy 동작시키는 법

 

-> Spring framework의 기본 구조는 interface를 통한 OCP구조의 VMI 동작임 

   Right_Brain의 use()메소드는 interface인 IPersonBrain에 작성되어 있지 않기 때문에 weaving의 대상이 아님 

       ->  문제가 발생함
   ->따라서 Spring Container의 Auto-Proxy가 아닌, Java의 Proxy가 동작 되도록 해줘야 한다
   JAVA 객체의 생성은 InvocationHandler의 invoke라는 상위패키지를 가지고 실행됨

 


PointCut Expression 작성 방법

 

    기본문법

execution( 접근제한자 리턴타입 패키지경로 클래스 메소드명 (argument))
execution( public String com.min.edu. Education. school (String)
public으로 시작하는 com.min.edu.Education의 school 메소드 중에서
Arguments를 String으로 가지고 있고 반환타입이 String인 메소드를 찾음

 

  1) 리턴타입

 

    *     : 모든 리턴타입

   void : void만 선택

   !void: return타입이 있는 것만

 execution(public !void com.min.edu.*DaoImpl(String, ...))  

 

  2) 패키지 경로

  com.min.edu : com.min.edu 만을 선택

  com.min.edu.. : com.min.edu로 시작하는 하위 모든 패키지 

 

  3) 클래스

   * : 모든 클래스 선택

   *Dao* : Dao를 포함하는 클래스    UserDaoImple -> Dao를 포함하는 클래스만을 선택적으로 적용 가능 

 

  4) 메소드

   * : 모든 메소드 선택

   *test   :  test를 포함하는 모든 메소드

 

 5) Arguments

 ..: 모든 Arguments 선택

(int) : int타입 한 개를 가지고 있는 arguments

(int, ..) : parameter 중 int로 시작하는 argument만 선택

 


Spring Boot ?

Spring Framework는 많은 기능을 제공하는 만큼 환경설정이 복잡하고 어려움

이러한 어려움을 느끼는 사용자를 위해 나온 것이 Spring Boot임

 

많은 설정을 자동화 시켜서 사용하게 됨

Spring Boot starter 디펜던시만 추가해주면 바로 Spring API를 사용할 수 있음

내장톰캣(embeded tomcate)이나 제티로 웹 어플리케이션도 개발 가능, 외부 middle ware에 의존하지 않고 실행할 수 있음

 

생성은 Spring initializer를 사용하면 바로 실행가능한 코드를 만들어 준다

 

실행환경이나 의존성관리 등의 인프라 관련된 것들을 신결 쓸 필요 없이 바로 코딩을 시작할 수 있음

 

 

 


생성된 spring boot project의 구성 확인

 

     @SpringBootApplication
@Target(value={TYPE})
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@Retention
@Documented
@Inherited




  @SpringBootApplication의 역할을

  @SpringBootConfiguration 객체 설정을 담당하는 클래스를 Bean Factory에 알려주는 역할을 하는 Configuration이 있다    

@ComponentScan 어노테이션을 통해서 자주쓰는 @Controller, @Service, @Repository 등을 Bean으로 등록                      

  @EnableAutoConfiguration은 spring-boot-autoconfigure안에 META-INF 밑에 있는 spring, factories안에                   

                                                                                              들어있는  자동설정들을 조건에 따라서 등록

 

 

 

Spring Bean을 등록하는 방법

@Bean @Configuration @Component

 

@Configuration

-스프링 컨테이너는 @Configuration이 붙어 있는 클래스를 자동으로 등록, 해당 클래스를 파싱(형변환같은거)해서 

 @Bean이 있는 메소드를 찾아서 bean으로 등록해줌

- @Bean은 메소드 레벨에서  사용하는 Annotation이다

 

@Component

   - @Component Annotation이 있는 클래스를 찾아서 모두 자동으로 bean으로 등록

   - 클래스 레벨에서 선언하여 Spring이 실행될 때 (RunTime 시)  Component-scan을 통해서 자동으로 bean을 찾고 등록해줌


Spring Boot에서  Bean 사용 방법 2가지

Component  , Configuration

@Component 

->  클래스 자체를 Bean으로 자동 등록하기 때문에

클래스명을 bean의 이름으로 camel방식으로 해서 첫글자를 소문자로쓴다음  main에서 바로 메서드 사요

 

 

 

@Configuration

->각 메서드에 @Bean을 걸어서 Bean으로 만들어줌  

 

 

 

 

name이 있는애는 name으로 부르고  

name 선언 안한애  메소드명()뗀거 로 호출

 

 

구디아카데미 후기/ 국비지원IT개발자 취업 / 전민균 강사님