용어(이론) | 설명 |
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개발자 취업 / 전민균 강사님