[복습]
-DI (Dependency Injection)은 스프링의 핵심 개념으로 내가 사용해야하는 객체를 외부에서 주입받아 사용할 수 있는 기능이다.
ㄴ 클래스와 클래스의 의존관계를 떨어뜨릴 수 있어 유지보수 및 확장에 용이한 프로그램을 만들 수 있다.
-주입에 대한 행위를 자바코드에서 직접하는 것이 아닌 spring이라는 프레임 워크를 이용한다.
[AOP (Aspct Oriented Programming)]
- 관점지향 프로그램의 약자로 객체지향 프로그래밍(OOP)에서 객체의 지향 내부에 기능을 관점적으로 분류시켜서 코드를 작성하는 개발 방법론이다.
- 핵심 기능과 공통관심사항(반복해서 사용해야하는)으로 구분한다.
-클래스
ㄴ정보클래스 : Exception등 정보를 담고 있다. 접미어 dto
ㄴ기능클래스: Scanner등 행위를 담당. 접미어 dao
스프링 = AOP 프레임 워크라고도 불린다.
AOP는 사용자의 요청사항의 흐름을 훔치는 것. 공통관심사와 응답에 대한 요청도 AOP프레임 워크가 훔쳐간다.
핵심사항에서 공통관심사항을 실행할 수 있는것.
(사용자의 요청과 응답을 가로채는 행위 = AOP 다른곳에서는 인터셉터라고도 불린다.)
[AOP 용어] : 관점 분리를 시도하며 공통관심사항을 몰라도 개발이 가능하게 한다.
-Aspect : 여러 객체에 공통으로 적용되는 기능( 공통기능)
ㄴ 어드바이스+포인트컷을 모듈화하여 애플리케이션에 포함되는 횡단기능
-JoinPoint : 실제 공통사항이 호출되는 시점.
-Advice : 조인포인트에서 수행되는 코드를 의미하며 공통관심사항에 해당
ㄴ Aspect를 언제 핵심 코드에 적용할지를 정의.
-PointCut : JoinPoint 중 어드바이스가 적용될 위치를 선별하는 기능
-Advisor : PointCut과 Advice를 합친것. 하나의 어드바이스와 하나의 포인트 컷으로 구성.
-Target : 핵심 기능을 담고 있는 모듈로 공통관심사를 부여할 대상.
-Weaving : Advice를 핵심 코드에 적용하는 것.
#YongTimerAOP.java
package yong.aop;
import org.aspectj.lang.ProceedingJoinPoint;
public class YongTimerAOP {
public Object yongTimerCheck(ProceedingJoinPoint jp) {
System.out.println("[YongTimer 구동됨!]");
System.out.println("핵심 기능 처리시간 체크 시작!");
long start = System.currentTimeMillis();
Object result = null;
try {
result = jp.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("[핵심 기능 수행시간:"+(end-start)+"m/s]");
System.out.println("[핵심 기능 처리시간 체크 종료.]");
System.out.println("[YongTimerAOP 종료!!");
return result;
}
}
#applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean id="yongTimerAop" class="yong.aop.YongTimerAOP"></bean>
<aop:config>
<aop:aspect id="timerAOP" ref="yongTimerAOP">
<aop:pointcut expression="execution(* yong.hello.*.say*(..))" id="yongPoint"/>
</aop:aspect>
</aop:config>
<bean id="messageBean" class="yong.hello.MessageBeanImple">
<constructor-arg>
<value>AOP</value>
</constructor-arg>
<property name="greeting" value="Hello"></property>
</bean>
</beans>
#MessageBeanImple.java
package yong.hello;
public class MessageBeanImple implements MessageBean {
private String name;
private String greeting;
public MessageBeanImple(String name) {
super();
this.name = name;
}
public String getGreeting() {
return greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
@Override
public void sayHello() {
//핵심 시작
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String msg = greeting + ","+name +"!";
System.out.println(msg);
//핵심 끝
}
}
#HelloApp.java
package yong.hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloApp {
public static void main(String[] args) {
String location[] = {"applicationContext.xml"};
ApplicationContext factory = new ClassPathXmlApplicationContext(location);
MessageBean bean = (MessageBean)factory.getBean("messageBean");
bean.sayHello();
}
}
[ApplicationContext 인터페이스]
1)org.springframework.context 패키지에 존재한다.
2)BeanFactory 인터페이스의 서브인터페이스다.
3) 여러개의 편리한 기능이 추가되었다.
- 메시지의 국제화
- 리소스로의 엑세스 수단 간편화
-이벤트 처리
-복수 context 로드 등
4) 빈 팩토리의 생성 코드의 변화.
//기존예
Resource resource = new ClassPathResource("applicetionContext.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);
//바뀐예 1
ApplicationContext factory;
factory = new FileSystemXmlApplicationContext("applicationContext.xml");
//바뀐예 2
String[] configLocations = new String[] {"applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext(configLocations);
프레임워크 들어가면서부터 xml에서 주석은 최대한 피한다.
[AOP execution 명시자 pointcut 표현식]
execution 명시자는 Advice를 적용할 메서드를 명시할 때 사용된다.
기본형식 execution(수식어패턴 리턴타입패턴 클래스이름 메소드명 (매개변수))
- 수식어 패턴 : 생략가능 , public 또는 protected
- 각 패턴은 *을 이용하여 모든 값을 표현할 수 있다. 또한 .. 을 이용하여 0개 이상이라는 의미를 표현할 수 있다.
코드에 대한 버전관리뿐만 아니라 라이브러리 관리에 대한 버전관리도 필요하다.
모두 같은 버전의 라이브러리를 사용하게 제시하는 것이 좋은 방법이다.
실제 라이브러리에 대한 빌드를 도와주는 프로그램으로 엔트 등 다양한 프로그램이 있다.
그 중 정부에서 표준기술로 채택한것이 메이븐이다.
단점은 인터넷이 연결되어있어야하며(최초 설치시), 라이브러리가 쉽게 깨지는 편이다.
1. New > Other> Maven> Maven Project


2. Java EE Tools > Generate Deployment Descriptor Stub
3. 자바 버전 변경 (Properties > Project Facets > Java 를 11로 변경
4. 라이브러리 찾기
맞는 라이브러리 내용 복사하여 porm.xml
<dependencies> 안에 추가</dependencies>
5. web.xml에 서블릿 추가 (클래스는 외울것)

6. 설정파일은 WEB-INF에 만들어야한다. (new>Other>Spring>Sprnig Bean Configuration File)
파일명은 위 서블릿에서 지정한 이름-servlet으로 해야한다. (파일명을 마음대로 생성할 경우 dispatcher이 못찾음)
1. db스키마설계
2. 디자인설계
3. dto,dao설계
4.컨트롤러 설계 (1. 명령어선정 / 2.커맨드클래스 작성)
[스프링 MVC 구성요소와 흐름]
DispatcherServlet : 클라이언트의 요청을 전달 받는다. 컨트롤러에게 클라이언트의 요청을 전달 하고, 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성하도록 한다. (기존에 만들었던 controller)
HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지를 결정한다.(스프링에서만 제공)
컨트롤러(Controller) : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다. 스트럿츠의 Action과 동일한 역할을 수행한다. (기존에 만들었던 Action)
ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.(request의 대체품)
ViewResolver : 컨트롤러의 처리 결과를 생성할 뷰를 결정한다.(스프링에서만 제공)
뷰(View) : 컨트롤러의 처리 결과 화면을 생성한다. JSP나 Velocity 템플릿 파일 등을 뷰로 사용한다.

스프링의 장점 : POJO방식을 지원(일반 클래스로 컨트롤러를 만들 수 있다.)
@어노테이션이라고함.
@Controller 지정. @RequestMapping지정

viewResover은 최초에 등록을 해줘야한다.

*사용자의 직접적인 접근 방지하는 방법
-WEB-INF는 웹의 전반적인 정보를 담고 있다.
jsp를 개발할때도 바로 WEB-APP이 아닌 사용자가 접근하지 못하도록 WEB-INF에서 관리한다.

setViewName에서 반복해서 사용할 접두어와 접미어는 미리 등록해놓는다.

그러면

'개발자 > 백엔드 웹 개발자 과정(국비)' 카테고리의 다른 글
| [Spring] DTO안 DTO , 진입메서드 (0) | 2023.02.27 |
|---|---|
| [Spring] post 인코딩방식 설정, DBCP추가 (0) | 2023.02.23 |
| [Spring] 스프링의 주요 기능 및 특징과 DI , AOP (0) | 2023.02.21 |
| [디자인패턴] EL(Expression Language) & JSTL (0) | 2023.02.20 |
| [디자인패턴]사원관리프로그램 생성하기 (0) | 2023.02.17 |