<전 시간 내용 복습>
복습을 위해 pro19에 있던 com.spring.ex03에 있던 것을 com.kosta.sample3 package를 만들어서 거기에 그대로 복사했다.

src/main/resources에 member.xml을 만들어 주었다.
member.xml에서 한가지 유의할 것은 아래 처럼 aa라고 써주면 태그에 모두 aa를 사용해야한다.
aa를 안쓸거니까 우리는 지워준다.


MemberServiceImpl class를 살펴보면 setMemberDAO를 갖고있다.

member.xml에 property name="memberDAO"라고 쓸수 있다. 왜냐하면 MemberServiceImpl에 setMemberDAO가 있기 때문이다.

MemberServiceImpl class와 MemeberDAOImpl에 기본생성자를 추가한다.


그리고 MemberTest1.java에서 실행해본다. 실행했을때 어떤 결과가 나올지 생각해보도록 한다.

----------------------------------------------------------------------------------------------------------------------------
지금부터는 @어노테이션을 사용해보도록 하겠다.
먼저 member2.xml을 만들어준다.

그리고 MemberDAOImpl에 가서 @Repository를 넣는다.
Repository는 xml에 class를 불러오기 위함이고 그 뒤에 ("mdao") 괄호안에 mdao에는 내 마음대로 이름을 정할수 있다.

@autowired는 맞는 타입을 알아서 읽어가게 하기위해서 사용했다. 아래 사진과 같이 autowired를 쓸 수 있는 곳은 3곳이다.

member2.xml은 @Repository와 @autowired를 바로 읽을 수 없다. 그래서 context를 추가해주어야한다.
그다음 member2.xml로 넘어가서 Namespaces에 context를 추가해준다.

그러면 아래 component-scan을 활용해서 @repository를 읽어올수있다.

member2.xml에 아래사진과 같이
<context:component-scan을 활용해서 @repository를 scan하도록한다.
<context:annotation-config>을 활용해서 @autowired를 scan하도록 한다.

아래 MemberTest1.java에서 아래와 같이 테스트 해보도록 한다.

-----------------------------------------------------------------------------------------------------------------------------------
@Required를 사용해보도록 하겠다.
@Required는 값을 반드시 넣어야한다고 한다. Car Class를 만들어 Required를 넣어주었다.

memeber2.xml에서 아래와 같이 model을 넣지 않고 생성하였을때는 에러가 난다.??에러가 나야하는데 수업시간에 안났다. 강사님이 depricate된 것같다고 이야기 하셨던것 같기도하고..기억이 안나니 대충 넘어가도록 하자.

required가 원래는 반드시 값을 넣어주어야 한다고 하였으니 namespace에서 p를 추가해주고

member2.xml에서 model을 추가해주자.

이렇게 하고나서
MemberTest1.java에서 테스트 해보도록한다.
----------------------------------------------------------------------------------------------------------------------------
지금부터 AOP에 대해 배워보도록 한다.
AOP에 대해 한마디로 정리하자면 주기능과 보조기능을 분리시키고, 특정 부분에서만 메서드를 실행시키도록하는 것이다.(대충 이해한 내용을 적었다. 책을 보고 추후 다시 보완하도록 하자.)
AOP테스트를 위해서 새롭게 Package를 만들었다.com.kosta.sample4AOP

Calculator라는 Class를 만들었다. add,substract등의 메서드가 있다.

아래는 보조기능을 위한 Class다. 인터페이스 MethodInterceptor를 구현하였으며 invocation.proceed()에서 주기능 메서드를 실행하고. 그 전후로 보조기능을 추가할 수있다.

src/main/resources에서 AOPTest.xml을 만들어준다.

이후 CalcTest.java에서 테스트해보면 아래 그림과 같은 결과가 나온다.

이번에는 list에 value를 하나 더 추가해보겠다. LogginAdvice2.java를 추가했다.

그리고 AOPTest.xml에 value에 logAdvice2를 추가했다.

CalTest에서 실행해보면 아래와 같이 logAdvice, logAdvice2 둘다 보조기능으로 실행되는것을 확인할수있다.

그렇다면 이번에는 모든 메서드에 대해서 보조기능을 실행하는 것이 아니라 특정메서드에 대해서만 보조기능을 실행하도록 해보겠다. AOPTest.xml로 가서 이번에는 DefaultPointcutAdvisor라는 객체를 생성한다.그리고 property name에 value태그에 execution(* add(..))이라고 넣으면 된다. ..는 매서드에 매개변수의 갯수가 상관없음을 말한다. 만약 execution(* add(int)) 라 들어갔다면 매개변수가 int 1개 인 것만 보조기능이 들어가고 execution(* add(int, int))라고 되어있다면 int가 2개인 것에 보조기능이 들어간다.

CalTest에서 테스트를 해보면 add가 들어있는 메서드만 실행된것을 볼수 있다.

참고로 value에 within을 사용해서 하면 다 들어간다. 참고하도록하자.

----------------------------------------------------------------------------------------------
이번에는 package5를 만들도록 하자.

sample4AOP에서 Calculator와 LogginAdvice를 가져왔다. Calculator Class에 들어가서 Xml에서 bean 객체를 생성하지 않고 바로 사용하기 위해 Component 어노테이션을 사용했다.

LoggingAdvice.java에서는 기존것과는 다르게 implement 를 뺐다. 위에서는 implement로 인터페이스를 구현했었다.
그리고 어노테이션을 활용해서 Pointcut, Around를 쓴다.
LoggingAdvice.java에서는 @Pointcut("execution(* add(int))")라고 해서 add매서드에 매개변수가 1개인 것에 대해서만 보조기능이 작동하도록 코드했다.

LoggingAdvice2.java도 4AOP에서 복사해온다. 마찬가지로 implement 를 뺐다.
그리고 어노테이션을 활용해서 Pointcut, Around를 쓴다. around와 차이를 보기위해 before, after, afterreturning,afterthrowing, around를 사용해보았다.
LoggingAdvice2.java에서는 @Pointcut("execution(* sub*(..))")라고 해서 sub로 시작하는 모든 매서드에 대해 매개변수 숫자 관계없이 보조기능이 작동하도록 코드했다.

AOPTest.xml을 그대로 복사해서 AOPTest2.xml을 만들고 Namespace에 가서 aop를 체크해주었다.

그다음 Xml에서 바로 AOP를 사용하기 위해서 pom.xml로 가서 aspectj를 추가해주었다.
mvnrepository.com/search?q=aspectj

다시 AOPTest2.xml로 돌아가서 아래와 같이 작성한다.

그리고 CalcTest에서 위처럼 Test한다.

Run 해보면 console창에 다음과 같이 나오는 것을 확인할 수 있다.

LoggingAdvice.java에서는 @Pointcut("execution(* add(int))")가 Calculator Class가 아닌 다른 Class에서도 보조기능이 작동하는지 확인하기 위해 Coffee Class를 만들었다.

CalTest.java에서 테스트를 해보면 아래 사진처럼 잘 되는 것을 확인할 수 있다.

-------------------------------------------------------------------------------------------------------------------------------
자 이제 maven이나 java를 활용해서 Spring을 사용하는 것이 아니라 프로젝트를 만들때부터 Spring을 활용해서 만들어 보도록하자. Spring을 사용해서 webproject를 만들것이다. 그 전에 아래 그림을 조금 이해하고 넘어가도록 하자.
이전까지는 Servlet을 모두 일일이 만들고 jsp를 만들었지만 이제 Spring이 대신 Servlet을 관리하며 모든 요청을 DispatcherServlet에서 받아오고 Controller로 넘겨줄것이다. 즉 사용자는 Controller와 Views만 손대면 된다.
지금부터 시작해보도록 하자..

마우스 오른쪽 버튼 > New > Project > Spring > Spring Legacy Project >Spring MVC Project


base가 되는 package를 만든다. 우리는com.kosta.springmvcproject라고 입력하니 오른쪽 처럼 만들어졌다.


이렇게 만들어지면 다운로드가 된다. 오른쪽 아래에 다운로드 중인것을 확인할수있다.
다운로드가 다 되면 pom.xml로 간다. 처음에 설정이 제대로 안잡혀있어서 설정을 먼저 잡아주도록 한다.

java-version을 1.8로
org.springframework-version을 5.3.5로
org.aspectj-version을1.9.5로
설정해주었다.

그런데 1.8로 바꾸었음에도 바뀌지 않는다. xml아래를 뒤져보니 자바 1.6을 사용하고 있는곳이 있었다. 그래서 아래도 1.8로 바꿔주면 java 버전이 바뀐다.

그리고 Oracle사용을 위해 아래 repositories도 추가해주자.

그리고 아래에 dependency를 추가해준다. spring-jdbc, aspectweaver, aspectjrt,aspecttools,oracle도 추가해준다.

이렇게 xml설정이 끝난다.
SpringProject를 만들면서 생긴 파일들을 살펴보면 먼저 Homecontroller가 자동으로 생겼다.
home메서드를 살펴보면 마지막에 return "home"이 있는데 여기서 home은 home.jsp를 말한다.

아래는 자동으로 만들어준 home.jsp이다.
참고로 수업시간에는 css, html, jsp 등 모두 UTF-8로 바꿔주었다. 참고하도록 하자.

web.xml파일을 살펴보면 모든 요청이 DispatcherServlet으로 들어가게 되어있고 응답도 DispatcherServlet에서 하게 되어있다. 앞에서 살펴본 다이어그램을 다시 한번 보고 오면 좋다.

그리고 url-pattern을 바꿔준다. *do라고 바꾸어주어 *do로 요청이 들어온 것에 대해서 모두 DispatcherServlet이 처리하도록 하겠다.

다음으로 기본으로 만들어준 servlet-context.xml을 살펴보겠다.
먼저 나중의 편의를 위해서 아래와 같이 바꿔준다. beans:beans에서 beans:을 지운다. 가장 위에 xmlns를 xmlns:mvc로 바꾸어준다.

바꾸어준 결과는 아래와 같다.

그리고 아래 사진을 보면 annotation-driven에서 @controller를 읽는다.

수업시간에 접두사 접미사를 아래 사진에 보이는 곳에 적는다고 하셨는데 어떻게 활용해야할지는 모르겠다.
아래 사진 내용은 기본으로 들어있던 내용이다. 따로 수정해주지 않았다.

그리고 context:component-scan을 써서 scan할 package를 적어준다.

oracledb정보 properties파일을 src>main>resources에 넣는다.

[Spring] 외부 설정 프로퍼티
외부 설정 프로퍼티 1. 외부 설정 프로퍼티 PropertyPlaceholderConfigurer 클래스를 빈으로 등록하면 외부의 프로퍼티에 저장된 정보를 스프링 설정 파일에서 사용할 수 있다. 예를 들어, 다음과 같은 프
devbox.tistory.com
servlet-context.xml에 DB관련된 것을 추가할때 PropertyPlaceholderConfigurer라는 Class를 Bean에 등록했다. 이 클래스에 대해서는 위 블로그를 참고하도록 한다.
블로그의 내용을 조금 인용하자면,
PropertyPlaceholderConfigurer 클래스를 빈으로 등록하면 외부의 프로퍼티에 저장된 정보를 스프링 설정 파일에서 사용할 수 있다. 프로퍼티 파일에 포함된 프로퍼티의 값은 ${프로퍼티의 이름}' 형식으로 사용할 수 있다. 즉, 위 코드에서 ${jdbc.driver}는 프로퍼티 파일의 jdbc.driver 프로퍼티의 값으로 대체된다.
출처: https://devbox.tistory.com/entry/Spring-외부-설정-프로퍼티 [장인개발자를 꿈꾸는 :: 기록하는 공간]
라고한다.

자 이제 DB연결을 테스트해 볼 시간이다. 이전 프로젝트에서 DAO와 VO를 가져왔다.

먼저 EmpDAO를 수정해주도록 하자.

EmpDAO에서 conn을 아래처럼 연결한다. 더이상 DButil을 사용하지 않는다.

그리고 controller는 아래와 같이 만들어 주었다. 사진 안에 모두 내용을 표시해두었다.




그리고 emplist.jsp를 살펴보면 위에 controller.java에서 addAttribute해준 "emplist"를 가져다가 view로 표시한다.

자 그럼 이제부터 url에 실행해보도록 하겠다. 실제 실행하기 전에 흐름을 그림으로 간단히 정리해보도록 하겠다.
임시로 그려놓은 흐름도이므로 강사님에게 확인받은후 수정하도록 하겠다.

이렇게 실행을 해보면 아래와 같이 결과가 잘 나오는 것을 확인할 수있다.

수업끝~
'KOSTA' 카테고리의 다른 글
| 2021-05-13(목) kosta - 스프링수업 6일차(LOGGER,TRANSATION,RESTFUL) (0) | 2021.05.15 |
|---|---|
| 2021-05-12(수) kosta - 스프링수업 5일차(Restcontroller, input에 비어있는 값줄대도 쿼리문 되도록하기,동적sql) (0) | 2021.05.15 |
| 2021-05-11(화) kosta - 스프링수업 4일차(MYBATIS) (0) | 2021.05.12 |
| 2021-05-10(월) kosta - 스프링수업 3일차(@여러 어노테이션) (0) | 2021.05.10 |
| 2021-05-06(목) kosta - 스프링수업 1일차 (0) | 2021.05.06 |