DTO 생성 


안녕하세요.
고코더 입니다.


이번에는 DTO 라는 객체에 대해서 알아봅니다. DTO(Data Transfer Object)는 VO(Value Object)라고 합니다.
계층간 데이터 교환을 위한 자바빈즈이고 컨트롤러, 뷰 계층간 데이터 교환을 위한 객체입니다.
DTO는 로직을 없고 순수한 데이터 객체만 다룹니다. getter, setter 메소드를 생성한 클래스입니다.

다시 쉽게 말하면 DAO 데이터베이스를 가져올때 사용하는 변수의 집합이라고 생각하면 쉽습니다.



 1. dto 클래스를 생성 합니다.


컨트롤러를 생성하겠습니다. 
net.gocoder.mvcboard.dto 패키지에서 class를 생성 합니다. 


클래스명은 Dto로 생성 합니다. 


package net.gocoder.mvcboard.dto;
import java.security.Timestamp;
public class Dto {
     int Idx;
     String Name;
     String Title;
     String Content;
     Timestamp Regdate;
     Timestamp Modidate;
     int Passwd;
     int Hit;
}

7~14번 라인
    - 데이터베이스에 사용할 변수들을 선언하고 해당 변수에 대해 setter, getter을 생성 합니다. 
       - 생성 방법은 책 앞면에 나와 있습니다. 


그리고 생성자를 통해 사용할 수 있도록 메소드를 하나 만들어 보겠습니다.
     public Dto() {
                     
     }
     
     public Dto(int Idx, String Name, String Title, String  Content,
                Timestamp Regdate, Timestamp Modidate, int  Passwd, int Hit ) {
           this.Idx = Idx;
           this.Name = Name;
           this.Title = Title;
           this.Content = Content;
           this.Regdate = Regdate;
           this.Modidate = Modidate;
           this.Passwd = Passwd;
           this.Hit = Hit;      
     }          

setter에 값을 넣어서 사용할 수 있게 this를 이용하여 변수를 담습니다.

이렇게해서 게시판에 사용할 Dto가 준비되었습니다.
한번 선언한 변수는 어느 곳에서나 재사용할 수 있게 됩니다.


마무리


Dto가 이해가 안되도 다음 시간에 Dao를 보면 이해가 됩니다.


댓글을 달아 주세요


MVC 컨트롤러(Controller) 개발


안녕하세요.
고코더 입니다.


이번 시간에는 스프링에 핵심인
컨트롤러를 만들어 보겠습니다.

이전에 설명한 거처럼 디스패처 서블릿이 컨트롤러를 호출하면 컨트롤러는 
Dao를 호출해 데이터베이스 정보를 가져오고 다시 
모델에 담아 프론트에 전달 합니다.



 1. 컨트롤러 생성


컨트롤러를 생성하겠습니다. 
net.gocoder.mvcboard.controller 패키지에서 class를 생성 합니다. 


클래스 명은 BoardController 입니다. 
게시판에 사용할 컨트롤러명 입니다. 




 2. 컨트롤러 코딩 


컨트롤러 작성을 해보겠습니다. 하나의 메소드를 작성하면 거의 비슷한 형태에
나머지도 거의 비슷한 코딩을 이어나갑니다. MVC패턴에 매력이자 어려운 규율 때문입니다.
그래도 똑같다고 방심하지 말고 복습한다는 생각으로 읽어 가보세요.

리스트 페이지 컨트롤러를 작성 해보겠습니다.
@Controller
public class BoardController {
     Command command;
     
     @RequestMapping("/list")
     public String list(Model model) {
           System.out.println("list()");
           command = new ListCommand();
           command.execute(model);
           
           return "list";
     }

17번 라인 
    - 해당 클래스를 컨트롤러 사용하기 위해 어노테이션 @Controller을 사용합니다.
    - "import org.springframework.stereotype.Controller;" 를 참조해야 합니다.
19번 라인
    - 커맨드 인터페이스를 사용하기 위해 command로 호출 합니다. 
21번 라인 
    - "/list" 접근시 해당 컨트롤러가 호출 됩니다.
23번 라인 
    - List커맨드를 가져와서 객체를 만듭니다.
    - 해당 객체에 모델을 실행합니다. 
    - 현재까지는 커맨드안에 내용들은 개발되어 있지 않습니다.
26번 라인
    - view로 모델을 전달 합니다.


글 등록 페이지 컨트롤러를 작성 해보겠습니다.
     @RequestMapping("/write")
     public String write(HttpServletRequest request, Model  model) {                   
           model.addAttribute("request", request);
           command = new WriteCommand();
           command.execute(model);
           
           return "redirect:list";
     }

29번 라인 
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
31번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
32~33번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
35번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 등록 후에 list로 페이지를 이동합니다.


글 상세 컨트롤러를 작성합니다.
     @RequestMapping(value="/modify", method=RequestMethod.POST  )
     public String modify(HttpServletRequest request, Model  model){                    
           model.addAttribute("request", request);
           command = new ModifyCommand();
           command.execute(model);
           
           return "redirect:list";
     }

38번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
40번 라인 
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
41~42번 라인 
    - 커맨드 객체를 이용해 모델을 실행합니다.
44번 라인
    - view로 모델을 전달 합니다.


글 수정 컨트롤러를 작성합니다.
     @RequestMapping(value="/modify")
     public String modify(HttpServletRequest request, Model  model){                    
           model.addAttribute("request", request);
           command = new ModifyCommand();
           command.execute(model);
           
           return "redirect:list";
     }

47번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
49번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
50~51번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
53번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 수정 후 list로 페이지를 이동합니다.

글 삭제 컨트롤러를 작성합니다.
     @RequestMapping("/delete")
     public String delete(HttpServletRequest request, Model  model) {        
           model.addAttribute("request", request);
           command = new DeleteCommand();
           command.execute(model);
           
           return "redirect:list";
     }

56번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
58번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
59~60번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
62번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 삭제 후 list로 페이지를 이동합니다.


이렇게 게시판에 필요한 모든 클래스를 만들었습니다.
처음이 어렵지만 한번 따라하다보면 컨트롤러 개발 방법이 속에 익어 갈것입니다. 



마무리


쉽지 않나요?


댓글을 달아 주세요


커맨드 생성하기 


안녕하세요.
고코더 입니다.

오늘은 서비스 객체인 command를 만들어보겠습니다.
커맨드 객체는 컨트롤러와 데이터베이스를 연결해주는 역할을 합니다. 
기본적으로 커맨드 객체는 기본 인터페이스를 통해 작동합니다.

오늘 할 작업 할 내용을 구조도로 그려보았습니다. 
커맨드는 인터페이스를 만들어서 이를 사용해
contet(상세), delete(삭제), list(목록),modify(수정)을 만들어보겠습니다.






 1. 커맨드(command) 인터페이스 생성 


마우스 오른쪽 버튼을 눌러서 new -> interface를 생성 합니다. 


인터페이스 이름은 "Command"로 생성합니다.
모든 커맨드에 기본 인터페이스로 참조될 것입니다.


그리고 안에 내용을 아래처럼 채워넣습니다. 
이 커맨드는 각 서비스 커맨드에 인터페이스로 사용 됩니다. 
import org.springframework.ui.Model;
public interface Command {
      public void execute(Model model);
}

7번 라인
    - 공통 실행을 위한 model을 선언합니다.



 2. ContentCommand - 상세보기 커맨드 생성


이번에는 게시판에서 상세보기 게시판 뷰에 해당하는 커맨드를 만들어 보겠습니다. 
해당 커맨드 패키지에서 
new -> class를 생성 합니다. 


그리고 interfaces에서 add를 클릭 합니다.
Name에는 ContentCommand


그리고 command를 검색해서 아까 만들어놓은
인터페이스를 참조하도록 설정 합니다. 


그리고 해당 command 객체에는 아래처럼 내용을 담습니다.
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class ContentCommand implements Command {
      @Override
      public void execute(Model model) {
            // TODO Auto-generated method stub
            Map<String, Object> map = model.asMap();
            HttpServletRequest request = (HttpServletRequest)  map.get("request");
            String Id = request.getParameter("Id");
      }
}

7번라인 
    - 인터페이스 Command를 Implements를 합니다. 참조합니다. 

12번 라인
    - Model에 담아온 값을 map 타입에 담습니다.
    - requetst 값을 사용하기 위해 선언합니다.
    - 그리고 컨텐츠 상세보기를 위해서 Id 값을 가져옵니다.



 3. DeleteCommand 


삭제를 담당할 커맨드 객체를 생성합니다. 생성 과정은 동일하며 코드도 같습니다.


id 값을 받아 삭제를 요청할 것입니다. 


 4. ListCommand


게시판 목록을 노출할 리스트 커맨드를 생성 합니다.


dao객체가 아직 없기에 빈 커맨드 상태로 둡니다.
package net.gocoder.mvcboard.command;
import org.springframework.ui.Model;
public class ListCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
     }
}




 5. WriteCommand


글쓰기 커맨드를 생성 합니다.


내용은 아래처럼 채워 넣습니다. 작성자,제목,내용을 받아 입력할 것입니다.
package net.gocoder.mvcboard.command;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class WriteCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
           
           Map<String, Object> map = model.asMap();
           HttpServletRequest request = (HttpServletRequest)  map.get("request");
           String Name = request.getParameter("Name");
           String Title = request.getParameter("Title");
           String Content = request.getParameter("Content");
     }
}

15~17번 라인
    - 글쓰기 내용을 가져옵니다.


 6. ModifyCommand 


수정 커맨드를 생성 합니다. 동일한 과정입니다. 


수정 커맨드는 글쓰기 커맨드에 id값을 하나 더 받아 옵니다.
package net.gocoder.mvcboard.command;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class ModifyCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
           Map<String, Object> map = model.asMap();
           HttpServletRequest request = (HttpServletRequest)  map.get("request");
           String Id = request.getParameter("Id");
           String Name = request.getParameter("Name");
           String Title = request.getParameter("Title");
           String Content = request.getParameter("Content");
           
     }
}

15번 라인 
    - id 값은 조건절에 사용됩니다.
16~18번 라인
    - 수정될 정보를 받아 처리 합니다.



 7. Command 조직


해당 커맨드가 생성된 모습입니다. 게시판에 필요한 기능을 우선 만들었습니다. 
나중에 커맨드는 dao를 추가하는등에 수정을 이루어질 것입니다.



마무리


각 객체에 대한 이해도를 높히기 위해 커맨드를 일괄 생성하였습니다.



댓글을 달아 주세요


게시판 만들기 초기설정


안녕하세요.
고코더 입니다. 


스프링에 대해 알아보았고
간단한 예제로 중요한 요소들을 살펴보았습니다.
이번 시간부터 스프링 게시판을 만드는 방법을 알아보겠습니다.
기본적으로 회사에서 많이 사용하는 방식으로 구현할 것 입니다.



 1. 프로젝트 구조도




함께 만들어올 게시판에 구조도 입니다.
스프링으로 웹프로젝트를 하면 대부분 이런 구조가 나타나는데요.
이 그림은 머리속에 한번 새겨 보시고 프로젝트를 함꼐 하면서
조금씩 구체화 되어 나갈것입니다.



 2. 프로젝트 생성 


 2-1. 이번 프로젝트 이름은 MVCBoard 라고 하겠습니다.
이전 시간에 배웠던 방법대로 MVC Project를 만들어보겠습니다.


 2-2. 이번 패키지 명은 net.gocoder.mvcboard로 만들어 보겠습니다. 


 2-3. 그럼 이제 게시판을 만들 MVCBoard가 생성 됩니다. 





 3. 패키지생성


개발에 들어가기 전에 패키지를 생성합니다. 
패키지는 쉽게 말하면 폴더 입니다. 먼저 폴더를 만들어 구조도대로
개발을 준비하는 과정입니다. 

 3-1. package를 생성 하는 방법은 프로젝트에서 
new->package를 선택합니다.


 3-2. 그리고 아래처럼 입력하여 패키지를 만들겠습니다.
net.gocoder.mvcboard.command


 3-3. 그럼 이렇게 빈 패키지가 생성 됩니다. 


 3-4. 이런 방식으로 3가지 패키지를 더 생성 합니다.
net.gocoder.mvcboard.controller

net.gocoder.mvcboard.dao

net.gocoder.mvcboard.dto


 3-5. 만들어진 패키지 모습은 이런 구조가 됩니다.
빈 폴더이기에 하얀색이고 안에 파일은 아직 없습니다.



마무리


프로젝트를 생성하여 패키지를 만들었습니다.


댓글을 달아 주세요


데이터 객체로 변수를 줄이기


안녕하세요.
고코더 입니다. 


이전 시간에 파라미터 데이터를 VIEW로 전달을 해봤습니다.
기초적인 예제였는데요.


하지만 실무에서는 소스 길이기 갈게 나오지 않게 스프링에 장점을 살려서 변수를 클래스에서 가져오는 방법을 씁니다.
스프링은 커맨드 객체를 사용할 수 있도록 규칙이 설정되어 있으며 변수만 담아주면 이전 시간에 했던 소스를 간단하게 개발해 view에 전달할 수 있습니다.
소스를 함께 개발하면서 이 부분을 살펴보겠습니다
역시 이전 소스를 활용합니다.


 1. Gocoder.java 작성


 1-1. 클래스 파일을 생성합니다. 처음 생성하는 분들이 있으실텐데요
해당 프로젝트 팩키지로 마우스 오른쪽 버튼을 눌러 
new -> Class를 클릭 합니다. 

 
 1-2. Gocoder라는 이름으로 생성하였습니다.


 1-3. 그리고 아래처럼 변수를 세팅했습니다.
private만 작성하고 세터,게터를 작성하면 됩니다.
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
package net.gocoder.hello;
public class Gocoder {
     private String name;
     private String blog;
     private String homepage;
     
     public String getName() {
           return name;
     }
     public void setName(String name) {
           this.name = name;
     }
     public String getBlog() {
           return blog;
     }
     public void setBlog(String blog) {
           this.blog = blog;
     }
     public String getHomepage() {
           return homepage;
     }
     public void setHomepage(String homepage) {
           this.homepage = homepage;
     }
}
cs




 2. HomeController.java 수정


 2-1. 그 다음 HomeController.java를 수정합니다. 
기존에 만들었던 방식은 모두 주석 처리 합니다. 
그리고 아래처럼 새롭게 코딩을 합니다. 
1
2
3
4
5
@RequestMapping(value = "/gocoder/view", method =  RequestMethod.GET)
public String gocoderView(Gocoder gocoder) {
 
return "gocoder/view";
}    
cs

 2-2. 소스설명
기존에 저랑 함께 만들었던 소스를 주석처리 하지 않으면 오류가 납니다.
그리고 이게 전부입니다. 스프링이 생략이 많아 이해가 안되실지 모르겠지만
그냥 이렇게 하면 자동으로 맵핑 되는구나라고 생각하시면 됩니다.

55번 라인 
    - 동일하게 URL을 지정합니다
56번 라인
    - Gocoder 라는 클래스명을 gocoder로 생성합니다.
58번 라인
    - 뷰에 전달합니다.


 3. view.jsp HTML 추가


 3-1. 데이터 객체를 사용하면 el 태그에서 변수를 가져올때 배열 방식으로 가져와야 합니다.
gocoder라는 객체에 배열로 담겨 있고
배열 주소로 접근해야 합니다.
1
2
3
4
5
6
7
<h1>이름</h1>
<p>${gocoder.name}</p>
<h1>블로그</h1>
<p>${gocoder.blog}</p>
<h1>홈페이지</h1>
<p>${gocoder.homepage}</p>
 
cs

 3-2. 소스설명

25,27,29 라인
    - 대이터 객체 gocoder 안에 담긴 내용을 하나씩 가져 옵니다.



 4. 결과화면


 4-1. 2번 커맨드 객체 방식을 가져옵니다.


 4-2. 소스에 양을 비교해보세요.
오른쪽 버전도 충분히 서블릿 jsp에 비해 소스양은 줄었지만
데이터 객체를 사용한 버전은 정말 단순해졌습니다.



마무리


스프링에 묘미 입니다.





댓글을 달아 주세요


파라미터로 받아 view 노출하는 예제


안녕하세요.
고코더 입니다.


 1. 오늘은 HttpServletRequest 에 대해 알아보려고 합니다.
URL로 접근하는 모든 패턴은 디스패처서블릿이 가로챈다고 말씀드렸습니다.

 2. 이걸 기초로 오늘은 파라미터에 있는 정보를 HttpServletRequest로 데이터 전송을 받아보는 방법을 알아보겠습니다.
이전에 만든 hello 소스에 추가하여 개발해보겠습니다.


 3-1. 컨트롤러에 함수 추가 / HttpServletRequest / @RequestMapping


 3-2. HomeController.java를 수정 합니다. 


 3-3. 그리고 아래 코드를 입력 합니다
1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping(value = "/gocoder/view", method = RequestMethod.GET)
public String gocoderView(HttpServletRequest httpServletRequest, Model model) {
    
    String name = httpServletRequest.getParameter("name");
    String blog = httpServletRequest.getParameter("blog");
    String homepage = httpServletRequest.getParameter("homepage");
    
    model.addAttribute("name",name);
    model.addAttribute("blog",blog);
    model.addAttribute("homepage",homepage);
            
    return "gocoder/view";
}    
cs

 3-4. HomeController.java 추가된 소스 설명

41번 라인 
    - @RequestMapping는 해당 컨트롤러에서 해당 URL 패턴을 가로채는 어노테이션입니다. 
    - URL 패턴 /gocoder/view로 들어오는 접속을 캐치 합니다. 그리고 get인걸 확인합니다.     

42번 라인
    - gocoderView라는 함수를 만들고 HttpServletRequest를 선언합니다. 해당 클래스로 파라미터를 받을 수 있습니다. 
    - model 함수는 view에 데이터를 전달하기 위해 꼭 필요한 존재입니다.

44번~46번 라인
    - 42번 라인에서 선언한 httpServletRequest 클래스에 getParameter 를 이용해 파라미터 값을 가져옵니다.
    - 각 파라미터로 오는 값을 받습니다. 파라미터명과 변수명을 똑같이합니다. 헷갈리지 않기 위해 

48번~50번 라인
    - 프론트에 model을 통해 해당변수로 값을 담아 넘깁니다.
    - 이때도 역시 동일한 변수명으로 el태그를 프론트에 사용할때 헷갈리지 않게 사용 합니다. 

52번라인    
    - view에 전달할 주소를 적습니다. 
    - 마지막 파일명을 제외한 슬러시는 폴더가 됩니다. 즉 여기서 폴더는 gocoder 폴더 입니다.


 4. view파일 생성 / el태그


 4-1. 해당 폴더 위치에 view.jsp를 생성 합니다.
/hello/src/main/webapp/WEB-INF/views/gocoder/view.jsp


 4-2. 아래처럼 HTML을 코딩 합니다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" language="java" %>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
<meta http-equiv="Content-Type" content="text/html;  charset=utf-8" />
</head>
<body>
     <h1>이름</h1>
     <p>${name}</p>
     <h1>블로그</h1>
     <p>${blog}</p>
     <h1>홈페이지</h1>
     <p>${homepage}</p>
</body>
</html>
cs

 4-3. 소스설명

2번 라인 
    - JSP 상에 이미 입력된 한글 텍스트가 깨지지 않도록 엔코딩 태그를 넣어줍니다.
    ->

11,13,15번 라인
    - el태그를 사용해 모델에서 보내온 변수를 사용하여 프론트에 노출 합니다. 


 5. 결과화면 


 5-1. 정상적으로 코딩하셨다면 해당 링크로 접속시에 정상적인 뷰화면이 보입니다. 

 5-2. 가장 간단한 방식으로 파라미터를 받아 뷰에 노출하는 방식을 사용하였습니다.



마무리


여기까지 이해가셨다면 
스프링이 재밌어집니다.


댓글을 달아 주세요


스프링에서 UTF-8 한글 나오도록 설정


안녕하세요.
고코더 입니다.


 1. 스프링으로 기본 프로젝트를 생성하면 한글이 ?로 출력 됩니다.
스프링 기본 프로젝트는 UTF-8로 만들어지지 않기 때문입니다.


 2. web.xml에 아래 코드를 추가해주세요.
엔코딩필터에 UTF-8을 사용할 수 있게 만들어주는 코드 입니다.
     <filter>
           <filter-name>encodingFilter</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter
           </filter-class>
           <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
           </init-param>
           <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
           </init-param>
     </filter>
     <filter-mapping>
           <filter-name>encodingFilter</filter-name>
           <url-pattern>/*</url-pattern>
     </filter-mapping>


 3. 위치는 맨아래에 추가합니다.  코드를 그대로 복사해서 붙혀넣어주세요.
xml이 변경되었기 때문에 서버를 재시작 합니다.


그리고 다시 접속해보면
물음표(?)로 보이던 한글이 정상적으로 출력 가능합니다.


마무리


영어권 국가였으면


댓글을 달아 주세요


스프링에서 파일 get으로 접근하기 


안녕하세요.
고코더 입니다.


 1. 오늘은 자원을 사용하는 resources폴더에 대해 알아보려고 합니다.
지난 시간에 DispatcherServlet이 모든 URL 패턴을 가로챈다고 배웠습니다.

 2. 기본으로 설정된 /servlet-context.xml에 리소스 태그 속성을 보면 /resources/가 폴더가 설정되어 있습니다. 
여기로 접근하는 get 요청은 디스패처서블릿이 관여하지 않습니다.


 3. 이해를 더 쉽게 하기 위해 간단한 예제로 알아보겠습니다. 
기본으로 생성 되어있는 resources폴더와 새롭게 생성한 file 폴더에 test.txt를 생성해서 만들었습니다.


 4. 서버를 실행하고 테스트를 해보겠습니다. 
기본 리소스 폴더에 파일을 호출할땐 정상이지만
http://localhost:8080/hello/resources/test.txt


 5. file 폴더는 호출되지 않습니다. 왜냐면 디스패처가 해당 URL 패턴에 대한 컨트롤러를 찾았고 없었기 때문에 404가 뜹니다. 
http://localhost:8080/hello/file/test.txt


 6. /servlet-context.xml에 아래처럼 file 폴더에 대한 리소스 코드를 추가하였습니다.



 7. 그리고 다시 접근하면 해당 test.txt 파일이 정상적으로 출력 합니다. 
http://localhost:8080/hello/file/test.txt


이렇게 리소스 폴더는 다이렉트로 접근할 수 있는 URL로 접근할 수 있게 해줍니다.
이미지,CSS 파일등 Get으로 접근하여 사용하고 싶은 파일들을 리소스 폴더로 설정하여 사용하게 됩니다.


마무리


이 부분이 이해 안가시면
디스패처 서블릿으로 URL패턴을 다시 공부해보세요.


댓글을 달아 주세요


view가 작동 되는 방법


안녕하세요.
고코더 입니다.


이번엔 프론트에 보이게 되는 jsp 페이지인 뷰가 스프링에서 어떻게 작동하는지
간단하게 소스를 기준으로 알아보려고 합니다.


 1. servlet-context.xml 을 열어봅니다.


 2. 그럼 InternalResourceViewResolver 클래스가 빈에 참조 되어 있습니다.
그리고 prefix 와 suffix 라는 프로퍼티가 사용되고 있습니다. 


 3. prefix는 뷰 파일의 위치를 지정합니다. 기본 디폴트 값은 "/WEB-INF/views/" 입니다.
해당 폴더 위치는 src->main->webapp 아래에 있는 WEB-INF-> views폴더 입니다. 
뷰 파일을 추가한다면 해당 폴더에서 생성합니다. 


 4. suffix는 해당 뷰 파일에 확장자를 설정할 수 있습니다. 기본설정은 jsp 파일입니다.
원하는 확장자로 인식할 수 있도록 변경이 가능합니다.


5. 기본 예제 안에 HomeController.java 파일을 열어보면
리턴 값에 home을 반환합니다. 이는 view 파일 이름입니다. 



 6스프링은 이렇게 프레임워크 규칙에 따라 조합하여 뷰 파일을 찾아갑니다.



하나씩 살펴보면 간단한 구조이지만 반복하여 테스트해보고
왜 이렇게 규칙이 생겼는지 고민해보세요.


마무리


복잡하지만 복잡하지 않아요.











댓글을 달아 주세요


DispatcherServlet이 컨트롤러를 가져오는 방법


안녕하세요.
고코더 입니다.


오늘은 스프링에 핵심이자 특별한 존재인 DispatcherServlet을 좀 더 자세히 알아보겠습니다.
이전 스프링 구조도에서 중앙에서 모든걸 처리하는 역할을 했습니다.
-> Spring - 스프링 MVC 구조도 / 이해하기 쉬운



DispatcherServlet은 기존에 Web.xml이 담당했던 servlet 맵핑을 대신합니다. 그 덕에
복잡한 XML작성에서 해방 되었습니다. MVC를 가능하게 해준 이 서블릿에 대해
소스를 위주로 알아보겠습니다.
이전에 함께 만든 프로젝트 파일 기준으로 살펴봅니다. 

 1. web.xml 


 1-1. 패키지에서 src->main->webapp->WEB-INF->web.xml을 열어봅니다.


 1-2. 그 다음 XML에서 정의된 내용들을 함께 살펴 봅니다. 

20번 라인
- DispatcherServlet 기능을 참조하여
19번 라인
- appServlet 으로 네임을 지정 합니다.
29번 라인
- appServlet은 URL 패턴을 맵핑 합니다.
30번 라인
- 모든 URL에 대한 맵핑을 담당 합니다. 즉 모든 프론트 접속을 담당 합니다.

결론은 web.xml에 서블릿 맵핑을 DispatcherServlet 위임한 내용을 확인 가능합니다.



 2. 디스패처서블릿 소스 / spring-webmvc-3.1.1.RELEASE.jar


DispatcherServlet은 스프링 프레임워크에 기능입니다. 

 2-1. 해당 디스패처서블릿 기능은 스프링 spring-webmvc-3.1.1.RELEASE.jar 존재합니다.
해당 jar를 열어보세요.


 2-1. 해당 jar안에 DispatcherServlet.calss 로 정의 되어 있고 오픈 소스라 공개는 되어 있지만 해석하기 어렵지만 해당 jar에 class로 만들어져 있다는걸 눈으로 확인해보는 것도 도움이 됩니다.



 3. 컨트롤러에 어노테이션 / Controller


 3-1. 스프링에서 컨트롤러 파일을 열어보겠습니다.
기본으로 만들어져 있는 HomeController.java를 소스를 열어보세요.


 3-2. 보시면 컨트롤러가 어노테이션으로 선언되어 있습니다. 
이 어노테이션으로 해당 소스가 컨트롤러라고 선언하고 
서블릿 프로젝트 처럼 web.xml에 컨트롤러를 매번 선언하지 않고도 자동으로
스프링이 스캔하여 컨트롤러 기능을 실행하게 합니다. 




 4. 컨트롤러 스캔 / context:component-scan


해당 컨트롤러에 어노테이션들이 자동으로
스프링에 컨트롤러 역할을 만들어주는건 해당 컨트롤러를
찾는 스캔을 하기 때문입니다.

 4-1. servlet-context.xml 을 열어봅니다.


 4-2. 해당 라인에서 context:component-scan에서 hello 팩키지가 설정되어 있습니다.
이 명령어를 통해서 패키지안에 java소스들을 풀스캔합니다.
그리고 어노테이션을 발견하면 해당 컨트롤러들을 참조하여 사용하게 만들어 줍니다. 



마무리


스프링 DispatcherServlet가 컨트롤러를 찾는 방법을 소개했습니다. 원리를 모르고 개발할수도 있지만 한번 눈으로 직접 원리를 알아보고 이해하며 개발하는건 큰 차이가 있습니다. 



댓글을 달아 주세요