IOC(Inversion of control)

자바가 등장하고 자바 기반으로 애플리케이션을 개발하기 시작하던 최초의 시기에는 자바 객체를 생성하고 객체간의 의존관계를 연결시키는 등의 제어권을 개발자가 직접 가지고 있었다.

그러나 서블릿, EJB가 등장하면서 개발자들이 가지고 있던 제어권과 객체의 생명주기를 관리 하는 권한이 서블릿과 EJB를 관리하는 컨테이너에게 넘어갔다.

이처럼 객체의 생성에서부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐것을 의미하는 것이 제어권의 역전, 즉 IoC라는 개념이다.


DL(Dependency Lookup)

IoC 컨테이너는 각 컨테이너에서 관리해야 하는 객체들을 관리하기 위한 별도의 저장소를 가지게 되는데,

이 IoC컨테이너가 관리중인 객체 저장소(Pool)에서 객체를 검색하여 참조하는 방법이다.

(컨테이너에서 제공하는 api를 이용하여 찾고자 하는 bean을 lookup하는 방법)


DI(Dependency Injection)

Spring에서 새롭게 지원하는 IoC의 한 형태로써 각 계층 사이, 각 Class 사이에 필요로 하는 의존관계가 있다면 이를 컨테이너가 자동적으로 연결시켜 주는 것(@Autowired, @Qualifier)으로 각 Class 사이의 의존관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해 주는 것이다.


외부에서 객체를 생성후 주입시켜주게 되면 두 객체사이에 약한 결합으로 형성되게 된다.

그러나 내부에서 new를 사용하여 객체를 생성하게되면 두 객체사이에 강한 결합으로 형성이 된다.

강한 결합으로 생성시 객체에대한 의존성이 강해지므로 객체의 교체가 어렵게 된다..

반면 약한 결합으로 객체를 생성한다면 의존성이 약해지므로 객체를 쉽게 교체할 수 있게된다.


DI의 종류로는 Setter Injection, Constructor Injection, Method Injection이 있다.


Setter Injection - Class 사이의 의존관계를 연결시키기 위해 Setter() 메소드를 이용하는 방법.
Constructor Injection - Class 사이의 의존관계를 연결시키기 위해 생성자를 이용하는 방법.
Method Injection - Method Injection은 Setter Injection과 Constructor Injection이 가지고 있는 한계점을 극복하기 위하여 지원하고 있는 DI의 한 종류다. Singleton 인스턴스와 Non Singleton 인스턴스의 의존관계를 연결할 필요가 있을 때 사용한다.




'Programming > Spring' 카테고리의 다른 글

jstl 간단 사용법  (0) 2018.05.13
jQuery 간단 사용법  (0) 2018.05.13
Spring Framework  (0) 2018.05.12
CRUD구현하기 - Back end  (0) 2018.02.16
CRUD 구현하기 - front end  (0) 2018.02.16

1.  Spring Framework란?
부품을 조립해주는 라이브러리(lib)로 라이브러리가 모이면 framework(재사용하는 틀)이 된다.
요구명세서(목록)만 주면 객체도 생성하고 조립까지 해준다.




 2. Spring Framework의 장점
- 경량 컨테이너
전체 스프링의 크기는 1MB 남짓 한 하나의 JAR파일 및 스프링에 의해 발생하는 부하는 무시해도 되는 수준
객체의 라이프 사이클 관리, JAVA EE 구현을 위한 다양한 API 제공
- DI(Dependency Injection), AOP(AspectOriented Programming),
POJO(Plain Old Java Object) 지원
- 다양한 API와의 연동 지원을 통한 JAVA EE 구현 가능
3. Spring Framework의 주요 특징
- DI(의존성 주입) / AOP(관점지향) / MVC(JDBC 코딩)
- 통합(struts, spring, mybatis, hibernate)
- Transation / IOC(제어의 역행, 역제어)



'Programming > Spring' 카테고리의 다른 글

jQuery 간단 사용법  (0) 2018.05.13
IOC / DL / DI  (0) 2018.05.13
CRUD구현하기 - Back end  (0) 2018.02.16
CRUD 구현하기 - front end  (0) 2018.02.16
Ajax  (0) 2018.02.15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@Controller
public class PostController {
    
    private static final Logger logger = LoggerFactory.getLogger(PostController.class);
    
    // ...
     
     @RequestMapping(value="/boardDetail/write", method = RequestMethod.GET)
     public ModelAndView writeDetailBoard() throws Exception{
         
         ModelAndView mv = new ModelAndView("/Sample/boardWrite");
         return mv;
     }
     
     @RequestMapping(value = "/boardDetail/insert", method = RequestMethod.POST)
     public ModelAndView insertBoard(@RequestParam Map<String,Object> commandMap, @RequestPart("file") MultipartFile[] files) throws Exception{
            ModelAndView mv = new ModelAndView("redirect:/");
            sampleservice.insertBoard(commandMap, files);
            return mv;
        }
     
 
     @RequestMapping(value = "/boardDetail/modify/update", method=RequestMethod.PUT)
     public ModelAndView updateBoard(@ModelAttribute Post post) throws Exception{
         sampleservice.updateBoard(post);
         return new ModelAndView("redirect:/");
     }
     
      @RequestMapping(value= "/boardDetail/modify/delete/{id}", method=RequestMethod.DELETE)
     public ModelAndView DeleteBoard(@ModelAttribute Post post) throws Exception {
         sampleservice.DeleteBoard(id);
         return new ModelAndView("redirect:/");
     }
 
    //...
 
}
     
cs


'Programming > Spring' 카테고리의 다른 글

IOC / DL / DI  (0) 2018.05.13
Spring Framework  (0) 2018.05.12
CRUD 구현하기 - front end  (0) 2018.02.16
Ajax  (0) 2018.02.15
ViewResolver  (0) 2018.02.14

HTML FORM에서는 기본적으로 GET과 POST밖에 지원을 해주지않는다.


그래서 request를 보낼때, INPUT 타입으로 _method를 주어서 거기에 원하는 CRUD를 넣어 전송할 수 있다.

그러면, web.xml에 이 필터를 추가해 놓는다면, _method에 해당하는 RequestMetod에 매핑이 된다.


<filter>

       <filter-name>httpMethodFilter</filter-name>

       <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>

</filter>

<filter-mapping>

      <filter-name>httpMethodFilter</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping> 


그리고 jsp단에서는 이에 따라서 값을 변경해주는 로직이 필요하다.


document.getElementById()으로 받아온 form 아이디와 form을 연결해준다. 그리고 넘어온 아이디가 없다면document.createElement()으로 form을 새로 만들어 주고,

document.setAttribute(key, value)을 이용하여 input이나 hidden값을 담아주고 appendChild()과 document.body.appendChild()으로 부모에 연결시켜준다. 이를 이용해서 위에서 말한 로직을 만들어준다.


아래는 그 코드이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
function Func(_formId) {
    
    this.formId = (if(_formId == "")) == true ? "commonForm" : _formId;
    this.url = "";
    
    if(this.formId == "commonForm"){
        
        formId = document.createElement("form");
    }
    else{
        formId =  document.getElementById(_formId);
    }
    
    this.setUrl = function setUrl(url){
        this.url = url;
    };
    
    this.addParam = function addParam(key, value){
        
        var hidden = document.createElement("input");
        
        hidden.setAttribute("type""hidden");
        hidden.setAttribute("name", key);
        hidden.setAttribute("id", key);
        hidden.setAttribute("value", value);
        
        formId.appendChild(hidden);
    };
    
    this.submit = function submit(method){
        
        if(method == "PUT"){
            
            var hidden = document.createElement("input");
            
            hidden.setAttribute("type""hidden");
            hidden.setAttribute("name""_method");
            hidden.setAttribute("value""PUT");
            
            formId.appendChild(hidden);
            
            method="POST";
        }
        else if(method == "DELETE"){
            
            var hidden = document.createElement("input");
            
            hidden.setAttribute("type""hidden");
            hidden.setAttribute("name""_method");
            hidden.setAttribute("value""DELETE");
            
            formId.appendChild(hidden);
            
            method="POST";
        }
        
        formId.setAttribute("action", this.url);
        formId.setAttribute("method", method);
        
        document.body.appendChild(formId);
        
        formId.submit();    
    };
    
}
cs



이렇게 준비가 모두 완료되었으면 jsp에서 CRUD 를 구현할수 있다. 


GET

1
2
3
var Func = new Func();
Func.setUrl(URL);
Func.submit("GET");  
cs



POST

1
2
3
var Func = new Func("frm");
Func.setUrl(URL);
Func.submit("POST");
cs


PUT

1
2
3
var Func = new Func("frm");
Func.setUrl(URL);
Func.submit("PUT");
cs


DELETE

1
2
3
var Func = new Func("frm");
Func.setUrl("URL"+ {id});
Func.submit("DELETE");
cs



해당하는 곳에서 이렇게 메서드만 구현해주면 간단하게 CRUD를 요청할수가 있다.


'Programming > Spring' 카테고리의 다른 글

Spring Framework  (0) 2018.05.12
CRUD구현하기 - Back end  (0) 2018.02.16
Ajax  (0) 2018.02.15
ViewResolver  (0) 2018.02.14
Spring 진행과정  (0) 2018.02.14
1. AJAX(Asynchronous Javascript and XML)란

웹의 흐름에서는 새로운 URL로 호출 되면서 페이지가 새로 뿌려지지만, 그래서 화면이 깜빡거린다.
AJAX를 사용하면 일부만을 로드해올 수 있다.

2. 원리

브라우저 위에 주소창에 URL을 쓰고 들어간다. 그러면 브라우저가 그 URL(서버)로 연결시켜준다.
서버에서 받아온 데이터들을 브라우저가 받아서 파싱해서 뿌려준다.
이게 보통 웹의 흐름이라면, AJAX는 AJAX 자체가 브라우저라고 생각하면 된다. 

3. 예제

jQuery를 사용하면

스크립트 단에서 다음과 같이 ajax를 만들어준다. 여기서 주의할 점은 contentType을 "application/json; charset=UTF-8"으로 설정해주지 않고 json데이터를 던지게 되면 인코딩이 서로 맞지않아서 Controller단에서 데이터를 제대로 받을수가 없어서 415에러가 뜨게 된다. 아래 예제에서는 Controller단에서 데이터를 Object형식으로 던지게 되는데, 이를 ajax Success는 json형식으로 받아오게 된다.
이를 위해서 jackson을 사용하였다.

pom.xml에 아래와 같이 jackson을 추가해서 Controller단에서 던지는 객체를 json형태로 변환해주도록 하자.

1
2
3
4
5
6
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>{Setting Version}</version>
</dependency>
 
cs



json data를 만드는 방법은 다음과 같다

var data = new Object();
data.A = "a";
data.B = "b";

결과값 >> {"A":"a", "B":"b"}

1
2
3
4
5
6
7
8
9
10
11
12
$.ajax({
   url  : "...",
   type : "POST",
   contentType : "application/json; charset=UTF-8",
   data : JSON.stringify(data),
   success : function(data){
       A(data);
   },
   error : function(request, status, error){
       alert(error);
   }
});
cs

JSON.stringify(data)는 JSON객체를 String으로 변환해주는 메소드이다.


1
2
3
4
5
6
7
8
9
10
private static final Logger logger = LoggerFactory.getLogger(PostController.class);
 
@ResponseBody
@RequestMapping(value = "...", method = RequestMethod.POST)
public List<Comment> InsertComment(@RequestBody HashMap<String,Object> commandMap) throws Exception{
 
 logger.info(commandMap.toString());
 
 return commentService.insertComment(commandMap);
}
cs

정리

ajax가 json을 String형식으로 던지게 되면 Controller는 @RequestBody으로 연결해준곳에 HashMap으로 받아와서 로직을 실행하고, 그 다음 결과값을 return해줄때, 객체 형태로 던지는데 이때, jackson덕분에 이를 json형태로 자동으로 변환해 주고, 이를 ajax에서 success로 받아서 원하는 형태의 html로 변환해주면 된다.

여기서 주의할 점은 @ResponseBody인데 이는 결과값을 return할때 DispatcherServlet이 ModelAndView와 같은 객체를 가지고 ViewResolver에게 넘겨준다음 리턴되는 View를 찾는 것이 아니라 return값그대로 HttpResponse Body에 직접 쓰여지게 되는 어노테이션이다.


'Programming > Spring' 카테고리의 다른 글

CRUD구현하기 - Back end  (0) 2018.02.16
CRUD 구현하기 - front end  (0) 2018.02.16
ViewResolver  (0) 2018.02.14
Spring 진행과정  (0) 2018.02.14
root-context & servlet-context  (0) 2018.02.14

InternalResourceViewResolver

  1. Jsp나 Html 파일과 같이 웹 어플리케이션의 내부 자원을 이용하여 뷰를 생성하는 AbstractUrlBasedView 타입의 뷰 객체를 리턴합니다.
  2. local ViewName을 physical ViewName으로 리턴하는 역할을 합니다.
  3. 기본적으로 사용하는 View 클래스입니다.
  4. prefix, suffix 프로퍼티를 사용합니다.

<bean id="internalResource" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
    <property name="prefix" value="jsp/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>


BeanNameViewResolver

  1. 뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용합니다.
  2. 주로 커스텀 View 클래스를 뷰로 사용해야 하는 경우에 사용합니다.
  3. 파일다운로드할때 주로 사용합니다.


 <bean id="fileviewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
     <property name="order" value="0"/>
<bean id="download" class="sp.mvc.file.download.ExcelDown"/> 


XmlViewResolver

뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용합니다.

별도의 XML 설정 파일로부터 빈 객체를 검색합니다.

Location 프로퍼티의 값을 지정하지 않을 경우 기본값은 "/WEB-INF/views.xml"입니다.


<bean id="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
    <property name="location" value="/WEB-INF/xml_views.xml"></property>
</bean>



이 외에도 커스텀 뷰를 이용하여 엑셀, PDF를 다운 받을 수 있다. 그리고 자바객체를 JSON으로 변환해주는 객체도 만들수 있다.

하지만 별도의 라이브러리를 다운로드 하여 사용한다.


※ 커스텀VIEW 엑셀다운로드 - http://snoopy81.tistory.com/327?category=469766

※ 커스텀VIEW PDF다운로드 - http://snoopy81.tistory.com/328?category=469766

※ 커스텀 VIEW JSON응답 - http://snoopy81.tistory.com/329?category=469766


'Programming > Spring' 카테고리의 다른 글

CRUD 구현하기 - front end  (0) 2018.02.16
Ajax  (0) 2018.02.15
Spring 진행과정  (0) 2018.02.14
root-context & servlet-context  (0) 2018.02.14
ModelAndView 와 ViewResolver  (0) 2018.02.14

Request가 들어오면 Dispatcher Servlet이 받아서 Handler Mapping에게 Request를보내서 해당하는 Controller를 찾아온다.

그리고 Dispatcher Servlet은 찾아온 controller에게 Request를 보내고 해당 Controller는 Service, Dao를 차례로 실행시켜서 마지막에 ModelAndView객체를 리턴한다. 이 ModelAndView객체에는 파라미터값이 addObject()로 들어가있고, addViewName으로 접근한 ViewName이 선언되어있다.

이를 받은 Dispatcher Servletsms View Resolver에게 ViewName을 보내서 해당하는 View를 리턴받는다.

그리고 ModelAndView에서 addObject()로 받은 모델을 View로 전송한다.

그렇게 View에서 response를 전송하면, 마지막으로 Dispatcher Servlet는 최종 Respose를 넘겨준다.

'Programming > Spring' 카테고리의 다른 글

Ajax  (0) 2018.02.15
ViewResolver  (0) 2018.02.14
root-context & servlet-context  (0) 2018.02.14
ModelAndView 와 ViewResolver  (0) 2018.02.14
파일 업로드/ 다운로드  (0) 2018.02.09

root-context

view지원을 제외한 bean

Ex) service

repository

비즈니스로직

AOP



servlet-context

view를 포함한 bean

Ex ) Controller

MultipartResolver

Interceptor

URI

Client의 요청을 받기위한 설정 등



View 단이 JSP 에서 다른 형태로 변경된다고 했을때, 이때는 servlet-context.xml 설정만 변경하시면 됩니다.


토비의 스프링에서 늘 이야기 하듯 변화의 시기와 관심이 다르면 분할(SoC)하라.

'Programming > Spring' 카테고리의 다른 글

ViewResolver  (0) 2018.02.14
Spring 진행과정  (0) 2018.02.14
ModelAndView 와 ViewResolver  (0) 2018.02.14
파일 업로드/ 다운로드  (0) 2018.02.09
MariaDB Auto_Increment  (0) 2018.02.08

+ Recent posts