728x90
반응형

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 



변수명이나 클래스명은 잘못쳤을 경우 컴파일때 에러가 발생합니다..


로칼 변수와 전역 변수명이 같을 경우엔 컴파일때 문제도 없고 버그가 생길수 있겠지만..


코딩할때 로칼 변수명과 전역 변수명을 같이 주면 안되는 식..


XML의 경우에는 컴파일때 발견 못하고 실행할때 발견하게 되지만 설사 에러 메시지에 나옴

728x90
반응형
728x90
반응형

스프링 프레임워크 (Spring Framework)란?


스프링 프레임워크란?
스프링 프레임워크는 Pivotal Software에서 아파치 라이센스(무료 라이센스) 형태로 제공하는 오픈 소스 프로젝트로 자바 어플리케이션 (Standalone 과 웹 어플리케이션 모두 포함)개발에 필요한 여러 가지 서비스를 제공하는 프레임워크입니다. 현재 미국에서 자바로 어플리케이션을 개발하는 많은 회사들이 스프링 프레임워크를 사용 중이며 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로도 쓰이고 있습니다.

왜 사용하나요?
1. 오픈소스 프로젝트: 다른 블로그에서도 여러 번 강조했지만 많은 회사들이 오픈 소스를 자사의 개발에 포함하는 이유는 라이센스 비용이 따로 들지 않기 때문입니다.
2. 다양한 기능 지원: 프로그램을 개발할 때 프레임워크를 사용하는 가장 큰 이유 중에 하나는 불필요한 반복을 없애고 업무의 양을 최소화하기 때문이 아닐까 싶습니다. 스프링 프레임워크는 엔터프라이즈용 프로그램을 개발하는데 관련해서 대부분의 기능을 제공하고 있으며 이 프레임워크를 사용하면 개발자들은 자사의 제품에 특화된 비지니스 로직만 추가하면 되기 때문에 많은 시간 및 개발비의 절약을 할 수 있습니다.
또한 많은 부분을 간단한 XML 설정이나 어노테이션으로 대신 할 수 있기 때문에 실제 코딩하는 소스코드의 양을 획기적으로 줄일 수 있습니다.  
3. 다양한 방식 지원: 스프링 프레임워크는 한 가지 컴포넌트에 대한 지원도 다양한 방식으로 하고 있습니다. 예를 들어서 DB 연결 같은 경우에도 Hibernate과 같은 모듈과 연동해서 여러 종류의 JDBC를 약간의 설정만 하면 사용할 수 있게 지원하고 있습니다. 이 점은 하나의 소스코드로 다양한 DB를 사용할 수 있게 해주기 때문에 큰 장점이 됩니다.
4. Dependency Injection: 스프링은 기본적으로 Dependency Injection을 지원하기 때문에 모듈들이 타이트하게 연결되어 있지 않으며 그래서 테스트가 용이한 프로그램을 만들 수 있습니다. (특히 유닛 테스트)

5. ETC: 그 외에도 스프링은 메세징, MVC, 테스팅, AOP 등 다양한 서비스를 기본적으로 제공합니다. 

사용시 어려운 점 또는 단점
1. 스프링은 지원하는 기술의 양이 방대하고 같은 기술도 여러 가지 다른 방식으로 지원하기 때문에 처음 접하는 엔지니어들에게는 사용하기 힘든 프레임워크입니다. 
2. 스프링은 비교적 무거운 프레임워크이기 때문에 이 프레임워크의 추가 만으로 어플리케이션을 상당히 무겁게 만들 수 있습니다.  

참고로 구글이나 애플 같은 큰 소프트웨어팀을 보유하고 있는 회사 같은 경우에는 자사에서 자체 개발한 프레임워크를 사용하고 있으며 보통 스프링 프레임워크와 비슷하거나 더 많은 기능을 제공하고 있다고 합니다. 그렇지만 사용 방식이나 개념에는 큰 차이는 없다고 합니다. 

출처
1. 위키피디아: http://en.wikipedia.org/wiki/Spring_Framework
2. 스프링 프레임워크 메인 페이지: http://projects.spring.io/spring-framework/


728x90
반응형

'Web Programming > spring' 카테고리의 다른 글

No mapping found for HTTP request with URI  (0) 2018.09.04
BeanCreationException  (0) 2018.09.04
Dependency Injection (의존성 주입)이란?  (0) 2018.08.29
Spring MVC 프로세스  (0) 2018.08.29
Spring AOP with Annotation  (0) 2018.08.29
728x90
반응형

Dependency Injection (의존성 주입)이란?

Dependency Injection이란?
Dependency Injection이란 객체 또는 구성 요소간의 종속관계를 소스코드로 설정하지 않고 외부의 설정파일을 통해서 주입하도록 하는 디자인 패턴으로 주로 알려져 있는데요 쉽게 이야기하면 한 객체 안에 다른 객체가 사용되면 두 객체 간에 종속관계가 생기는 것이고 다른 객체를 포함한 객체를 생성하려면 포함된 객체가 미리 생성이 되어 있거나 그렇지 않을 경우 자동으로 생성을 해줘야 하는데 이 부분을 따로 코딩하지 않고 외부의 설정 파일을 통해서 설정해둬서 Dependency Injection 기능을 제공하는 프레임워크 (예를 들어 Spring 같은)에서 자동으로 생성하게 하는 기술입니다.

왜 사용하나요?
Dependency Injection을 사용하는 가장 큰 이유는 아래와 같습니다.
1. Loosely coupled: Dependency Injection는 보통 서비스 또는 인터페이스 개념과 같이 사용이 되는데요 한 객체를 다른 객체에 포함할 때 클래스 형태로 포함시키는게 아니라 인터페이스 형식으로 포함을 시키기 때문에 외부 설정파일이나 스프링 프레임워크 같은 경우에는 어노테이션 값의 변화를 통해 다양한 서비스를 사용할 수 있습니다. 위의 설명한 내용에 대해서 아래에 예를 참조하세요.

예1 - 클래스 형태로 포함시키는 경우 (Java)
public class Foo {
    .....
}

public class Poo {
   private Foo foo  = new Foo();
}

예2 - 인터페이스 형태로 포함시키는 경우 (Java)
public Interface FooService {
   .....
}

public class FooServiceImpl implements FooService {
   .....
}

public class Poo {
  private FooService fooServ; 
}

2. Testability: Dependency Injection을 사용하게 되면 위에 설명한 것처럼 객체 간의 관계가 느슨해지기 때문에 유닛 테스트와 같은 테스트를 작성하기가 수월해집니다. 위의 두번 째 예처럼 다른 객체에 포함된 인터페이스 형태의 서비스 같은 경우에 Mock를 하여 유닛테스트를 작성하게 되면 그 서비스와 상관없이 작동가능한 테스트를 만들 수 있습니다.

마지막으로...
Dependency Injection은 단순히 그 의미나 사용 방법을 이해하려고 하기 보다는 왜 사용이 되는지를 파악해야 이해하기가 쉽습니다. 또한 같이 사용되고 있는 서비스의 개념과 왜 서비스의 형태로 사용되어야 하는지 등을 이해해야 좀더 이해하기가 쉬운 기술입니다. 


728x90
반응형

'Web Programming > spring' 카테고리의 다른 글

BeanCreationException  (0) 2018.09.04
스프링 프레임워크 (Spring Framework)란?  (0) 2018.08.29
Spring MVC 프로세스  (0) 2018.08.29
Spring AOP with Annotation  (0) 2018.08.29
Spring AOP with XML  (0) 2018.08.29
728x90
반응형

15) 스프링 MVC 프로세스

 

* 스프링 MVC 프로세스 모델

 

 

 

 

* 스프링 MVC의 주요 구성 요소
1) DispatcherServlet : 클라이언트의 요청을 전달 받는 역할. 컨트롤러(Controller)에게 클라이언트의 요청을 전달하고, 컨트롤러가 리턴한 결과 값을 뷰(View)에 전달하여 알맞은 응답을 생성하도록 함. (스프링 제공)
2) HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지를 결정. (스프링 제공)
3) Controller : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServle에 알려준다. (실제 로직을 담당)
4) SQL 쿼리를 통한 데이터 질의문 전달.
5) 데이터베이스가 반환(Return)한 데이터 획득.
6) ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담음.
7) ViewResolver : 컨트롤러의 처리 결과를 생성할 뷰를 결정. (스프링 제공)
8) View : 컨트롤러의 처리 결과 화면을 생성 (Freemarker 등)


 

*  스프링 MVC 구조 및 처리 순서
1) 클라이언트의 요청이 DispatcherServlet에 전달됨.
2) DispatcherServlet은 HandleMapping을 사용하여 클라이언트의 요청을 처리할 컨트롤러(Controller)를 검색.
3) 매치되는 컨트롤러가 있다면 요청을 해당 컨트롤러에게 전달.
    DispatcherServlet은 컨트롤러 객체의 handleRequest() 메서드를 호출하여 클라이언트 요청을 처리 .
4) DB 관련 처리 (DB 질의 요청)

5) DB 관련 처리 (DB 질의 결과)
6) 컨트롤러의 handlerRequest()메서드는 처리 결과 정보를 담은 ModelAndView 객체를 리턴.
7) DispatcherServlet은 ViewResolver로부터 응답 결과를 생성할 뷰 객체를 구함.
    JSP, Velocity, Freemarker 등 다양한 뷰를 지원.
    - AbstractCachingViewResolver

    - XmlViewResolver

    - ResourceBundleViewResolver

    - UrlBasedViewResolver

    - InternalResourceViewResolver

    - FreeMakerViewResolver

    -  ViewResolvers Chaining
8) 뷰는 클라이언트에 전송할 응답을 생성.



출처: http://ooz.co.kr/226?category=818548 [이러쿵저러쿵]

728x90
반응형

'Web Programming > spring' 카테고리의 다른 글

스프링 프레임워크 (Spring Framework)란?  (0) 2018.08.29
Dependency Injection (의존성 주입)이란?  (0) 2018.08.29
Spring AOP with Annotation  (0) 2018.08.29
Spring AOP with XML  (0) 2018.08.29
Spring MVC jsp jstl  (0) 2018.08.29
728x90
반응형

14) AOP with Annotation(애노테이션)

 

* 애노테이션(Annotation) & 오토와이어링(Autowiring)

 

 - 하나의 컨트롤러(Controller)와 하나의 페이지를 매핑하는 것은 작업도 번거롭고, 관리도 힘듬.

   그렇다면 하나의 함수에 하나의 URL을 어떻게 매핑할것인가?

  -> 애노테이션(Annotation)을 사용하자!

 

 - 그럼 애노테이션은 무엇인가??

  -> 주석(Comments) 단순한 주석?

  -> 컴파일러를 거친 후에도 코드에 남아있는 특수한 주석!!

 

 애노테이션은 특수한 주석으로 자체적으로 어떠한 기능을 수행하는 것은 아니지만, 애노테이션이 가리키는 지시어(정보)를 기반으로 컴파일러는 애노테이션이 적용된 클래스 또는 매서드, 프로퍼트 등에 적절한 기능을 부여한다.

 

  -> 애노테이션은 @(골뱅이) 로 주석을 시작하며, 클래스, 매서드, 변수 등에 적용됨.

 

// dispatcher-servlet.xml (객체를 생성해주고, Injection해줌)

<context:component-scan base-package=“controller”></context:component-scan>

<bean name=“noticeDao” class=“dao.NoticeDao”> // Autowired 어노테이션을 통해서 자동 매핑됨.

 

// CustomerController.java

package controllers;

 

@Controller

@RequestMapper(“/customer/*”)

public class CustomerController {

 

    private NoticeDao noticeDao;

 

    @Autowired

    public void setNoticeDao(NoticeDao noticeDao) {

        this.noticeDao = noticeDao;

    }

 

    @RequestMapping(“notice.oz”)

    public String notices(String pg, String f, String q, Model model) throws ClassNotFoundException {

        int page = 1;

        String field = “TITLE”;

        String query = “%%”

 

        if(pg == null && pg.equals(“”))            page = Integer.parseInt(pg);

        if(f == null && f.equals(“”))                 field = _field;

        if(q == null && q.equals(“”))               query = _query;

 

        List<Notice> list = noticeDao.getNotices(page, field, query); // 페이지번호검색항목검색어

        mv.addObject(“listData”, list);

 

        return “notice.jsp“; // VIEW로 사용되는 페이지 문자열(String)

    }

 

    @RequestMapping(“noticeDetail.oz”) // 게시물 상세 내용 보기

    public String noticeDetail(String seq, Model model) throws ClassNotFoundException {

        Notice notice = noticeDao.getNotice(seq);

        model.addAttribute(“notice”, notice);

        return “noticeDetail.jsp“;
    }

 

    @RequestMapping(“noticeReg.oz”) // 게시물 등록

    public String noticeReg(Notice n /* String title, String content */) throws ClassNotFoundException {

       

        /* Notice n = new Notice();

        n.setTitle(title);

        n.setContent(content); */

        noticeDao.insert(n);

        return “redirect:notice.oz“;
    }

 

    @RequestMapping(“noticeEdit.oz”) // 게시물 수정

    public String noticeEdit(Notice n /* String title, String content */) throws ClassNotFoundException {

       

        /* Notice n = new Notice();

        n.setTitle(title);

        n.setContent(content); */

        noticeDao.update(n);       

        return “redirect:noticeDetail.oz?seq=“ + n.getSeq();
    }

}

 

 - 코드 설명 -

 

 * Context:component-scan : Controller 패키지에서 URL-메쏘드 매핑된 정보를 자동으로 검색(Auto-Scan)함. 단 Controller 애노테이션된 클래스에서 해당 메서드를 찾음. 위에서 /customer/notice.oz 서브 URL이 호출되면 notices 메서드가 수행됨.

(기존 XML 방식에서는 특정 페이지의 URL과 컨트롤러를 하나씩 배정했지만, context:component-scan을 통해서는 사용자로부터 URL이 입력된 경우 @Controller 애노테이션을 가지고 있는 클래스 내부의 RequestMapping 정보를 자동으로 스캔하여 처리 함수를 찾아 연결하여 줌.)

 

 * @RequestMapping – 표시된 URL에 해당 메서드를 매핑 (지정된 URL요청이 들어오면 해당 메서드를 실행함)


 * 그런데! XML을 사용하지 않으므로 URL-Controller 맵핑 정보(빈(Bean) 객체) 자체가 XML 파일에서 사라지게 되는데 이렇게 되면 빈(Bean) 객체를 생성하고, 프로퍼티(AOP관련 포함) 값을 세팅해줄 수가 없음.

 -> 이 문제는 @Autowired 애노테이션을 통해 해결! 

 -> component-scan을 사용하는 경우 빈(Bean)객체를 세팅하고 값을 할당해 줄 수 없지만, @Autowired를 사용하여 자동으로 객체와 변수를 연결 및 설정해 줌.

 * 메서드에서 반환하는 모델이 있다면 메서드 내에 파라메터 Model model을 선언만 해주면 됨. 해당 Model 객체가 생성되어 참조가 자동으로 됨.

[ 동일한 페이지를 다르게 처리 ]
@RequestMapping(value={“/customer/noticeReg.oz”}, method=RequestMethod.GET)
@RequestMapping(value={“/customer/noticeReg.oz”}, method=RequestMethod.POST)

 

[ 매핑된 컨트롤러의 함수가 처리하는 JSP페이지와는 다른 페이지로 결과를 넘길때 ]
return “redirect:notice.oz” // redirect 처리

 

 * Request로부터 넘어오는 인자는 1:1로 함수 매개변수로 대입 가능. 더 나아가 Request를 통해서 넘어오는 개별 어트리뷰트(Attribute) 인자의 이름(변수명)이 처리 함수의 매개 변수 레퍼런스 클래스의 인스턴스(속성 값)의 이름(변수 명)과 동일하다면 이를 자동으로 맵핑(대입)하여 줌.

 



출처: http://ooz.co.kr/225?category=818548 [이러쿵저러쿵]

728x90
반응형

'Web Programming > spring' 카테고리의 다른 글

Dependency Injection (의존성 주입)이란?  (0) 2018.08.29
Spring MVC 프로세스  (0) 2018.08.29
Spring AOP with XML  (0) 2018.08.29
Spring MVC jsp jstl  (0) 2018.08.29
Spring MVC Model2  (0) 2018.08.29

+ Recent posts