Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

[Ace-T의 Spring강좌] Step 04. Spring @MVC 분석-01

OpenSource/Spring 강좌 2014.02.05 01:32
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

[Ace-T의 Spring강좌]

   Step 04. Spring @MVC 만들기>>


<< 목표 환경 >>

1) Eclipse(done)

2) PostgreSQL

3) Apache Tomcat or JBoss

4) JUnit(done)

5) SpringFramework(done)

6) JDK 6.0(done)

 


2013/11/03 - [OpenSource/Spring 강좌] - [Ace-T의 Spring강좌] Step 01. Spring 환경 구축 하기(Eclipse+Jdk)


2013/11/05 - [OpenSource/Spring 강좌] - [Ace-T의 Spring강좌] Step 02. Spring 환경 구축 하기(Maven+Spring Project)


2013/12/04 - [OpenSource/Spring 강좌] - [Ace-T의 Spring강좌] Step 03. Spring 환경 구축 하기(was)


 Step 03. Spring 환경 구축 하기(was)에서 환경을 구축해보았습니다.

이제는 mvc에 대해서 알아보도록 하겠습니다^^

우선 spring에서 자동으로 만들어준 소스를 가지고 상태여야 한다.(step 3 을 참고!!)

그 소스에 대해서 조금 간단히 살펴 보겠습니다~

이 글에서는 일명 @MVC를 토대로 합니다.(즉, 어노테이션 기반 MVC이죵!) 

그리고 오늘 학습을 해야 할것은 HomeController.java의 내용에 있는 어노테이션들 입니다.

@RequestMapping, @Controller

 

HomeController.java      

package kr.pe.acet;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
 
 private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
 
 /**
  * Simply selects the home view to render by returning its name.
  */
 @RequestMapping(value = "/", method = RequestMethod.GET)
 public String home(Locale locale, Model model) {
  logger.info("Welcome home! The client locale is {}.", locale);
  
  Date date = new Date();
  DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
  
  String formattedDate = dateFormat.format(date);
  
  model.addAttribute("serverTime", formattedDate );
  
  return "home";
 }
 
}

 

하지만 우선~~~!! Controller의 메소드 파라미터를 보도록 하겠지만...

아래의 Controller의 메소드 파라미터 블라블라를 보기전에 아래의 MVC의 주요 구성요소와 MVC패턴에 

대해서먼저 학습하면 좋을 것 같습니다.

2012/11/09 - [OpenSource/Spring MVC] - Spring MVC의 주요 구성요소


이제 아래를 학습하여 보자!

 @Controller 의 메소드 파라미터로 올 수 있는 것들!(참고 : 토비님 책3.1v 볼률2, 486p~)

 파라미터(Parameter)

 간단 설명(simple contents)

 HttpServletRequest,

 HttpServletResponse

 서블릿 관련~

 HttpSession

 서블릿 관련~

 WebRequest,

NativeWebRequest

 HttpServletRequest의 요청정보를 대부분 그대로 갖고 있는, 서블릿 API에

 종속적이지 않은 오브젝트 타입이다.(서블릿과 포틀릿 환경 양쪽에 모두 적용

 가능한 범용적인 핸들러 인터셉터를 만들 때 활용하기 위해 만들어졌다.

Locale

 java.util.Locale 타입으로 DispatcherServlet의 지역정보 리졸버(Locale

 Resolver)가 결정한 Locale 오브젝트를 받을 수 있다.

 Locale은 예를들어 ko_KR, jp_JP(?) 암튼 한국어, 일본어, 영어 등등 이라고

 보면  된다.

InputStream, Reader

 HttpServletRequest의 getInputStream()을 통해서 받을 수 있는 콘텐트 스트림

 또는 Reader 타입 오브젝트를 제공 받을 수 있다.

OutputStream, Writer

 HttpServletRequest의 getIOutputStream()을 통해서 받을 수 있는 콘텐트 스트림

 또는 Writer 타입 오브젝트를 제공 받을 수 있다.

@PathVariable

 @RequestMapping의 URL에 {}로 들어가는 패스 변수(path variable)를 받는다.

 http://acet.pe.kr/post/?id=10 이라고 하는걸 http://acet.pe.kr/post/10 으로

 만들 수 있다.

 ex) @RequestMapping("/post/{id}")

      public String view(@PathVariable

@RequestParam

 public String view(@RequestParam("id") int id){....}

@CookieValue

 HTTP요청과 함께 전달된 쿠키 값을 메소드 파라미터에 넣어주도록

 @CookieValue를 사용 할 수 있다.

@RequestHeader

 요청 헤더정보를 메소드 파라미터에 넣어주는 어노테이션이다. 

 헤더정보에 있는 Server정보, Content-Type등의 정보를 이용하여 어디에서 접근

 하는지 알아내서 view를 다르게 해준다던지 하는 것들을 구현 할 수 가 있다. 

Map, Model, ModelMap

 다른 어노테이션이 붙어있지 않다면

 @ModelAttribute

 요청 파라미터를 메소드 파라미터에서 1:1로 받으면 @RequestParam이고,

 도메인 오브젝트나 DTO, VO의 프로퍼티에 요청 파라미터를 바인딩해서 한번에 받으면 @ModelAttribute라고 볼 수 있다.

 ex) @RequestMapping("/acet/search")

         public String search(@ModelAttribute UserSearch  userSearch){

            List<User> list = userService.search(userSearch);

            model.addAttribute("userList", list);

              ..................

        }

Errors, BindingResult 

 변환작업 시 오류가 있을 때 @ModelAttribute를 사용 했을 때는 @RequestParam과는 달리 HTTP 400 이 발생하지 않고 작업은 계속 진행 되어지며, 단지 타입 변환 중에 발생한 예외가 BindException 타입의 오브젝트에 담겨서 컨트롤러로 전달 된다. 즉, 예외처리에 대한 기회를 주어야 하므로

 org.springframework.validation.Errors or org.springframework.validation.

BindingResult 타입의 파라미터를 같이 사용 한다.

 ex) @RequestMapping(value="add", method=RequestMethod.POST)

      public String add(@ModelAttribute User user, BindingResult bindingResult)      { ................... }

 BindingResult 대신 Errors를 사용해도 되며, 사용시 주의 사항으로는 반드시

 @ModelAttribute 뒤에 나와야 한다.@ModelAttribute 검증작업에서 나온 오류만을

 전달하기 때문이다. 

 SessionStatus

 컨트롤러가 제공하는 기능 중에 모델 오브젝트를 세션에 저장했다가 다음 페이지

 에서 다시 활용하게 해주는 기능이 있다. 

 org.springframework.web.bind.support.SessionStatus 오브젝트이며,

 필요없어지면 확실하게 제거해줘야 한다.

 @RequestBody

 Http 요청의 본문(body) 부분이 그대로 전달 된다.

 일반적인 GET/POST의 요청 파라미터라면 사용 할 일이 없다. 

 XML이나 JSON 기반의 메시지를 사용하는 경우에는 이 방법이 매우 유용하다.

 또한 메시지컨버터가 필요하다! ㅎㅎ 

 @Value

 SpEL을 이용해 클래스의 상수를 읽어오거나 특정 메소드를 호출한 결과 값, 조건식 등을 넣을 수 있다.

 ex) @RequestMapping(...)

 public String hello(@Value("#{systemProperties['os.name']}") String osName){...} 필드 주입이라는 것도 있다.

 @Valid

 @Valid는 JSR-303의 빈 검증기를 이용해서 모델 오브젝트를 검증하도록 지시하는지시자다. 

서버 Valid는 토비 책 뒤편에 보면 나오며, @Validate도 있다!~

 

많은 것들이 있네요..하하;

하지만 우리의 소스에서는 아래와 같이 Locale과 Map, Model, ModelMap 중 Model이 쓰였습니다. ㅋㅋ

  public String home(Locale locale, Model model) {


Controller 소스는 매우 간단합니다.  시간을 구해서 해당 View에다가 줘서 찍어주는게 끝이네요^^;

   model.addAttribute("serverTime", formattedDate );  

  return "home";


※ Model Interface (http://docs.spring.io/spring/docs/3.2.x/javadoc-api/ 참조 하시면 됩니다.)

org.springframework.ui

  Interface Model

Model addAttribute(String name, Object value)

value 객체를 name 이름으로 추가 

Model addAttribute(Object value)

value를 추가. value의 패키지 이름을 제외한 단순 클래스 이름을 모델 이름으로 사용(첫 글자는 소문자). value가 배열이거나 콜렉션인 경우 첫 번째 원소의 클래스 이름 뒤에 "List"를 붙인 걸 모델 이름으로 사용(첫 글자는 소문자)

Model addAllAttributes(Collection<?> values)

addAttribute(Object value) 메소드를 이용해서 콜렌션에 포함된 객체들을 차례대로 추가

Model addAllAttributes(Map<String, ?>, attributes)

Map에 포함된 <키, 값>에 대해 키를 모델 이름으로 사용해서 값을 모델로 추가

Model mergeAttributes(Map<String, ?>, attributes>

Map에 포함된 <키, 값>을 현재 모델에 추가. 단 키와 동일한 이름을 갖는 모델 객체가 존재하지 않는 경우에만 추가

boolean containsAttributes(String name)

지정한 이름의 모델 객체를 포함하고 있는 경우 true 리턴


     위의 model에서 시간을 serverTime에다가 넣어주면 그 model은 home.jsp에 전달이 되어진다.

     즉, View단, home.jsp(src/main/webapp/WEB-INF/views/home.jsp)를 보면 아래와 같습니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

<h1>

Hello world!  

</h1>


<P>  The time on the server is ${serverTime}. </P>

</body>

</html>



     << 결과 >>     


아래의 주소(http://localhost:8080/)대로 치면 아래처럼 결과가 나오지 않는다. 그 이유는 Step 03 강좌에서도 설명 하였듯이 Context root 가 다른걸로 잡혀있기 때문이다.

그러므로 tomcat의 context root를 / 로 수정을 해주면 된다.

자세한 설명은  

2013/12/04 - [OpenSource/Spring 강좌] - [Ace-T의 Spring강좌] Step 03. Spring 환경 구축 하기(was)


또는 아래의 동영상을 참고 하길 바랍니다^^;; - (단, STS 기반 입니다~!)

(동영상이 구리긴하네요...720 고화질로 보셔야 합니다~~)



쫘잔~~아래의 결과가 나오시나요?? ㅎㅎㅎ

[Locale이 잘 안맞는지...깨져서 나온다 ㅋㅋ; 일단 PASS~~~]


 Model addAttribute(String name, Object value)로 인해서 시간이 name에 binding 되어지고, ${serverTime}으로 찍혀지게 된다.  스트럿츠나 jsp로 코드를 짜던 시절에서는 request로 view단에 넘겨주고는 하였다.

위의 내용을 정확히 알기 위해서는 Spring MVC 패턴, WEB.xml(was꺼 아니죠~) 을 알아야 한다.

다시 한번~링크!!

2012/11/09 - [OpenSource/Spring MVC] - Spring MVC의 주요 구성요소 

2012/11/09 - [OpenSource/Spring MVC] - 웹??? web.xml은 알고 하자!!


Web 브라우저에서 URL 들어오면, WEB.xml에 설정 해 놓은 DispatcherServlet에 전달 되어지고, 

url-mapping에 의해 mapping되어진 Controller를 찾고 해당하는 method부터 시작이 되어진다! 두둥~


옛날 jsp 시절에는 view단에서  <%= request.getParameter("name") %>를 썼었다. ㅋㅋ;




 음...조금 더 디테일하게 써보려고 했는데....새벽 1시간 넘었네요..ㅠ.ㅠ..

 독감이 걸린 상태라..쿨럭 쿨럭~ 이번 강좌는 여기까지 써야겠네요..하하;

 조금이나마 도움이 되셨으면 좋겠네요^-^

 건강이 제일 큰 재산 입니다. 건강하세요~~~~


5번째 강좌에서는 조금 더 자세하게 Spring MVC에 대해서 학습 하도록 하겠습니다^-^

언젠가는...Mybatis도 연동하는 날이 오겄져 뭐~ㅋㅋㅋㅋ


     - to be continue... by Ace-T -

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[Ace-T의 Spring강좌] Step 02. Spring 환경 구축 하기(Maven+Spring Project)

OpenSource/Spring 강좌 2013.11.05 01:17
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

2013/11/03 - [OpenSource/Spring] - Step 01. Spring 환경 구축 하기

 

[Ace-T의 Spring강좌]

 Step 02. Spring 환경 구축 하기(Maven+Spring Project)>>


<< 목표 환경 >>

1) Eclipse

2) PostgreSQL

3) Apache Tomcat or JBoss

4) JUnit

5) SpringFramework

6) JDK 6.0

 

springframework와 junit을 위해 maven project로 할 생각이다.

 

그래서 우선적으로 maven을 다운 받고 이클립스에는 maven plug-in을 설치하여 연동 시키자^-^

 

[01] maven download 하기

http://maven.apache.org/download.cgi

 

 

  maven을 다운을 받고(소스가 아닌 apache-maven-3.1.1-bin.zip 을 다운 받았다.

  글쓴이의 같은 경우 build라는 폴더에 넣어두었다.

 

 

 build dir 밑에 다가 저장!!~

maven은 괜히 받은 것이 아니다~maven > conf에 보면 아주 매우 중요한 settigs.xml 이라는 녀석이 있다.

이클립스와 연동을 해줄 녀석이다. settings.xml을 가지고 Repository를 설정 해줄 수 있다. 

(maven에서 중요 파일은 pom.xml과 settings.xml을 꼽을 수 있다.)

 

 

[2] 이클립스와 maven 연결하기

  우선적으로 Eclipse Marketplace에서 maven plug-In을 다운받자.

  (Eclipse Marketplace는 Help 메뉴 > Eclipse Marketplace..)

 

maven으로 Find 해보자. (케플러 버전이 있다면 그것으로 하자! 중요한건 maven 플러그인이 필요하다느것!

 

 아래의 그림처럼 클릭X2 을 해주면 된다.

 

동의하기~

 

설치가 다되었다면, Eclipse Winodw > Preferences 에서 Maven이 있는지 확인 하자.

있다면 Maven >  User setting을 클릭하면 아래와 같이 나올 것이다. 

 

 우리는 User Settings를 디폴트로 쓰지 않는다. 포터블로 하기 위해 설치된 Maven > conf 에서 settings.xml을 선택하자.

 

그리고나서 settings.xml에서 local repository부분을 수정하여 주자.

 

아래의 그림처럼 주석으로 되어있는 것을 풀고 우리가 임의로 경로를 설정을 할 것 이다. 

 

우선 repository라는 폴더를 하나 생성하자.

아래와 같이 경로를 셋팅하고 저장하자.

 

 

그리고 나서 다시 Maven > User setting 을 가보면 우리가 정해준 path대로 설정이 되어있는 것을 볼 수 있다. 

 

자~~이제 Maven이라는 천군만마를 얻었다!!

 

[3] project 생성

   필자의 삽질..ㅋㅋㅋㅋ 그냥 참고만 하세요..ㅠ.ㅠ...

뻘짓..ㅠㅠ

  

위처럼 노가다를 하지 않겠다. 왜냐면 빨리 개발 환경을 셋팅하는것도 필요하니깐!! 중요한건 환경보다 개발이니깐^^;

       

우리는 매우 간단한 Spring Template Project 를 사용 할 것이다. 하지만 STS 플러그인을 셋팅 한뒤에 나오는 Template Project는 이제 없다!!!....ㅠ.ㅠ..계속 찾았는데-_- ....he's gone....goodbye my bro..kkk

하지만 알고봤더니 사라진게 아니였다.

 

자~이제 초 간단 mvc 프로젝트를 만들어보자.

우선 선작업으로 STS plug-in을 셋팅 해줘야 한다.

 

1) Eclipse plug-in setting 키워드는 spring으로 치면 된다. Spring Template Project를 찾느라..아래처럼 검색 키워드를 넣은 것이다 ㅋㅋ;;

 

2) 필요한것만 체크해서 해도 되고 그냥 다 체크해서 인스톨 시키면 된다.

 

플러그인이 인스톨 된 뒤 이클립스가 재가동 되어진다.

재가동 되어진 후에 프로젝트를 하나 만들어보자.

 

3) File > New > Other를 선택 후 아래와 같이 spring project를 하나 생성해보자.

4) Spring Project 를 생성 시 아래를 보면..Spring MVC Projcet가 있다..ㅠ.ㅠ..

 

 

5) 패키지를 정해준다. ㅎㅎㅎ

 

6) 아래처럼 web.xml과 pom.xml , java, test 폴더로 구분! 더욱이 log4j.xml까지..ㅠ.ㅠ..대박!!!

   

이제 기본적인 뼈대가 생성 되었다..이제 개발만이 남았다~~~~~~+ㅁ+/

다음 시간에는 web project를 구성하였으니! was 연동을 해보겠습니다^^ 차근차근!

 

    - to be continue to the next Step..^^.. -


2013/12/04 - [OpenSource/Spring 강좌] - Step 03. Spring 환경 구축 하기(was)


 

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • mezzo 2014.01.29 18:07 신고 답글 | 수정/삭제 | ADDR

    안녕하세요 스프링 공부하는중 이런저런 좋은 정보가 있어서 참고하게됬는대요..
    다름이 아니라 말씀하신대로 설치 다하고 기본 스프링 프로젝트 생성하니 에러가뜨는대.. 왜그런걸까요..

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2014.01.29 19:58 신고 수정/삭제

      안녕하세요^^ 방문&댓글 감사합니다~(-- (__ 꾸벅~새해 복 많이 받으세요^^

      우선은 궁금한 점이..
      [3] project 생성
      필자의 삽질..ㅋㅋㅋㅋ 그냥 참고만 하세요..ㅠ.ㅠ...
      라는 부분도 따라서 하신건가요?

      아니면 STS plug-in을 셋팅 한 뒤에 Spring project를 생성 하신 건가요?

      음..어떤 에러가 나는지 조금 자세하게 말씀해주실 수 있으세요?

  • mezzo 2014.01.30 09:28 신고 답글 | 수정/삭제 | ADDR

    뎃글 감사합니다.. 우선 필자의 삽질은 따라하지는 않았구요..
    STS plug-in을 셋팅 한 뒤에 Spring project를 생성했습니다
    잘따라한거같은대..
    Spring project를 생성하면 servlet-context.xml와 root-context.xml에 에러가 생깁니다. 직접 열어보면
    에러부분이 없는대도 말이조.. ㅠㅠ

  • mezzo 2014.01.30 10:22 신고 답글 | 수정/삭제 | ADDR

    죄송합니다 해결했내요.. 어떤게 문제였는지는 모르겠지만 이것 저것 검색하다가
    repository폴더를 비우고 다시 하니 잘 생성 되내요 감사합니다.

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2014.03.22 16:51 신고 수정/삭제

      ^^; 좋은 경험 하셨네요! 해결 하신 방법을 보니 maven plug-in 관련해서 오류 인것 같아요^^ pom.xml 쪽에 보시면 오류가 떴을꺼라 예상이 드네요 pom.xml 에 설정하신 대로 repository에 jar들이 끌어오는데 간혹 깨지거나 잘 못끌어오는 경우가 종종 있어요 그럴때 오류가 발생을 하구요 해결하신것 처럼 repository에 것을 모두 지우시고 다시 받으시면 됩니다~ 혹은 maven install로 할 수 도있습니다^^

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

2PC, JTA 사용 시 데이터소스가 하나만 먹히는 문제

OpenSource/Spring MVC 2013.05.27 02:08
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 [그리운 만슈니..ㅠㅠ]

 

아래의 설명은 위의 사진과는 무관합니다! ^-^

 

2PC, JTA 사용 시 데이터소스가 하나만 먹히는 문제

 

환경

was : jboss eap 5.1 - xa datasource 설정

springframework 3.1 - jta manager 사용

@MVC 기반 => Facade - Service - Dao - Mybatis

postgreSQL 9.2(local- windows ver)

postgreSQL 9.2(remote - windows ver)

mybatis 3.1.1

 

 


 

TEST

Facade(POJO) - Service(POJO) - Dao - Mybatis 이나

Facade - FacadeImpl - Service - Dao - Mybatis 구조로 테스트 함.

 

[Facade - FacadeImpl - Service - Dao - Mybatis 구조]

1) JDK 다이나믹 프록시 사용 & Class프록시 사용

결과 : FacadeImpl 즉, 구현클래스에 @Transactional 사용(롤백, Required_NEW 등 2PC 트랜잭션 잘됌)

      그러나 Class 프록시로 전환 뒤 Service에 @Transactional 해보았지만 트랜잭션 먹히지 않음.

      커뮤니티에 문의 한 결과..정확하게 말해주는 사람은 없었음. 그러나 순수 class까지도 되어야 한다고 함.

 

[Facade(POJO) - Service(POJO) - Dao - Mybatis구조]

2) Class 프록시 사용

결과 : JTA를 사용하였지만 데이터소스 하나만 잘됨. 2PC일 때 다른 데이터소스는 트랜잭션이 먹히지 않음. 단일 트랜잭션임에도 불구하고..

 

 


 

추측

1. PostgreSQL AutoCommit 문제

  

2013/05/25 - [DataBase/Postgresql] - windows postgreSQL autocommit off 만들기

 

2.XA Datasource는 조금 다른지..

http://forum.springsource.org/showthread.php?100710-JTA-on-JBoss-not-working&s=e077b42fd45ae3a3177a01c90339893c 참고

 

 


 

주저리

 

아..스프링 시큐리티도 해야하는데..완전 손놓고 있네..이노무 Global Transaction.....@.@;;

해결 되면 업데이트 하겠음!!~

 

 

 https://community.jboss.org/message/747830#747830

 

 


 

해결!!~

Mybatis에서 map 중복이 있어서 해당 datasource를 잘 찾지 못하거나 다른 db에 들어가는 현상이 있었다!!


라고 해결 한줄 알았으나!!  그게 아니였다!!

한 클래스내에서 메소드별로 @Transactional이라는 것으로 전파속성을 달리해서 사용한다면 예를 들어서 한 클래스내에 A라는 메소드에서B라는 메소드를 호출 시에 B에서 전파속성을 Reqired_new를 사용 할 경우에 트랜잭션이 타지 않는 현상이 있습니다.
이를 해결해주기 위해서는 메소드를 클래스로 하나 빼서 처리를 하면 됩니다. 이와 비슷한 경우는 @Asyne라는 어노테이션에서도 발생을 합니다.

 

- 끝 -

 

 

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[다섯번째] Spring 사내 스터디

Study/Study group 2012.12.03 13:58
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

참고 URL :

2012/10/23 - [Study/Study group] - [첫번째] Spring 사내 스터디

2012/10/31 - [Study/Study group] - [두번째] Spring 사내 스터디

2012/11/12 - [Study/Study group] - [세번째] Spring 사내 스터디

2012/11/26 - [Study/Study group] - [네번째] Spring 사내 스터디



 



- 스터디 범위
  용수철 1기
  토비 vol 2, 1장

  용수철 2기
  토비 vol1. 1장


Review

1장. IoC 컨테이너와 DI

스프링 애플리케이션은 오브젝트의 생성과 관계설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신
독립된 컨테이나거 담당한다. 이를 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서
IoC라고 부른다. 그래서 스프링 컨테이너를 IoC컨테이너라고도 한다.

Think :

더보기





또한, 스프링에선 IoC를 담당하는 컨테이너를 빈 팩토리 또는 애플리케이션 컨텍스트라고 부르기도 한다.
"BeanFactory와 ApplicationContext는 각각 인터페이스로 정의 되어있다."
그래서 실제로 스프링 컨테이너 또는 IoC컨테이너라고 말하는 것은 바로 이 ApplicationContext 인터페이스를 구현한 클래스의 오브젝트이다.

ex) StaticApplicationContext ac = new StaticApplicationContext();
위의 코드는 IoC 컨테이너가 만들어진 것인가??     

더보기


IoC가 동작하려면?

더보기


스프링의 설정 메타정보는 XML이 아니다.
스프링의 설정 메타정보는 BeanDefinition 인터페이스로 표현되는 순수한 추상 정보이다.
스프링의 메타정보는 특정한 파일 포맷이나 형식에 제한되거나 종속되지 않는다.
대신 XML 이든 소스코드 애노테이션이든 자바코드이든 프로퍼티 파일이든 상관 없이 BeanDefinition으로
정의되는 스프링의 설정 메타정보의 내용을 표현한 것이 있다면 무엇이든 사용 가능 하다.
단, 원본의 포맷과 구조, 자료의 특성에 맞게 읽어와 BeanDefinition 오브젝트로 변환해주는 BeanDefinitionReader 가 있으면 된다. BeanDefinitionReader도 인터페이스이다.^-^good~

[그림1] IoC 컨테이너를 통해 애플리케이션이 만들어지는 방식


일반적으로 설정 메타정보는 XML파일이나 애노테이션 같은 외부 리소스를 전용리더가 읽어서 BeanDefinition 메타정보를 생설 할 수 있다.

위의 그림에서 메타정보 리소스(XML, 애노테이션, 자바코드) 이다. 아래의 그림2를 다시 보도록 하자.

[그림2] 컨테이너가 활용하는 빈 설정 메타정보



IoC 컨테이너 계층구조
 - 부모, 자식(계층 구조)
 - 빈 검색 시 1) 자기자신 2) 부모 애플리케이션의 빈까지 모두 검색
    단, 자식 컨텍스트에게는 요청하지 않음.(검색 X)

[그림3] 스프링 웹애플리케이션의 다양한 구성 방법


역시나 계층구조로 되어있다. 왜 이렇게 계층구조로 만들까?

더보기




Mr. Gong> servlet 2.5
 









저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[네번째] Spring 사내 스터디

Study/Study group 2012.11.26 19:00
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
스터디 인원 대거 합류..!!
1~2장 : 백, 박, 석, 김, 강
6~7장 : 공, 박, 권, 김, 차(결석)

2012/10/23 - [Study/Study group] - [첫번째] Spring 사내 스터디

2012/10/31 - [Study/Study group] - [두번째] Spring 사내 스터디

2012/11/12 - [Study/Study group] - [세번째] Spring 사내 스터디


[스프링 스터디 4번째]

토비 vol 1, 6~7장 (분량 대략 300페이지)

1) AOP - IoC/DI / 서비스추상화와 더불어 스프링의 3대 기반 기술 중 하나 이다.

2) 목 프레임워크 : 그중에서도 Mockito라는 프레임워크는 사용하기도 편리하고, 코드도 직관적이라
                        최근 많은 인기를 얻고 있음.
3) 트랜젝션
    - 핵심기능, 부가기능 : 부가기능과 핵심기능의 분리 => 프록시

4) 프록시 : 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을
              받아주는 것을 대리자, 대리인과 같은 역할을 한다고 해서 프록시(proxy)라고 부른다.
최종적으로 요청을 위임받아 처리하는 실제 오브젝트를 타깃(target) 또는 실체(subject) 라고 부른다.

ex) 프록시 생성
Hello proxiedHello = (Hello)Proxy.newProxyInstance(
    getClass().getClassLoader(),
     -> 동적으로 생성되는 다이내믹 프록시 클래스의 로딩에 사용할 클래스 로더

    new Class[] {Hello.class}, <- 구현할 인터페이스
    new UppercaseHandler(new HelloTarget()))); -> 부가기능과 위임코드를 담은 핸들러

토비 1 - 431p
     클라이언트  ------------->        프록시  ------------->       타깃 


"데코레이터 패턴" : 인터페이스를 통해 위임, 프록시를 사용
"프록시 패턴" : 클라이언트에게 타깃에 대한 레퍼런스를 넘겨야하는데, 실제 타깃 오브젝트는 만드는
                 대신 프록시를 넘겨주는 것이다. 프록시의 메소드를 통해 타깃을 사용하려고 시도하면,
                 그때 프록시가 타깃 오브젝트를 생성하고 요청을 위임해주는 식이다.



interface에 선언된 메소드들을 쓰지도 않는 것들은 구현 할 필요가 없다.




"다이내믹 프록시" : 타깃의 인터페이스와 같은 타입으로 만들어진다.
                         + 리플렉션 방식(Java.lang.reflect)
 - 프록시 기능 : 타깃과 같은 메소드를 구현하고 있다가 메소드가 호출되면 타깃 오브젝트로 위임한다.
                 지정된 요청에 대해서는 부가기능을 수행 한다.
 - 리플렉션 : 자바의 코드 자체를 추상화해서 접근하도록 만든 것이다.
    ex) String의 length() 메소드라고 하면
        1)  Method lengthMethod = String.class.getMethod("length");
        2) invoke() : 메소드를 실행시킬 대상 오브젝트와 파라미터 목록을 받아서 메소드를
                         호출한 뒤에 그 결과를 Object  타입으로 돌려준다.




 - 어드바이스(Advice) : 타깃 오브젝트에 적용하는 부가기능을 담은 오브젝트
 - 포인트 컷(PointCut) : 부가기능 적용 대상 메소드 선정 방법

      <1> 프록시는 클라이언트로부터 요청을 받으면 먼저 포인트컷에게 부가기능을 부여할 메소드를
            확인 해달라고 요청한다.
      <2>확인 받은 뒤 어드바이스를 호출 한다.
 -  어드바이저 : 여러개의 어드바이스와 포인터컷이 추가 될 수 있기 때문에 따로 등록 시
                     어떤 어드바이스(부가기능)에 대해 어떤 포인트컷(메소드 선정)을 적용 할지
                     애매해진다.
                     그래서 어드바이스와 포인트컷을 묶은 오브젝트를 어드바이저라고 부른다.
                     어드바이저 = 포인트컷(메소드 선정 알고리즘)+어드바이스(부가기능)



"빈 후처리기" : 자동프록시 생성
 1) DefaultAdvisorAutoProxyCreator 빈 후처리기가 등록 되어있으면
 2) 스프링은 빈 오브젝트를 만들 때마다 후처리기에게 빈을 보낸다.
 3) DefaultAdvisorAutoProxyCreator는 빈으로 등록된 모든 어드바이저 내의 포인트컷을 이용해
     전달 받은 빈이 프록시 적용 대상인지 확인 한다.
 4) 프록시 적용 대상이면 내장된 프록시 생성기에게 현재 빈에 대한 프록시를 만들게 하고, 만들어진
     프록시에 어드바이저를 연결
해준다.
 5) 빈 후처리기는프록시가 생성되면 원래 컨테이너가 전달해준 빈 오브젝트 대신
     프록시 오브젝트를 컨테이너에게 돌려준다.



"확장된 포인트컷" : 사실..한가지가 더 있었음..--;;
포인트컷은 클래스 필터와 메소드 매처 2가지를 돌려주는 메소드를 가지고 있다.
public interface Pointcut{
    ClassFilter getClassFilter();  -> 프록시를 적용할 클래스인지 확인
    MethodMatcher getMethodMatcher(); -> 어드바이스를 적용할 메소드인지 확인
}



"포인트컷 표현식(pointcut expression)"
복잡함, 세밀함 -> class, method 선정 ==> pointcut expression


AOP란? Aspect Oriented Programming(애스팩트 지향 프로그래밍)


위처럼 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 독특한 모듈로 만들어서 설계하고 개발하는 방법.
AOP는 OOP를 돕는 보조적인 기술이지 OOP를 대체하는 새로운 개념은 아님.

"AspectJ" : 프록시 처럼 간접적인 방법이 아닌 타깃 오브젝트를 뜯어고쳐서 부가기능을
                직접 넣어주는 직접적인 방법
                즉, 컴파일된 타깃의 클래스 파일 자체를 수정하거나 클래스가 JVM에 로딩되는 시점을
                가로채서 바이트코드를 조작하는 방법   

512p~555p 

 - 끝 -

AOP : cross cutting concern
1) 로그
2) 에러처리,
3) 트랜젝션 처리
 - select (read only)
    insert*
    update*
    delete
    (CUD)
정책에 따라 사전에 해줘야 함.
AOP 적용 시 명명규칙이 중요 함. 레벨(Service, Fasade Layer)결정- 최상위 레벨을 확인
서비스 단위는 업무적으로 각기 다르다. 또는 서로 연관이 있을 수 도 있다.

트랜젝션 전파
 - 특정 메소드 제외

Q) 각각의 서비스도 class 프록시로 구분이 가능 할 꺼 같음. - 상위가 있을 경우 한단계 UP
    구분 가능.






저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[첫번째] Spring 사내 스터디

Study/Study group 2012.10.23 00:45
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
2012.10.23(수) 첫 스프링 스터디!!

자! 스프링..처음 공부한다고 한다면..무엇을 해야하나?? 생각해보자! 단. 3초간..

음.....
움......
um......




고민을 끝냈다면! 실천해보자^-^ Right Now~!!

1. 스프링을 테스트 할 수 있는 환경을 만들자!^-^good~
2. 레퍼런스와 Api를 적극 참조 하자!(현재 레퍼런스 3.1을 외부 스터디(자바카페+KSUG)를 하고 있으니!
   스터디 범위에 맞게 공부해 나가자^-^/
3. 적극 테스트를 실전 환경에서 해보자!





자~~이제 신나고 재밌는 Spring이라는 녀석을 만나러 가보자^-^~~oh yeh~~^-^

제 1장. 스프링이란 무엇인가?
   간략히 말해 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

- 스프링을 MVC 프레임워크 또는 JDBC/ORM 지원 프레임워크라고 생각하는 것은 스프링이 다루는
  일부 영역만 봤기 때문이다.(이런!!!ㅠㅠ)

- 또, 스프링을 IoC/DI 프레임워크나 AOP 툴이라고 보는 이유는 스프링이 제공하는 핵심 기술에만
   주목 했기 때문이다.(OMG~~)

DI의 기본 아이디어는 유연하게 확장 가능한 오브젝트를 만드어두고 그 관계는 외부에서 다이나믹하게 설정 해준다는 것이다.


스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지를 정의 해놓은 설계정보로 구분 된다.

스프링의 주요기술인 IoC/DI, AOP와 PSA(Portable Service Abstraction는 애플리케이션을 POJO로 개발 할 수 있게 해주는 가능 기술이라고 불린다.

여기에서..POJO 포조 하는데 도데체 포조란 무엇이라는 말인가?????
막 퍼죠? (퍽..죄송합니다..@.,@;;)

POJO란 무엇인가??
POJO는 Plain Old Java Object이다!!
마틴 파울러가 2000년에 컨퍼런스 발표를 준비하다가 만들어낸 용어라고 한다.
단순한 자바오브젝트를 사용한다는 것이 아니라, POJO방식의 기술을 사용합니다~라고
하는 그럴싸하다.

POJO의 조건
평범하게 자바오브젝트라고 할 수 있지만
적어도 다은 세가지를 충족 해야 POJO라고 불릴 수 있다.
1. 특정 규약에 종속되지 않는다.
   : 규약 따위에 종속되지 않아야 하고, 객체 지향 설계의 자유로운 적용이 가능한 오브젝트여야만
     POJO라고 불릴 수 있다.
2. 특정 환경에 종속되지 않는다.
  : 환경에 독립적이여야 한다.

스프링에는 POJO 프로그래밍을 손쉽게 할 수 있도록 지원하는 세가지 가능 기술을 제공한다.
(IoC/DI, AOP, PSA)

참고 문헌 : 토비의 스프링3.1 8장 





저작자 표시 비영리 변경 금지
신고

'Study > Study group' 카테고리의 다른 글

[KSUG+Java cafe] 스프링 스터디  (0) 2012.11.10
[두번째] Spring 사내 스터디  (0) 2012.10.31
[첫번째] Spring 사내 스터디  (2) 2012.10.23
Google Developers Korea  (0) 2012.08.24
스터디 모임 소개^-^  (0) 2012.08.21
자바 마지막^^  (0) 2012.03.22

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • er1ca 2012.10.26 15:54 신고 답글 | 수정/삭제 | ADDR

    으헝 !!!!!!!!!!!!!!=ㅁ=............ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

스터디 모임 소개^-^

Study/Study group 2012.08.21 00:51
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

ㅎㅎㅎ 드디어 기다리고 기다렸던 스터디!! 개설!!

KSUG 그룹에 스터디를 하고 싶어서 가입을 했는데^-^good~
스터디가 여태 없다고 자바카페(조효은 강사님이 계신ㅎㅎ)과 연합하여 스터디를 한다고 한다.
한경닷컴하고는 인연이 있어서 더욱 더 자바카페와 한다고 하니 조으다^-^good~

url ) http://onoffmix.com/event/8686

간단 내용)



많은 참여 부탁해요~~선착순이니~~빠르게+ㅁ+ speeeeed~~~~

저작자 표시 비영리 변경 금지
신고

'Study > Study group' 카테고리의 다른 글

[KSUG+Java cafe] 스프링 스터디  (0) 2012.11.10
[두번째] Spring 사내 스터디  (0) 2012.10.31
[첫번째] Spring 사내 스터디  (2) 2012.10.23
Google Developers Korea  (0) 2012.08.24
스터디 모임 소개^-^  (0) 2012.08.21
자바 마지막^^  (0) 2012.03.22

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring XML을 이용한 설정

OpenSource/Spring 2012.08.16 17:09
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
스프링의 애플리케이션 컨텍스트는 XML에 담긴 DI정보를 활용 할 수 있다.

DI 정보가 담긴 XML 파일은 <beans>를 루트 엘리먼트로 사용한다.
<beans>는 이름에서도 알 수 있듯이 여러개의 <bean>을 정의 할 수 있다.

아래의 그림처럼 http://acet.pe.kr/120  에서의 @configuration과 @bean을 각 @configuration을 <beans>
@bean을 <bean>이라고 대응해서 생각하면 더 쉬울 것 이다.

[참고 그림]


클래스 설정과 xml설정의 대응항목
   자바 코드 설정정보  XML 설정정보
 빈 설정파일  @Configuration  <beans>
 빈의 이름  @Bean methodName()  <bean id="methodName"
 빈의 클래스  return new BeanClass();  class="a,b,c...BeanClass">

ex) connectionMaker()메소드의 <bean> 태그 전환
@Bean   --------------------------------> <bean
pubilc ConnectionMaker
    connectionMaker(){ -------------------> id="connectionMaker"
         return new DConnectionMaker(); ----> class="springbook...DConnectionMaker" />
    }


※ <property> 태그를 사용해 의존 오브젝트와의 관계를 정의 해보자.
<property> 태그는 name과 ref라는 두개의 애트리뷰트를 갖는다.
name은 애트리뷰트의 이름이다. 이 프로퍼티 이름으로 수정자 메소드를 알 수 있다.
ref는 수정자 메소드를 통해 주입해줄 오브젝트 빈 이름이다.

ex) userDao.setConnectionMaker(connectionMaker()); 를 아래와 비교해보라.
<property name="connectionMaker" ref="connectionMaker" />

<property> tag를 <baen> tag안에 넣어주면 된다.
ex)
     <bean id="userDao" class="springbook.dao.UserDao">
             <property name="connectionMaker" ref="connectionMaker" />
      </bean>

이첨럼 <bean> tag를 이용해 @Bean 메소드를 모두 xml로 변환 했다.
마지막으로 <beans> tag로 감싸주면 된다.
ex)
<beans>
    <bean id="connectionMaker" class="springbook.user.dao.DConnectionMaker" />
    <bean id="userDao" class="springbook.dao.UserDao">
          <property name="connectionMaker" ref="connectionMaker" />
    </bean>
</beans>

※ <property> tag의 name과 ref는 그 의미가 다르므로 이름이 같더라도 어떤 차이가 있는지 구별 할 수 있어야 한다.
name 애트리뷰트DI에 사용할 수정자 메소드의 프로퍼티 이름이며, ref 애트리뷰트주입할 오브젝트를 정의한 빈의 ID(DI 받을 빈을 지정) 이다. 보통 프로퍼티이름과 DI되는 빈의 이름이 같은 경우가 많다.

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

DI(Dependency Injection)

OpenSource/Spring 2012.08.09 17:06
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



출처 : 토비의 스프링 3
DI(Dependency Injection) : 의존관계 주입!

배경 : IoC의 너무 넓은 의미=> Spring의 기능, 특징을 한마디로 표현 X => DI 라는 용어를 만듬.

DI는 외부로부터 레퍼런스를 제공받고, 이를 통해 여타 오브젝트와 다이나믹하게 의존관계가 만들어지는 것이 핵심이다.

의존관계 주입은 다음과 같은 세가지 조건을 충족하는 작업을 말한다.
1) 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
2) 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
3) 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입) 해줌으로써 만들어진다.

다시 또 말해보면 DI는 자신이 사용할 오브젝트에 대한 선택과 생성 제어권을 외부로 넘기고 자신은 수동적으로 주입받은 오브젝트를 사용한다는 점에서 IoC의 개념에 잘 들어맞는다.

스프링이 제공하는 IoC방법은 의존관계주입(DI)만 있는 것이 아니다.
코드에서는 구체적인 클래스에 의존하지 않고, 런타임 시에 의존관계를 결정한다는 점에서 의존관계 주입과 비슷하지만, 의존관계를 맺는 방법이 외부로부터의 주입이 아니라 스스로 검색을 이용하기 때문에 의존관계 검색(dependeny lookup)이라고 불리는 것도 있다. 의존관계 검색은 자신이 필요로 하는 의존 오브젝트를 능동적으로 찾는다. 물론 자신이 어떤 클래스의 오브젝트를 이용할지 결정하지는 않는다. 그러면 IoC라고 할 수는 없을 것이다. 의존관계 검색은 런타임 시 의존관계를 맺을 오브젝트를 결정하는 것과 오브젝트의 생성작업은 외부 컨테이너에게 IoC로 맡기지만, 이를 가져올 때는 메소드나 생성자를 통한 주입 대신 스스로 컨테이너에게 요청하는 방법을 사용한다.

스프링의 IoC컨테이너인 애플리케이션 컨텍스트는 getBean()이라는 메소드를 제공한다. 바로 이 메소드가 의존관계 검색에 사용 된다.

ex)

public UserDao(){
  AnnotationConfigApplicationContext context =
                                       new AnnotationConfigApplicationContext(DaoFactory.class);

   this.connectionMaker = context.getBean("connectionMaker", ConnectionMaker.class);
}

※ DI를 원하는 오브젝트는 먼저 자기자신이 컨테이너가 관리하는 빈이 돼야 한다는 사실을 잊지 말자.
    스프링의 핵심인 IoC와 DI는 오브젝트의 설계와 생성, 관계 사용에 관한 기술 이다.

의존관계 검색과 의존관계 주입에서의 차이는
   의존관계 검색 방식에서는 검색하는 오브젝트는 자신이 스프링의 빈일 필요가 없다는 점이다.

스프링은 DI를 편하게 사용 할 수 있도록 도와주는 도구이면서 그 자체로 DI를 적극 활용한 프레임워크 이기도 하다. 그래서 스프링을 공부하는 건 DI를 어떻게 활용해야 할지를 공부하는 것이기도 하다.

DI는 생성자 뿐만 아니라 수정자 메소드(setter), 일반메소드(set으로 시작) 등으로도 구현이 가능.
저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • 초보 2013.01.24 03:08 신고 답글 | 수정/삭제 | ADDR

    아래의 의존관계 주입과 검색의 차이점이 잘 이해가 안됩니다.

    의존관계 검색 방식에서는 검색하는 오브젝트는 자신이 스프링의 빈일 필요가 없다는 점이다.

    검색하는 오브젝트는 UserDao이며 UserDao는 빈으로 등록되어야 한다는 뜻인가요?

    답변 부탁드립니다.

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2013.01.24 16:27 신고 수정/삭제

      네 안녕하세요^^
      문의 하신 "의존관계 검색 방식에서는 검색하는 오브젝트는 자신이 스프링의 빈일 필요가 없다는 점이다" 이 문구만으로는 조금 이해하시기 어려우실꺼라 생각이 드네요^^;; 제가 더 자세하게 기술을 했어야 했는데 너무 포인트만 적어놨네요;

      위의 문구를 이해하실려면
      더 상단에 적힌 3개의 조건을 이해 하셔야 합니다.
      의존관계 주입은 다음과 같은 세가지 조건을 충족하는 작업을 말한다.
      1) 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
      2) 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
      3) 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입) 해줌으로써 만들어진다.

      3가지 내용은 토비1권을 보시면 됩니다.
      또한 지금 위의 3가지는 의존관계에 대해서 강조 하고 있습니다.
      다시 말씀 드리면 DI / DL의 큰 차이는 "의존관계"가
      가장 큰 차이라고 할 수 있겠네요
      DI는 서로 의존 관계가 있죠! 어떤걸로? interface로요~ 1)번 사항 참고
      즉 userDao 쓸려면 connection이 되어야 하죠^^ (의존관계가 서로 있다는 뜻, 즉 둘 다 bean이 등록이 되어야 함.) 외부주입은 setter나 생성자로 보통 하죠~

      DL은 getBean()을 통해서 해당 connectionMaker을 가져올 지라도 usrDao는 빈으로 등록 할 필요가 없다는 뜻이에요 new해서 객체 생성 해도 무관하다는 것이죠

      문의 하신 "검색하는 오브젝트는 UserDao이며 UserDao는 빈으로 등록되어야 한다는 뜻인가요?" 에서 반대로 UserDao가 빈으로 등록되지 않아도 된다는 뜻이라고 생각하시면 됩니다. DL에서요^^

      음..설명을 잘못해서..더 헷깔리실 수 있겠지만..토비 1권을 조금 참조 하시면서 보시면 이해가 가실꺼라 생각합니다^^;

      참고사항으로
      http://acet.pe.kr/220과 http://acet.pe.kr/183 을 보시면 좋을 것 같네요

      열공하세요~~~

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바