### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도
... : 같은 목차 내에 구분 기호
목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제
###################################
1. 이론 및 정보
-----------------------------------
* Web MVC
Spring안에 Web안에 포함된 모듈
MVC 패턴이 만들어져 있던 모듈임
1. DispatcherServlet - FrontController
MVC의 규모?
규모가 커지면 FrontController가 감당하기 힘들어짐
서브 컨트롤러가 페이지 이동을 처리함
web.xml에서 <servlet-name>의 내용 + "-servlet.xml"로 설정파일을 만듬
dispatcher-servlet.xml
<bean name 에서 name은 URL
사용자 요청은 Dispatcher Servlet
2. HandlerMapping(org.springframework.web.servlet.handler
- BeanNameUrlHandlerMapping(기본, 생략가능)
- SimpleUrlHandlerMapping
- DefaultAnnotationHandlerMapping
...
3. Controller - servlet 패키지 안에 들어있음(org.springframework.web.servlet)
- Controller : 가장 최소한의 기능만 가지고 있음
- AbstractController : GET, POST 방식을 알려주는 메서드 supportedMethods
- AbstractCommandController
- SimpleFormController
- MultiActionController
...
3버전 부터 컨트롤러를 골라서 쓰지 말고 어노테이션을 쓰라고 권장!
4. ViewResolver
- InternalResourceViewResolver(기본, 생략가능)
- ResourceBundleViewResolver
- XmlViewResolver
- VelocityViewResolver
5. View
- InternalResourceView(기본, 생략가능)
- JstlView
- VelocityView
...
-----------------------------------
* Controller 의 Request, Response 자동 포워딩 됨
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
isELIgnored="false" 를 쓰면 포워딩이 안됨
-----------------------------------
* Spring -> IOC, AOP, DI 라는 이름으로도 불림
다양한 디자인 패턴을 지원하기 때문에
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
-----------------------------------
###################################
3. 소스코드 또는 실습
-----------------------------------
3-1
Workspace : ~\study\SpringWork
샘플로 웹 프로젝트 만듬
Maven Project - web app
groub id : com.study.myproject
artifact id : FirstWebApp
...................................
/FirstWebApp/src/main/webapp/index.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<%=request.getRemoteAddr()%>
<a href="myservlet">서블릿으로 이동</a>
</body>
</html>
...................................
를 실행시켜보면
톰캣을 쓰기로 함
localhost:8080/FirstWebApp/index.jsp
Servlet Lib 없으나 동작은 되었음
...................................
mvnrepository.com/artifact/javax.servlet/javax.servlet-api/3.1.0
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
...................................
위 dependency를 /FirstWebApp/pom.xml 에 복사
Servlet 만들기
프로젝트 우클릭 폴더 생성
src/main/java 라는 이름으로 생성
/FirstWebApp/src/main/java 우클릭 클래스 생성
...................................
/FirstWebApp/src/main/java/myservlet/ServletTest.java
package myservlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("<h1>Servlet Test...</h1>");
out.println("</body></html>");
out.close();
}
}
...................................
/FirstWebApp/src/main/webapp/WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>myservlet.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
</web-app>
...................................
-----------------------------------
3-2
Workspace : ~\study\SpringWork
/SpringWebApp1 프로젝트 생성, 3-1과 똑같이 만듬
3-1은 평범한 웹 프로젝트
이번에는 Spring안에서 돌아가는 웹프로젝트를 만들예정
라이브러리 필요, 웹 모듈 받음, 기본 준비 Spring Web MVC Module
mvnrepository.com/artifact/org.springframework/spring-webmvc/4.1.7.RELEASE
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
/SpringWebApp1/pom.xml 추가
/SpringWebApp1/src/main/webapp/index.jsp
/SpringWebApp1/src/main/webapp/result.jsp
/SpringWebApp1/src/main/webapp/WEB-INF/web.xml
스프링이 준비한 MVC 아키텍쳐에 맞게 사용해야함
/SpringWebApp1/src/main/java 폴더 만듬
/SpringWebApp1/src/main/java/controller/ResultController.java
Spring Bean Configuration File 만듬
/SpringWebApp1/src/main/webapp/WEB-INF/dispatcher-servlet.xml
...................................
/SpringWebApp1/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study.myproject</groupId>
<artifactId>SpringWebApp1</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SpringWebApp1 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>SpringWebApp1</finalName>
</build>
</project>
...................................
/SpringWebApp1/src/main/webapp/WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
...................................
/SpringWebApp1/src/main/webapp/index.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<a href="result.do">여기를 눌러주세요.</a>
</body>
</html>
...................................
/SpringWebApp1/src/main/webapp/result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>당신이 이 페이지를 보고 있다면 스프링 설정은 성공한 것이다.</h2>
</body>
</html>
...................................
/SpringWebApp1/src/main/webapp/WEB-INF/dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
<bean name="/result.do" class="controller.ResultController"></bean>
</beans>
...................................
/SpringWebApp1/src/main/java/controller/ResultController.java
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class ResultController implements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
// TODO Auto-generated method stub
return new ModelAndView("result.jsp");
}
}
...................................
-----------------------------------
3-3
Workspace : ~\study\SpringWork
/SpringWebApp2 프로젝트 생성
UTF-8 기본 코드
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
/SpringWebApp2/src/main/webapp/WEB-INF/views 폴더 만듬
사용자들이 직접 접근하지 못하도록 하기 위해서
first
/SpringWebApp2/src/main/webapp/WEB-INF/views/firstResult.jsp
/SpringWebApp2/src/main/java/controller/FirstController.java
/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml
second
/SpringWebApp2/src/main/webapp/WEB-INF/views/secondResult.jsp
/SpringWebApp2/src/main/java/controller/secondController.java
third - 집중해서 봐야할 부분
/SpringWebApp2/src/main/webapp/WEB-INF/views/thirdResult.jsp
/SpringWebApp2/src/main/java/controller/ThirdController.java
/SpringWebApp2/src/main/java/dao/UserDao.java
/SpringWebApp2/src/main/java/dto/UserDto.java
jstl 다운
mvnrepository.com/artifact/javax.servlet/jstl/1.2
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
mvnrepository.com/artifact/taglibs/standard/1.1.2
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml
<property name="supportedMethods" value="POST"></property>
추가 한뒤 - POST 방식만 전달하겠다는 의미
/SpringWebApp2/src/main/webapp/index.jsp
에서 form을 get으로 테스트 해보면 알 수 있음
forth - 어노테이션을 이용한 컨트롤러 사용
/SpringWebApp2/src/main/webapp/WEB-INF/views/forthResult.jsp
/SpringWebApp2/src/main/java/controller/ForthController.java
@Controller 를 쓰면 모든 컨트롤러를 쓰겠다는 의미로 쓰겠다?
fifth - forth 컨트롤러를 이용할 것임
비슷한 기능의 컨트롤러를 묶어 봅시다
MultiAction
컨트롤러는 한개, 여러개의 요청을 메서드로 분리
sixth - forth 컨트롤러 이용
하는데 기본 준비만 하였음
...................................
/SpringWebApp2/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study.myproject</groupId>
<artifactId>SpringWebApp2</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SpringWebApp2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
<build>
<finalName>SpringWebApp2</finalName>
</build>
</project>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>webapp2</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webapp2</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<context:component-scan base-package="controller"></context:component-scan>
<!-- @RequestMapping("/forth.action") 을 쓰면서 다른 anno 명시에 따른 문제를 아래 코드로 해결-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean name="/first.action" class="controller.FirstController"></bean>
<bean name="/second.action" class="controller.SecondController"></bean>
<bean name="/third.action" class="controller.ThirdController">
<!-- 어노테이션으로 변경 -->
<!-- <property name="userDao" ref="userDao"></property> -->
<property name="supportedMethods" value="POST"></property>
</bean>
<bean name="userDao" class="dao.UserDao"></bean>
<!-- @RequestMapping("/forth.action") 을 써서 삭제 -->
<!-- <bean name="/forth.action" class="controller.ForthController"></bean> -->
<bean name="/forth.action" class="controller.ForthController"></bean>
<bean name="/fifth.action" class="controller.ForthController"></bean>
<bean name="/sixth.action" class="controller.ForthController"></bean>
</beans>
...................................
/SpringWebApp2/src/main/webapp/index.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<a href="first.action">첫번째 요청</a>
<br/><br/>
<a href="second.action?param1=food¶m2=fruit">두번째 요청</a>
<br/><br/>
<form action="third.action" method="post">
<input type="text" name="name"/><br/><br/>
<input type="submit" value="세번째 요청"/>
</form>
<br/><br/>
<a href="forth.action">네번째 요청</a>
<br/><br/>
<a href="fifth.action">다섯번째 요청</a>
<br/><br/>
<form action="sixth.action" method="post">
<input type="submit" value="여섯번째 요청(post)"/>
</form>
</body>
</html>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/views/firstResult.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h1>firstResult.jsp</h1>
</body>
</html>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/views/secondResult.jsp
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
<h1>secondResult.jsp</h1>
<h2>전달된 파라미터 값</h2>
param1 : <%=request.getAttribute("p1") %><br/>
param2 : ${p2}<br/>
<br/>
음식리스트<br/>
<ul>
<%
ArrayList foodList = (ArrayList)request.getAttribute("foodList");
if(foodList != null){
for(int i=0;i<foodList.size();i++){
%>
<li><%=foodList.get(i)%></li>
<%
}
}
%>
</ul>
<br/><br/>
과일 목록<br/>
${f1},${f2},${f3}
<br/><br/>
${day[0]},${day[1]},${day[2]}
</body>
</html>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/views/thirdResult.jsp
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
<h1>thirdResult.jsp</h1>
<h2>검색 결과</h2>
이름 : ${item.name}<br/>
나이 : ${item.age}<br/>
점수 : ${item.point}<br/>
<hr/>
<h2>전체 리스트</h2>
<ul>
<c:forEach items="${allItem}" var="item">
<li>
이름 : ${item.name}<br/>
나이 : ${item.age}<br/>
점수 : ${item.point}<br/>
</li>
</c:forEach>
</ul>
</body>
</html>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/views/forthResult.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
<h1>forthResult.jsp</h1>
${msg}
</body>
</html>
...................................
/SpringWebApp2/src/main/java/controller/FirstController.java
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class FirstController implements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
// ModelAndView는 View로 이동과 데이터 전달까지 가능함
ModelAndView mv = new ModelAndView();
mv.setViewName("/WEB-INF/views/firstResult.jsp");
return mv;
}
}
...................................
/SpringWebApp2/src/main/java/controller/SecondController.java
package controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class SecondController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
String param1 = arg0.getParameter("param1");
String param2 = arg0.getParameter("param2");
ArrayList list = new ArrayList();
list.add("삼계탕");
list.add("반계탕");
list.add("추어탕");
list.add("영양탕");
Map map = new HashMap();
map.put("f1", "사과");
map.put("f2", "배");
map.put("f3", "감");
ArrayList list2 = new ArrayList();
list2.add("월요일");
list2.add("화요일");
list2.add("수요일");
Map map2 = new HashMap<String, ArrayList>();
map2.put("day", list2);
ModelAndView mv = new ModelAndView("/WEB-INF/views/secondResult.jsp");
mv.addObject("p1", param1);
mv.addObject("p2", param2);
mv.addObject("foodList", list);
mv.addAllObjects(map);
mv.addAllObjects(map2);
return mv;
}
}
...................................
/SpringWebApp2/src/main/java/controller/ThirdController.java
package controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import dao.UserDao;
import dto.UserDto;
public class ThirdController extends AbstractController {
@Autowired // 여기에 붙이면 setter 역할까지 함
private UserDao userDao;
// @Autowired
// public void setUserDao(UserDao userDao){
// this.userDao = userDao;
// }
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
arg0.setCharacterEncoding("UTF-8");
String name = arg0.getParameter("name");
// DI 패턴 적용
// UserDao dao = new UserDao();
List allDto = userDao.getItems();
UserDto dto = userDao.getItem(name);
ModelAndView mv = new ModelAndView("/WEB-INF/views/thirdResult.jsp");
mv.addObject("item",dto);
mv.addObject("allItem",allDto);
return mv;
}
}
...................................
/SpringWebApp2/src/main/java/controller/ForthController.java
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ForthController {
@RequestMapping("/forth.action")
protected String handle() throws Exception {
return "/WEB-INF/views/forthResult.jsp";
}
@RequestMapping("/fifth.action")
public ModelAndView fifthHandle(){
ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
mv.addObject("msg","다섯번째 요청에 대한 응답입니다.");
return mv;
}
@RequestMapping("/sixth.action")
public ModelAndView sixthHandle(){
ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
mv.addObject("msg","여섯번째 요청에 대한 응답입니다.");
return mv;
}
}
...................................
/SpringWebApp2/src/main/java/dto/UserDto.java
package dto;
public class UserDto {
private String name;
private int age;
private double point;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getPoint() {
return point;
}
public void setPoint(double point) {
this.point = point;
}
}
...................................
/SpringWebApp2/src/main/java/dao/UserDao.java
package dao;
import java.util.ArrayList;
import java.util.List;
import dto.UserDto;
public class UserDao {
private List items = new ArrayList();
private UserDto[] userDto = new UserDto[3];
public UserDao(){
userDto[0] = new UserDto();
userDto[0].setName("홍길동");
userDto[0].setAge(20);
userDto[0].setPoint(3.14);
userDto[1] = new UserDto();
userDto[1].setName("강감찬");
userDto[1].setAge(30);
userDto[1].setPoint(4.1);
userDto[2] = new UserDto();
userDto[2].setName("이순신");
userDto[2].setAge(40);
userDto[2].setPoint(5.1);
items.add(userDto[0]);
items.add(userDto[1]);
items.add(userDto[2]);
}
public UserDto getItem(String name){
for (int i = 0; i < items.size(); i++) {
if(((UserDto)items.get(i)).getName().equals(name)){
return (UserDto)items.get(i);
}
}
return null;
}
public List getItems() {
return items;
}
}
...................................
-----------------------------------
###################################
4. 과제
-----------------------------------
4-1
-----------------------------------
###################################
'OpenFrameWork' 카테고리의 다른 글
오픈프레임워크_Day89 (0) | 2015.07.20 |
---|---|
오픈프레임워크_Day88 (0) | 2015.07.17 |
오픈프레임워크_Day86 (0) | 2015.07.16 |
오픈프레임워크_Day85 (0) | 2015.07.14 |
오픈프레임워크_Day84 (0) | 2015.07.13 |